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). It also has support for IMAP so that sent mails can be stored in a "Sent" folder using the same mechanism as sending them through SMTP.
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
File details
Details for the file mailcoil-0.0.2.tar.gz.
File metadata
- Download URL: mailcoil-0.0.2.tar.gz
- Upload date:
- Size: 11.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
da131447b4492756e64bb3553ef43869b310035be176c5910856abc73fcc0607
|
|
| MD5 |
5a1d7ff8d066bcecaf5d5d94dc7db299
|
|
| BLAKE2b-256 |
11aaf25d8a0a52d31490c2308a83725888076e0c401c995b2b01b32a9359ebad
|