A Walk Through Swiftmailer Transport AWS SES

October 26, 2011

A Problem

“@jmhobbs thanks for your amazonses swiftmailer integration. it works. can’t understand your code tho. way over my head.”

@rrcatto

“@rrcatto no problem! Neither can I sometimes. :-)”

@jmhobbs

After this exchange, I thought I would dig back into this project and outline how it works.

Three Core Classes

There are really only two classes in play with this project. The first is Swift_AWSInputByteStream, the second is the transport itself, Swift_AWSTransport. The third, and possibly the most confusing, is ChunkedTransferSocket.

So let’s got over each of them.

Swift_AWSInputByteStream

The purpose of this class is to write out the contents of the message to the provided socket. We have this special class for AWS because the documentation specifies that the message data should be Base64 encoded. One side effect of Base64 is padding on encoding. Because of this, we buffer any excess bytes and encode only on multiples of 3 bytes received.

Here is a documented version of the core function, write:

Swift_AWSTransport

This class provides the transport for Swiftmailer. It sets up the socket, takes a message, and sends it off to AWS. The core functionality is in _doSend. This function is documented below. I’m not detailing much here, because it’s mostly glue code.

Okay, not simple, but fairly straightforward.

ChunkedTransferSocket

This class makes an HTTP request direct on the socket. Since we don’t know the message size before encoding, and it’s memory intensive to encode, buffer, and then send, we do a chunked transfer encoding POST.

It’s actually pretty easy. You send some headers, and then every time you have a chunk to write, you preface it with the number of bytes you are sending before you send them.

Here’s the code for the write function:

Pretty simple once you understand how chunked transfer works. The rest of the class is just state keeping.

Conclusion

So, that’s that. Nothing really deep in there, just a collection of fairly simple methods that, glued together, send email to AWS SES.

Hit me up with any questions in the comments section if you have them.

Categories: Geek
Tags: , , , ,

Comments

  1. Rado says:

    Hello. I see that you integrated Swiftmailer with AWS. I was wondering if it is possible to enlighten me on how to implement it with simple REST email send with Google App engine, like this:

    http://gaejexperiments.appspot.com/gaejemail?email_to=%5BYourEmailId%5D&email_subject=%5BEmailSubject%5D&email_body=%5BEmailBody%5D

    Thanks in advance.

  2. john says:

    @Rado – That should be pretty easy. You just need to implement a transport that makes a curl call to the service.

    Take a look at this Postmark transport which does essentially that:

    https://github.com/gunderwonder/postmark-swiftmailer/blob/master/postmark_swiftmailer.php

  3. erich says:

    john, trying to see if this is actual an SMTP transfer or direct Amazon SES HTTP request. Can you help?

  4. John Hobbs says:

    @erich Yep, this uses the SES API, not SMTP.

Leave A Comment

Your email will not be published.