Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 14 additions & 1 deletion .github/workflows/main.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,19 @@ concurrency:
cancel-in-progress: true

jobs:
test-edge:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
Comment thread
dahlia marked this conversation as resolved.
with:
persist-credentials: false
- uses: jdx/mise-action@v4
with:
experimental: true
cache: true
cache_key_prefix: mise-v4
- run: mise run test:edge

test-node:
runs-on: ubuntu-latest
env:
Expand Down Expand Up @@ -172,7 +185,7 @@ jobs:

publish:
if: github.event_name == 'push'
needs: [test-node, test-deno, test-bun, check]
needs: [test-node, test-deno, test-bun, test-edge, check]
runs-on: ubuntu-latest
permissions:
contents: read
Expand Down
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ functions. It's structured as a monorepo with multiple packages:
*Repository*: <https://github.com/dahlia/upyo>

- *@upyo/core*: Shared types and interfaces for email messages
- *@upyo/mime*: Portable MIME composition and DKIM signing
Comment thread
dahlia marked this conversation as resolved.
Comment thread
dahlia marked this conversation as resolved.
- *@upyo/smtp*: SMTP transport implementation
- *@upyo/lettermint*: Lettermint transport implementation
- *@upyo/logtape*: LogTape observability transport
Expand Down
21 changes: 20 additions & 1 deletion CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,19 @@ To be released.
[Mailtrap]: https://mailtrap.io/
[#32]: https://github.com/dahlia/upyo/pull/32

### @upyo/mime

- Added *@upyo/mime* with `composeMessage()` for composing replayable MIME
bytes without a transport connection, with optional DKIM signing. Save
the bytes as an *.eml* file or pass the result directly to SMTP or JMAP
`sendRaw()`. The package supports Node.js, Deno, Bun, and edge runtimes
without Node.js compatibility. Address line breaks and invalid custom
header names are rejected even for directly constructed messages.
[[#68], [#74]]

[#68]: https://github.com/dahlia/upyo/issues/68
[#74]: https://github.com/dahlia/upyo/pull/74

### @upyo/opentelemetry

- Fixed the `email.content.type` span attribute and the `content_type` metric
Expand Down Expand Up @@ -341,7 +354,8 @@ To be released.
custom OAuth2 token provider, so cancelled operations release their
connections promptly.
- Added automatic SMTPUTF8 delivery for internationalized sender, recipient,
and reply-to addresses. Servers must advertise `SMTPUTF8` and `8BITMIME`;
and reply-to addresses, as well as internationalized nested MIME and DKIM
headers. Servers must advertise `SMTPUTF8` and `8BITMIME`;
unsupported sends fail without starting a mail transaction. [[#45], [#50]]
- Added incremental SMTP attachment encoding and backpressured DATA writes.
Set `dkim.bodyMode` to `"streaming"` for bounded attachment memory with two
Expand Down Expand Up @@ -402,6 +416,11 @@ To be released.
465 uses implicit TLS; all other ports start with plaintext and upgrade with
STARTTLS when advertised. Set `secure: true` explicitly to use implicit
TLS on a nonstandard port. [[#53], [#55]]
- Fixed quoted-printable encoding of CRLF, isolated line endings, trailing
spaces, and long lines so messages preserve their text and respect MIME
line limits. Inline Content-ID headers now reject values that cannot fit
the RFC 5322 line limit. Directly constructed messages now reject address
line breaks and invalid custom header names. [[#68], [#74]]

[#42]: https://github.com/dahlia/upyo/issues/42
[#43]: https://github.com/dahlia/upyo/issues/43
Expand Down
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ sending messages. The following is a list of the available packages:
| Package | JSR | npm | Description |
| ----------------------------------------------- | ------------------------------ | ------------------------------ | -------------------------------------------------- |
| [@upyo/core](/packages/core/) | [JSR][jsr:@upyo/core] | [npm][npm:@upyo/core] | Shared types and interfaces for email messages |
| [@upyo/mime](/packages/mime/) | [JSR][jsr:@upyo/mime] | [npm][npm:@upyo/mime] | Portable MIME composition and DKIM signing |
| [@upyo/smtp](/packages/smtp/) | [JSR][jsr:@upyo/smtp] | [npm][npm:@upyo/smtp] | SMTP transport |
| [@upyo/jmap](/packages/jmap/) | [JSR][jsr:@upyo/jmap] | [npm][npm:@upyo/jmap] | [JMAP] transport (RFC 8620/8621) |
| [@upyo/lettermint](/packages/lettermint/) | [JSR][jsr:@upyo/lettermint] | [npm][npm:@upyo/lettermint] | [Lettermint] transport |
Expand All @@ -84,6 +85,8 @@ sending messages. The following is a list of the available packages:

[jsr:@upyo/core]: https://jsr.io/@upyo/core
[npm:@upyo/core]: https://www.npmjs.com/package/@upyo/core
[jsr:@upyo/mime]: https://jsr.io/@upyo/mime
[npm:@upyo/mime]: https://www.npmjs.com/package/@upyo/mime
[jsr:@upyo/smtp]: https://jsr.io/@upyo/smtp
[npm:@upyo/smtp]: https://www.npmjs.com/package/@upyo/smtp
[jsr:@upyo/jmap]: https://jsr.io/@upyo/jmap
Expand Down
12 changes: 12 additions & 0 deletions changes.d/mime/mime-composition.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
links:
'#68': https://github.com/dahlia/upyo/issues/68
'#74': https://github.com/dahlia/upyo/pull/74
---
- Added *@upyo/mime* with `composeMessage()` for composing replayable MIME
bytes without a transport connection, with optional DKIM signing. Save
the bytes as an *.eml* file or pass the result directly to SMTP or JMAP
`sendRaw()`. The package supports Node.js, Deno, Bun, and edge runtimes
without Node.js compatibility. Address line breaks and invalid custom
header names are rejected even for directly constructed messages.
[[#68], [#74]]
10 changes: 10 additions & 0 deletions changes.d/smtp/mime-line-encoding.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
links:
'#68': https://github.com/dahlia/upyo/issues/68
'#74': https://github.com/dahlia/upyo/pull/74
---
- Fixed quoted-printable encoding of CRLF, isolated line endings, trailing
spaces, and long lines so messages preserve their text and respect MIME
line limits. Inline Content-ID headers now reject values that cannot fit
the RFC 5322 line limit. Directly constructed messages now reject address
line breaks and invalid custom header names. [[#68], [#74]]
3 changes: 2 additions & 1 deletion changes.d/smtp/smtputf8.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,6 @@ links:
'#50': https://github.com/dahlia/upyo/pull/50
---
- Added automatic SMTPUTF8 delivery for internationalized sender, recipient,
and reply-to addresses. Servers must advertise `SMTPUTF8` and `8BITMIME`;
and reply-to addresses, as well as internationalized nested MIME and DKIM
headers. Servers must advertise `SMTPUTF8` and `8BITMIME`;
unsupported sends fail without starting a mail transaction. [[#45], [#50]]
Loading
Loading