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