Skip to main content

Effortless, featureful SMTP

Project description

mailcoil

Mailcoil is a small SMTP wrapper around Python's native functionality that makes several tasks easier, namely constructing mails that contain referenced inline attachments (e.g., images that are referenced from within HTML mail) or signing/encrypting emails via CMS (commonly known as S/MIME).

Usage

For usage of mailcoil you first need to define a dropoff at which mails should be posted. This is typically your MTA or smart relay:

dropoff = mailcoil.MailDropoff(mailcoil.MailDropoff.Scheme.SMTPS, "smtp.my-server.com")

You then can create an email:

mail = mailcoil.Email(from_address = "Johannes Bauer <johannes.bauer@gmx.de>", subject = "What's up?").to("someone@gmx.de")

CC and BCC are also supported using the same syntax as the .to() method:

mail.cc("cc1@gmx.de", "cc2@gmx.de").bcc("bcc@gmx.de")

Emails can use text/plain, text/html, or both bodies:

mail.text = "This is the text content!"
mail.html = "<html><body><h1>Hey!</h1><p>This is the HTML content!</body></html>"

To attach files to this mail, simply you can use the attach method:

mail.attach("foo.jpg")

By default, the Content-Disposition of attachments is "attachment". However, you can also create "inline" attachments that you can then reuse in your HTML portion, e.g.:

src_cid = mail.attach("foo.jpg", inline = True)
mail.html = f"<html><body><h1>Hey!</h1><p>This is the HTML content!<img src='${src_cid}'></body></html>"

By default, the Content-ID is auto-generated, which means that it depends on the number of attachments. If you want fixed CIDs, you can also do that. Note that You are then responsible for not creating collisions in the CIDs:

src_cid = mail.attach("foo.jpg", inline = True, cid = "foobar")
mail.html = f"<html><body><h1>Hey!</h1><p>This is the HTML content!<img src='cid:foobar'></body></html>"

If you wish to sign or encrypt mail using CMS (commonly known as S/MIME), you need to set the security property of your email and configure it properly. For example, for just signing, this works:

mail.security = mailcoil.CMS().sign(signer_keyfile = "my_key.pem", signer_certfile = "my_cert.pem", ca_certfile = "my_ca.pem")

If you additionally want to encrypt for three different targets, you can also do:

mail.security.encrypt("target1.pem", "target2.pem", "target3.pem")

Similarly, you may also only encrypt without signing:

mail.security = mailcoil.CMS().encrypt("target.pem")

When your mail is finally set up, you can drop it off at the previously defined dropoff:

dropoff.post(mail)

A complete example is therefore:

import mailcoil
dropoff = mailcoil.MailDropoff(mailcoil.MailDropoff.Scheme.SMTPS, "smtp.my-server.com")
mail = mailcoil.Email(from_address = "Johannes Bauer <johannes.bauer@gmx.de>", subject = "What's up?").to("someone@gmx.de")
mail.cc("cc1@gmx.de", "cc2@gmx.de").bcc("bcc@gmx.de")
mail.text = "This is the text content!"

# Attach file and use it in HTML portion
src_cid = mail.attach("foo.jpg", inline = True)
mail.html = f"<html><body><h1>Hey!</h1><p>This is the HTML content!<img src='${src_cid}'></body></html>"

# Sign and encrypt
mail.security = mailcoil.CMS().sign(signer_keyfile = "my_key.pem", signer_certfile = "my_cert.pem", ca_certfile = "my_ca.pem").encrypt("target1.pem", "target2.pem", "target3.pem")

dropoff.post(mail)

License

GNU GPL-3.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mailcoil-0.0.1.tar.gz (10.5 kB view details)

Uploaded Source

File details

Details for the file mailcoil-0.0.1.tar.gz.

File metadata

  • Download URL: mailcoil-0.0.1.tar.gz
  • Upload date:
  • Size: 10.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.3

File hashes

Hashes for mailcoil-0.0.1.tar.gz
Algorithm Hash digest
SHA256 e1ef11c0a661a22f59e0cb9f3aa57e3c3afb75677e46ed601271faa70cc52615
MD5 63be73c4ee14c3a24b03f39854e113b3
BLAKE2b-256 bdc9b5f820376584b47aedda390d959367c39887720ef06aaf7b5c332d4c0837

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page