SMTPUTF8 and International Email Addresses: A Practical Guide
A practical SMTPUTF8 guide for accepting, storing, sending to, and troubleshooting international email addresses without confusing Unicode local parts with IDN domains.
Overview
SMTPUTF8 is the SMTP extension that permits internationalized mailbox addresses and messages requiring UTF-8 header support. An address such as 用户@例子.公司 can contain non-ASCII characters on both sides of the at sign. That is different from an ASCII local part on an internationalized domain: the domain can often be represented as an IDNA A-label, while a non-ASCII local part cannot be made SMTP-compatible by applying Punycode to the whole address.
Supporting these addresses is a delivery-path decision, not just a form-validation change. Your application, database, email composer, submission provider, relays, bounce processing, inbound parser, and downstream identity integrations all need compatible behavior. If the next SMTP server does not advertise SMTPUTF8, RFC 6531 says an SMTPUTF8-aware client must not send the internationalized message to it.
Separate the local part from the domain before transforming anything
Split an address at the syntactically valid mailbox boundary using an email-address parser, not the first or last at sign in an arbitrary string. The domain participates in DNS and can have a Unicode U-label form and an ASCII-compatible A-label form under IDNA. The local part belongs to the mailbox provider. SMTPUTF8 extends it to permit non-ASCII characters, but it does not turn the local part into an IDN and does not authorize a client to Punycode it.
Keep a display form for the user and derive a domain lookup form through a maintained IDNA library. Do not invent a supposedly equivalent ASCII local part, strip accents, or transliterate characters: that can silently address a different mailbox. Also avoid unconditional lowercasing of the full address. Domain comparison is case-insensitive, but applications should preserve the local part unless the responsible mailbox provider has supplied a stronger canonicalization rule.
- Use separate fields for address data and display names
- Reject control characters and header injection before composition
- Preserve the exact accepted address for confirmation and support
- Do not claim that converting the domain creates an ASCII fallback for a Unicode local part
| Address component | Safe handling | Unsafe shortcut |
|---|---|---|
| Local part | Preserve Unicode and provider-defined identity | Punycode, transliterate, or strip characters |
| Domain | Process with a maintained IDNA/DNS library | Treat Unicode display text as an unvalidated DNS key |
| Full address | Store the accepted original plus deliberate derived fields | Lowercase and rewrite the entire string blindly |
| Display name | Parse and encode as a message-header field | Concatenate user input into a raw From or To line |
Negotiate SMTPUTF8 across the actual delivery path
An SMTP client learns support from the server's EHLO response. RFC 6531 defines SMTPUTF8 as the extension keyword and the SMTPUTF8 parameter on MAIL. When a transaction requires the extension, the client must request it; a library should not merely emit UTF-8 bytes and hope every relay accepts them. A provider API may hide that conversation, so its documented and observed behavior becomes part of your contract.
Test more than the first submission hop. Your API provider may accept the address but later route through a system without the capability, reject a recipient asynchronously, or expose internationalized data incorrectly in a webhook. Inbound replies, forwarding, mailing lists, delivery-status notifications, and support exports are separate paths. Record which paths are supported instead of applying one global 'Unicode enabled' flag.
- Determine whether the envelope sender, any envelope recipient, or message headers require SMTPUTF8.
- Confirm that the submission service or SMTP server explicitly supports internationalized email.
- Submit with a maintained library that negotiates SMTPUTF8 and serializes UTF-8 headers correctly.
- Capture synchronous acceptance and recipient-level asynchronous events.
- Round-trip a reply and a delivery failure through production-like inbound processing.
- Document unsupported routes and prevent them before a user depends on delivery.
| Path | Capability question | Evidence |
|---|---|---|
| Application to provider | Does submission accept and preserve the address? | API response or SMTP transcript |
| Provider to recipient | Can the outbound route deliver with SMTPUTF8? | Recipient event and received source |
| Bounce path | Can status data represent the original address? | Parsed DSN or authenticated webhook |
| Reply path | Can inbound parsing and threading preserve it? | Round-trip reply fixture |
| Exports/integrations | Do downstream systems retain Unicode safely? | Import-export and API contract tests |
Build a Unicode-aware address data model
Validation should answer staged questions. Is the input structurally a mailbox? Is its Unicode well formed? Can the domain be processed for DNS? Does your chosen sending path support the required capabilities? Does the recipient domain appear deliverable under the checks your workflow normally performs? One giant regular expression cannot answer all of these, and an SMTP probe is not proof that a mailbox belongs to the user.
Store strings in Unicode-capable columns without lossy conversions. Keep the original accepted address, parsed local part, normalized domain lookup form, and any provider recipient identifier in explicit fields. RFC 6532 recommends NFC for UTF-8 header content, but normalization is not permission to guess mailbox equivalence. Apply a documented normalization step at a controlled boundary, preserve the original, and test visually similar and canonically equivalent input rather than deduplicating on appearance.
- Do not use byte length when the product limit is defined in characters—or vice versa
- Test database indexes, queue payloads, logs, CSV exports, and webhook signatures with UTF-8 fixtures
- Avoid logging full addresses when a redacted stable identifier answers the operational question
- Verify ownership with a confirmation flow rather than syntax alone
| Field | Purpose | Rule |
|---|---|---|
| address_original | User confirmation, display, and support | Preserve the accepted value |
| local_part | Mailbox identity | Unicode-capable; no invented ASCII alias |
| domain_unicode | Human-readable domain form | Validate with the chosen IDNA policy |
| domain_ascii | DNS lookup and compatibility form | Derive with a maintained IDNA library |
| provider_recipient_id | Event correlation | Treat as provider data, not address identity |
Choose an honest fallback instead of silently rewriting the address
The cleanest fallback is an alternate ASCII address that the user or mailbox provider explicitly supplies. It is not a transliteration generated by your application. If your provider or a required downstream system cannot support the internationalized mailbox, explain the limitation before accepting it for login, billing, password recovery, or another critical workflow.
Separate product acceptance from send eligibility. A CRM may retain an internationalized contact even while a particular campaign route cannot send to it. Mark the route as unsupported with a reason code, keep the contact out of retry loops, and allow a verified alternate address to be attached deliberately. Never classify capability failure as a hard bounce from the recipient and never suppress a mailbox globally because your own route lacked SMTPUTF8.
- Make fallback consent explicit
- Show which address receives security and billing messages
- Keep provider capability errors distinct from recipient delivery errors
- Offer support a safe way to inspect parsed components and route decisions
| Situation | Recommended decision | Avoid |
|---|---|---|
| Full path supports SMTPUTF8 | Accept, verify, send, and monitor | Assuming support without a round trip |
| User provides a verified ASCII alternate | Store both with explicit roles | Replacing the primary address invisibly |
| Critical route lacks support | Block that route with a clear explanation | Accepting it and failing after signup |
| Temporary provider uncertainty | Quarantine or retry only after capability is established | Repeated blind submission |
| Your route rejects the address | Record capability failure separately | Global hard-bounce suppression |
Use a fixture matrix that exercises identity and transport
Create controlled fixtures rather than testing with arbitrary addresses found online. Include an ASCII local part and ASCII domain, an ASCII local part with an internationalized domain, a non-ASCII local part with an ASCII domain, both sides internationalized, combining characters, a long display name, plus malformed and control-character cases. Provision only addresses you own or use a provider-supported test environment.
For each accepted fixture, test signup or import, confirmation, storage, queue serialization, provider submission, delivered headers, click or delivery webhooks if enabled, reply ingestion, bounce handling, export, re-import, search, masking, and deletion. Compare code points or escaped representations in diagnostics when two strings look alike. The goal is not merely 'the email arrived'; it is that the same intended identity survives every system boundary.
- Include mixed-script and lookalike cases in security review
- Render confirmation screens so users can spot a mistaken address
- Retest when changing the address parser, IDNA library, provider, queue, or identity system
- Never place real customer addresses in reusable test fixtures
- List every boundary that reads, transforms, signs, stores, or displays an address.
- Create positive and negative fixtures for each address-component combination.
- Assert parsed components and derived domain forms before sending.
- Send through the production-like route and inspect the received raw source.
- Exercise replies, bounces, duplicate events, exports, and account recovery.
- Record unsupported combinations as product requirements, not undocumented bugs.
Make international address support an explicit service contract
Publish the real support boundary internally: accepted scripts and syntax policy, parser and IDNA versions, provider capability, supported inbound paths, fallback behavior, and which products can use an internationalized address. Add a capability-specific failure code and dashboard dimension so support can distinguish malformed input, unsupported transport, provider rejection, and recipient-domain failure.
Mailbase's relevant role is the workflow layer around the send: contact and campaign data, durable jobs, provider events, suppressions, and reply handling. The connected delivery provider still determines SMTPUTF8 transport support. Before using an internationalized address in a Mailbase workflow, verify the configured sending and inbound paths end to end; do not infer capability from Mailbase accepting Unicode text in a contact or template field.
- Expose capability separately for each configured sending route
- Preserve provider diagnostics without exposing addresses broadly
- Alert on a rise in unsupported-address failures after dependency changes
- Review internationalized-address support before promising global account recovery
| Owner | Responsibility | Evidence |
|---|---|---|
| Identity/product | Acceptance, confirmation, alternate-address policy | User-facing flow tests |
| Application | Parsing, storage, comparison, and safe composition | Unicode fixture suite |
| Provider/transport | SMTPUTF8 negotiation and recipient delivery | Capability docs, transcript, and round trip |
| Email operations | Events, replies, bounces, and failure classification | Recipient timeline and runbook |
| Security/privacy | Lookalike risk, logs, retention, and access | Threat review and redaction tests |
Common Mistakes
- Choosing a tool before deciding who owns deliverability.
- Treating DNS authentication as a one-time checkbox instead of an operating baseline.
- Mixing product-critical transactional email with experimental marketing sends, with no clear boundary.
- Trusting headline metrics (like open rate) that privacy proxies now inflate.
Sources & Further Reading
Official docs for current setup details, pricing, and API behavior — verify specifics there, since they change.
Related guides
More on smtputf8 international email addresses and the surrounding email infrastructure workflow:
FAQ
What is SMTPUTF8?
SMTPUTF8 is the SMTP extension defined by RFC 6531 for transactions involving internationalized mailbox addresses or messages that require UTF-8 header support. A client discovers it in the server's EHLO response and requests it on the MAIL command when required.
Can an email address contain Unicode characters before the at sign?
Yes, when the delivery path supports internationalized email and SMTPUTF8. The non-ASCII local part is controlled by the mailbox provider; applications must not Punycode or transliterate it into a guessed ASCII mailbox.
Is Punycode enough to support an international email address?
No. IDNA can represent an internationalized domain in an ASCII-compatible A-label form, but that only addresses the domain side. A non-ASCII local part still requires SMTPUTF8 support across the relevant transport path.
What should happen if the receiving server does not support SMTPUTF8?
Do not send an internationalized message to that server. Use an alternate ASCII address only if the user or mailbox provider explicitly supplied and verified it, or explain that the route is unsupported. Do not silently transliterate the mailbox.
Should email addresses be normalized and lowercased?
Process the domain with a defined IDNA policy and preserve the original accepted address. Do not blindly lowercase or rewrite the full mailbox. Any local-part canonicalization should come from the responsible mailbox provider, while Unicode normalization must be deliberate, tested, and non-lossy.