uSend Docs
Guides

Bounces and Apple Private Relay

Why mail to Hide My Email addresses can bounce and how to avoid it.

Apple's Sign in with Apple and Hide My Email give a person a random address at privaterelay.appleid.com. Mail sent to it is forwarded by Apple to the person's real inbox. It works only when Apple accepts the message from your sender.

Why they bounce

Apple forwards mail only from sources the app developer has registered. If you send to a relay address without registering your sending domain, Apple rejects the message and it bounces. The failure looks like a permanent error from privaterelay.appleid.com.

Fix

  1. In your Apple Developer account, open Certificates, Identifiers & Profiles, then Services, then Sign in with Apple for Email Communication.
  2. Register your sending domain (the domain in your From address, or every address you send from) and complete the verification Apple asks for. Apple expects SPF or DKIM to pass for the domain; usend signs with DKIM and its return path CNAME provides SPF, so both pass once the domain is verified.
  3. Send from the registered domain. Always send from the same domain you registered.

Registration is done by you in Apple's portal; usend cannot do it for you.

Other tips

  • Mail to relay addresses is one-way. Replies go to Apple's relay, which forwards them to the person's real address, so a plain reply_to works.
  • The person can switch the relay off for your app. After that, mail to that address bounces. usend adds an address that hard-bounces to your suppression list automatically, so you stop sending to it.
  • A bounce with a policy message (rather than "user unknown") does not suppress the address. Read the bounce.message in the event or webhook payload to see Apple's reason.
  • Do not treat a relay address as fake or reject it at your sign-up form: real people use them.
  • Test with your own Apple ID before launch: sign in with Hide My Email, then send a test message to the relay address.

Where to look

In the dashboard, the email's events show the bounce and the server's message. The bounce webhook carries the same bounce.type and bounce.message. See Bounces and suppressions.