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.

lamp_scaler
  • 577
  • 1
  • 6
  • 18

3 Answers3

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.

Alien Life Form
  • 2,309
  • 2
  • 21
  • 32
  • 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? – lamp_scaler Oct 04 '11 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. – Abhishek Dujari Oct 04 '11 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 (http://www.postfix.org/postconf.5.html#relayhost) to your provider. – Gerald Combs Oct 04 '11 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 04 '11 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? – lamp_scaler Oct 04 '11 at 16:01
  • /var/log/maillog is your friend. Most MTAs mentioned in the thread log there (syslog does the actual logging, but I'm nitpicking). SvenW mentions nullmailer, but that one -AFAIK- does not include the relay logic and it will hang just as direct delivery does. – Alien Life Form Oct 04 '11 at 16:11
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

mailq
  • 17,023
  • 2
  • 37
  • 69
-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.

pawpro
  • 1