1

When users sign up to my site, the connection from my server to our 3rd-party SMTP provider is very bad and the app takes from a few seconds to a few minutes to connect. While it is trying to connect and send, users are forced to wait there and sometimes they would just give up and leave the site.

This is horrible user experience. What is a good way to make this seem instantaneous (having to host our own mailserver is not an option at this point)? Some way to execute this in the background? Maybe using some type of queuing mechanism?

I'm using the LNAMP stack on a CentOS 5 x64 machine. App is using CodeIgniter.

EDIT:

It seems using a local mailserver to use as a relay is a common solution. But how does one log or track whether or not email was delivered correctly by using this method?

Sidenote: Some ESPs provide a REST API for email delivery (ours do too). We currently use SMTP and not their REST API.

3 Answers 3

1

You can use Postfix as a nullmailer (relay only to ISP). This is nothing more than a four-liner:

main.cf

myorigin = $mydomain
relayhost = $mydomain
inet_interfaces = loopback-only
local_transport = error:local delivery is disabled

Reference: http://www.postfix.org/STANDARD_CONFIGURATION_README.html#null_client

4

Run a local sendmail/qmail/postfix - whatever, set the smtp server to localhost. The local MTA will queue and deliver when it can (right away or at the next queue run).

On your system:

# yum -y install sendmail
# chkconfig sendmail on
# service sendmail start

shoudl suffice.

I know bubke about CodeIgniter, so I cant help you there.

6
  • using our own mailserver is not an option right now. BUT is it possible to use postfix/sendmail as a middle-man to relay the request to the 3rd-party SMTP service? If so, how well does it handle queuing and stuff if the connection take a long time? Oct 4, 2011 at 15:49
  • I think you are right lamp_Scaler about using mail server as the middle man. Atleast the user experience is instantaneous. As to why connection is taking so long maybe your provider is at fault here. I suggest switching providers if possible or to pose this issue to them in their tech support. Oct 4, 2011 at 15:53
  • 1
    @lamp_scaler It's definitely possible to use Postfix, Sendmail, or any other MTA worth its salt. With Postfix you'd just set relayhost (postfix.org/postconf.5.html#relayhost) to your provider. Oct 4, 2011 at 15:56
  • 3
    A relay-only mail server is a very common configuration and can be done with about every SMTP server. The likes of Postfix/Sendmail/Exim are a little bit of overkill though (IMHO), but there are specialized relay-only servers available (like nullmailer). Anyway, they handle the queuing etc. all alone, you just drop your mails to the queue and they do the rest (but your app will not know if the delivery ultimately failed).
    – Sven
    Oct 4, 2011 at 15:57
  • Yea...My app actually keeps a log if a connection or sending failed through my ESP. But with the relay, is there a way to capture failure events and log them? Oct 4, 2011 at 16:01
-3

Not sure how common it (good practise) is but sending an email is a typical asynchronous process. One that can take several seconds and beyond. This makes it a perfect candidate for the use of messaging queue.

The delivery method is of secondary importance but third party providers such as SendGrid (for transactional emails - forgotten password, invoice etc) or MailChimp (for newsletters and marketing) offer good value and has proven reliable.

By messaging queue I mean RabbitMQ (AMQ), ZeroMQ, Gearman, AWS SQS etc Those can be used for any sort of information exchange between applications. In this case it's an information that certain email needs sending.

In terms of delivery information this can be obtained through an API with such provider or with more expensive plans through callback.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .