Upyo changelog
Version 0.4.0
Released on December 25, 2025. Happy Holidays!
@upyo/core
Added
idempotencyKeyproperty toMessageinterface. [#16]This allows users to provide their own idempotency key for request deduplication when retrying failed send operations. By including the key in the message itself, retries become simpler—just resend the same message object. If not provided, transports may generate their own key internally (behavior varies by transport implementation).
@upyo/smtp
Added DKIM (DomainKeys Identified Mail) signing support. [#18]
Outgoing emails can now be signed with DKIM for improved deliverability and authentication. The implementation uses the standard Web Crypto API for cross-runtime compatibility (Node.js, Deno, Bun, edge functions).
- Added
DkimConfiginterface for configuring DKIM signing. - Added
DkimSignatureinterface for individual signature settings. - Added
DkimAlgorithmtype supportingrsa-sha256(RFC 6376) anded25519-sha256(RFC 8463). - Added
DkimCanonicalizationtype for header/body canonicalization. - Added
DkimSigningFailureActiontype (throworsend-unsigned). - Supports multiple DKIM signatures per message.
- Configurable failure handling: throw error or send unsigned.
- Accepts both PEM strings and
CryptoKeyobjects for private keys.
- Added
@upyo/jmap
Added JMAP transport for sending emails via JMAP protocol. [#10]
JMAP (JSON Meta Application Protocol) is a modern, efficient protocol for email access and submission, defined in RFC 8620 (core) and RFC 8621 (mail). This transport provides:
- Automatic session discovery and caching
- Automatic identity resolution from sender email
- Bearer token authentication
- Exponential backoff retry with configurable attempts
- Request timeout and
AbortSignalsupport - Text and HTML message content (
multipart/alternative) - Priority headers (
X-Priority,Importance) - Custom headers
- File attachments via blob upload
- Inline attachments (
multipart/related)
@upyo/resend
Added support for user-provided idempotency keys via
Message.idempotencyKey. [#16]Each message can now include an
idempotencyKeyto ensure it is not sent multiple times during retries. For batch operations viasendMany(), the first message's key is used for the entire batch request. If not provided, a unique key is automatically generated for each request.
Version 0.3.4
Released on December 18, 2025.
@upyo/resend
Fixed idempotency key not being sent as an HTTP request header. [#16]
The Resend transport was incorrectly adding the
Idempotency-Keyto the email's custom headers inside the JSON payload, but the Resend API expects it as an HTTP request header. This fix moves the idempotency key to the proper location.
Version 0.3.3
Released on December 13, 2025.
@upyo/core
Fixed a potential SMTP command injection vulnerability.
Email addresses are now validated to prevent newline characters (
\ror\n), which could be used to inject malicious SMTP commands.
Version 0.3.2
Released on December 12, 2025.
@upyo/ses
Fixed headers serialization issue on edge runtimes. [#15]
The SES transport now converts the
Headersobject to a plain object before passing tofetch(), which resolves “Missing Authentication Token” errors on edge runtimes like Bunny CDN Edge that don't properly serializeHeadersobjects.
Version 0.3.1
Released on November 3, 2025.
@upyo/smtp
- Added STARTTLS support for secure connection upgrade. The SMTP transport now automatically detects and uses STARTTLS when connecting to servers that advertise this capability (such as Protonmail, Office 365, and others). This allows using port 587 with
secure: falsefor automatic encryption upgrade. [#14]
Version 0.3.0
Released on September 16, 2025.
@upyo/pool
Added pool transport for combining multiple email providers with load balancing and failover strategies. [#8]
- Added
PoolTransportclass withAsyncDisposablesupport. - Added
PoolConfiginterface. - Added
ResolvedPoolConfigtype. - Added
TransportEntryinterface. - Added
ResolvedTransportEntrytype. - Added
PoolStrategytype for built-in strategies. - Added
Strategyinterface for custom routing logic. - Added
TransportSelectioninterface. - Added
RoundRobinStrategyclass for equal distribution. - Added
WeightedStrategyclass for proportional distribution. - Added
PriorityStrategyclass for failover-based routing. - Added
SelectorBasedStrategyclass for content-based routing. - Support for round-robin, weighted, priority, and selector-based strategies.
- Automatic failover and retry logic with configurable limits.
- Comprehensive error aggregation across multiple providers.
- Added
@upyo/plunk
- Added
PlunkTransportclass. - Added
PlunkConfiginterface. - Added
ResolvedPlunkConfiginterface. - Added
PlunkErrorinterface. - Added
PlunkResponseinterface. - Support for both cloud-hosted and self-hosted Plunk instances.
- Added
@upyo/resend
- Added
ResendTransportclass. - Added
ResendConfiginterface. - Added
ResolvedResendConfiginterface. - Added
ResendApiErrorinterface. - Added
ResendBatchResponseinterface. - Added
ResendErrorinterface. - Added
ResendResponseinterface.
- Added
Version 0.2.4
Released on December 13, 2025.
@upyo/core
Fixed a potential SMTP command injection vulnerability.
Email addresses are now validated to prevent newline characters (
\ror\n), which could be used to inject malicious SMTP commands.
Version 0.2.3
Released on December 12, 2025.
@upyo/ses
Fixed headers serialization issue on edge runtimes. [#15]
The SES transport now converts the
Headersobject to a plain object before passing tofetch(), which resolves “Missing Authentication Token” errors on edge runtimes like Bunny CDN Edge that don't properly serializeHeadersobjects.
Version 0.2.2
Released on November 3, 2025.
@upyo/smtp
- Added STARTTLS support for secure connection upgrade. The SMTP transport now automatically detects and uses STARTTLS when connecting to servers that advertise this capability (such as Protonmail, Office 365, and others). This allows using port 587 with
secure: falsefor automatic encryption upgrade. [#14]
Version 0.2.1
Released on August 4, 2025.
@upyo/smtp
Fixed “Maximum call stack size exceeded” error when sending large attachments. [#6]
The SMTP transport now uses
Buffer.from().toString('base64')instead of the legacybtoa()function for base64 encoding, which resolves stack overflow issues with large attachments (e.g., 500KB+ files).Fixed UTF-8 encoding issue where email addresses were incorrectly encoded in SMTP headers. [#7]
Only display names are now encoded using RFC 2047 encoding, while email addresses remain unencoded. For example,
German ÄÖÜ <info@example.com>now correctly becomes=?UTF-8?B?...?= <info@example.com>instead of encoding the entire string including the email address.
Version 0.2.0
Released on July 17, 2025.
@upyo/core
Improved type safety by making array fields readonly.
- Changed the type of
Message.recipientsproperty fromAddress[]toreadonly Address[]. - Changed the type of
Message.ccRecipientsproperty fromAddress[]toreadonly Address[]. - Changed the type of
Message.bccRecipientsproperty fromAddress[]toreadonly Address[]. - Changed the type of
Message.replyRecipientsproperty fromAddress[]toreadonly Address[]. - Changed the type of
Message.attachmentsproperty fromAttachment[]toreadonly Attachment[]. - Changed the type of
Message.tagsproperty fromstring[]toreadonly string[].
- Changed the type of
Enhanced email address type safety with template literal types.
- Added
EmailAddresstype. - Changed
Address.addressproperty type fromstringtoEmailAddress. - Added
isEmailAddress()type guard function for runtime email validation.
- Added
@upyo/ses
Added Amazon SES transport. [#3]
- Added
SesTransportclass. - Added
SesConfiginterface. - Added
SesAuthenticationinterface.
- Added
@upyo/opentelemetry
Added OpenTelemetry observability support. [#5]
- Added
OpenTelemetryTransportclass. - Added
OpenTelemetryConfiginterface. - Added
ObservabilityConfiginterface. - Added
MetricsConfiginterface. - Added
TracingConfiginterface. - Added
AttributeExtractortype. - Added
ErrorClassifiertype. - Added
createErrorClassifier()function. - Added
defaultErrorClassifier()function. - Added
AutoConfiginterface. - Added
createOpenTelemetryTransport()function. - Added
CreateOpenTelemetryTransportConfiginterface. - Added
createEmailAttributeExtractor()function.
- Added
Version 0.1.2
Released on Nowember 3, 2025.
@upyo/smtp
- Added STARTTLS support for secure connection upgrade. The SMTP transport now automatically detects and uses STARTTLS when connecting to servers that advertise this capability (such as Protonmail, Office 365, and others). This allows using port 587 with
secure: falsefor automatic encryption upgrade. [#14]
Version 0.1.1
Released on July 14, 2025.
@upyo/smtp
- Fixed CJK character encoding corruption in SMTP transport HTML emails. Korean, Japanese, and Chinese characters are now properly encoded using UTF-8 quoted-printable encoding. [#4]
Version 0.1.0
Initial release. Released on July 13, 2025.