Revision history for Perl module Mail::Make

v0.22.0 2026-03-18T09:12:20+0900
    - Mail::Make::build(): added 'attach' parameter supporting a single
      file path, an arrayref of file paths, an arrayref of hash references,
      or a mix of both; each element is forwarded to attach()

v0.21.3 2026-03-18T07:32:47+0900
    - Mail::Make::Entity::build(): added 'attach' shorthand key; a plain
      scalar or stringifiable object that resolves to an existing file is
      automatically promoted to path => $f; filename is derived from the
      basename of the path, and the MIME type is auto-detected via
      Module::Generic::File::Magic when 'path' or 'attach' is provided
      and 'type' is not explicitly specified

0.21.2 2026-03-17T07:13:10+0900
    - attach() and attach_inline(): added positional shorthand support;
      a leading plain scalar or stringifiable object that resolves to an
      existing file is now automatically promoted to path => $f, with
      type and filename detected from the file itself

v0.21.1 2026-03-12T23:55:40+0900
    - Improved documentation
    - Correction in Mail::Make::Body::InCore open method
    - Added the method return_path in Mail::Make

v0.21.0 2026-03-07T03:04:20+0900
    - 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
