8 releases (breaking)

0.8.0 Jul 27, 2022
0.7.0 Feb 16, 2020
0.6.0 Mar 29, 2019
0.5.0 Jun 27, 2018
0.1.1 Dec 7, 2016

#130 in Email

MIT/Apache

64KB
1.5K SLoC

Mailstrom

Documentation

Mailstrom is a rust library that handles email delivery for rust programs in a background worker thread. It does the following:

  • Accepts an email from the caller and then does everything necessary to get it delivered to all recipients without blocking the caller.
  • Allows the caller to query the status of an earlier submitted email at any time, to determine if it is Queued, Delivered, Deferred, or has Failed, with details as to why, on a per-recipient basis.
  • Handles all parsing, validation, and encoding of email content and headers, in compliance with RFC 5322 (and other RFCs). Uses the email-format library for this.
  • Either delivers via a configured SMTP relay, or directly to recipient mail servers by looking up the DNS MX record for each recipient and delivering directly to those Internet mail servers over SMTP. Uses the trust-dns library for DNS lookups.
  • SMTP transport "heavy lifting" is performed via the lettre library. Uses STARTTLS where available.
  • Retries with exponential backoff for a fixed number of retries (currently fixed at 3), when the send result is Deferred
  • Uses a pluggable user-defined state management (persistence) layer.

Limitations

  • The email-format crate is somewhat incomplete and clunky still. It doesn't incorporate RFC 6854 (updated From and Sender syntax) yet. It defines types one-to-one with ABNF parsing units, rather than as semantic units of meaning. And it doesn't let you use obvious types yet like setting the date from a DateTime type. However, these issues will be worked out in the near future.

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

How to avoid having your emails tagged as Spam

Mailstrom does its part to help get your emails delivered, by being compliant with RFC5322 and including a Message-Id header in every email.

You are responsible for the lion's share of the work in this regard. This link at Gmail support is quite helpful. Also,

  • Use a consistent IP address for sending.
  • If possible, have the reverse DNS of your IP address point to the domain name you are sending emails from. For gmail, this is absolutely required when sending over IPv6
  • Use a consistent helo name when sending
  • Use a consistent From email address
  • Publish an SPF TXT record, or better yet, sign email messages with DKIM with a key of at least 1024 bits
  • Publish a DMARC policy
  • Don't send spammy content. Don't send phishing content. Subject should be relevant to body.
  • Allow your users to unsubscribe, either by replying or via a link. Preferably provide a "List-Unsubscribe" email header pointing to the unsubscribe URL.
  • Automatically unsubscribe users who's address bounces mulitple pieces of mail.
  • If bulk, must have a "Precedence: bulk" header field
  • Separate promotional emails from transactional emails via separate from addresses, or even separate IP addresses and sending domains. If your promotional materials become classified as spam, at least the transactional emails will still get delivered.

Dependencies

~12–22MB
~330K SLoC