Changes for version v0.21.0 - 2026-03-07
- Initial public release on CPAN
- Core features
- Fluent API for constructing MIME email messages (plain text, HTML, multipart/alternative, multipart/mixed, inline attachments)
- Mail::Make::Entity: full MIME entity model with streaming serialisation via Mail::Make::Stream, Mail::Make::Stream::Base64, and Mail::Make::Stream::QuotedPrint
- Mail::Make::Headers and subclasses: typed header objects for Content-Type (with parameter handling and RFC 2231 encoding), Content-Transfer-Encoding, Content-Disposition, Subject (RFC 2047 encoded-word), and Message-ID (UUID-based generation)
- Mail::Make::Body::InCore and Mail::Make::Body::File: transparent in-memory and on-disk body storage; large attachments never loaded into RAM unless explicitly requested
- Configurable memory threshold (max_body_in_memory_size) and explicit use_temp_file option for streaming large messages
- Entity::length() mirrors print() without buffering the entire message
- Headers::as_string() with RFC 2822 field ordering and line folding
- SMTP delivery (smtpsend)
- Net::SMTP integration with plain TCP, SSL/TLS, and STARTTLS support
- SASL authentication (PLAIN/LOGIN preferred, DIGEST-MD5/CRAM-MD5 intentionally excluded as deprecated); Authen::SASL used directly to avoid mechanism negotiation pitfalls
- Passphrase supplied as string or CODE reference
- Bcc stripping from the transmitted copy
- Recipient validation and credential checks before opening the network connection
- OpenPGP (Mail::Make::GPG, RFC 3156)
- gpg_sign(): multipart/signed with detached armoured signature; configurable digest algorithm (default SHA-256, SHA-512 tested)
- gpg_encrypt(): multipart/encrypted (RFC 3156 §4)
- gpg_sign_encrypt(): inline sign-then-encrypt
- Passphrase supplied as string, CODE reference, or undef (gpg-agent)
- Optional public-key auto-fetch from keyserver
- Requires IPC::Run and File::Which; gpg binary located automatically (gpg2 preferred, gpg fallback) or specified explicitly via GpgBin
- RFC 3156 §5.1 compliance: Part 1 of multipart/signed carries only Content-* headers; RFC 2822 envelope fields (From, To, Subject, Date, Message-ID) appear solely on the outer wrapper
- Signature verified correct by Thunderbird (SHA-256 and SHA-512), Enigmail, and gpg --verify against all four structural variants: sign-only, sign SHA-512, encrypt-only, sign+encrypt
Modules
APR::Const-like constants for MM::Table
Pure-Perl mimic of APR::Table (multi-valued, case-insensitive table)
Strict, Fluent MIME Email Builder
MIME Body Base Class for Mail::Make
On-Disk Body for Mail::Make
In-Memory Body for Mail::Make
MIME Part Builder for Mail::Make
Mail::Make Exception Class
OpenPGP signing and encryption for Mail::Make
Mail Header Collection for Mail::Make
Content-Disposition Header Field Object
Typed Content-Transfer-Encoding Header for Mail::Make
Content-Type Header Field Object
Base Class for Mail::Make Header Objects
Typed Message-ID Header for Mail::Make
RFC 2047 Aware Subject Header for Mail::Make
S/MIME signing and encryption for Mail::Make (RFC 5751)
Stream Infrastructure for Mail::Make Encoders
Streaming Base64 Encoder/Decoder for Mail::Make
Streaming Quoted-Printable Encoder/Decoder for Mail::Make
Provides
in lib/MM/Table.pm