Skip to content


Subversion checkout URL

You can clone with
Download ZIP
A quick SMTP client for iOS and Mac OS X
Objective-C C++



JSMailSender is a simple SMTP client for iOS and Mac OS X. If you need to send a quick email or two without activating the iOS mail app, this project should help you out. If you want to create the next great Mail client in IOS, keep looking. Or better yet, fork and extend this project.

See the project page for more information and documentation.


For a while I have been maintaining a fork of the apparently abandoned skpsmtpmessage. Based on the feedback on that project, it still fills a need. I wanted to make the library work better in the background, so I tried to integrate Quinn "The Eskimo!"'s class QRunLoopOperation, which elegantly combines NSRunLoop-based APIs with NSOperations. But I was finding it hard to make changes cleanly, mostly because of the complex conditional code used to manage the state of the SMTP connection. I decided to do away with all the manual condition checking and to use the State Machine Compiler to generate the complex conditions of an SMTP connection. I decided the result was different enough to merit a new project. I hope that by basing the code on a state machine, it will make it easier to accomodate new behaviors from mail server I haven't been able to test against.

Current Status

The project will build and send mail. I am able to send mail using iCloud (, Gmail, and Yahoo! Other mail servers that support PLAIN or LOGIN auth methods should work as well..

Working features

  • Start TLS
  • PLAIN and LOGIN authentication
  • Tested on common mail servers.

Unimplemented or incomplete, but planned

  • No CRAM-MD5 authentication
  • Should be better integrated with the reachability APIs on iOS.
  • Gracefully handle network timeouts.
  • Documentation
  • Better testing

Non Features

  • MIME
  • SMTP Server


Apple DTS in general and Quinn in particular. The QRunLoopOperation class is copied without modifications.


Ian Baird, for sksmtpmessage. Even though I created a new project, I still looked at his code for a sanity check.

Something went wrong with that request. Please try again.