Communication Providers
RME is provider-independent. A provider is configuration — a Provider_Config__c record bound to a Named Credential — so you can add, swap, or fail over without touching messaging logic.
Supported providers
| Provider | Channels | Auth | Event delivery |
|---|---|---|---|
| SendGrid | API key (Bearer) | Event Webhook | |
| Amazon SES | SigV4 / IAM role | SNS → HTTPS endpoint | |
| Azure Communication Services | Email, SMS | Entra ID / access key | Event Grid |
| Mailgun | API key (Basic) | Webhooks | |
| Postmark | Server token | Webhooks | |
| SparkPost | API key | Event Webhook | |
| Twilio | SMS, RCS, WhatsApp, Voice | Account SID + token | Status callbacks |
| Future providers | Any | Pluggable | Adapter interface |
Provider configuration reference
provider: SENDGRID
namedCredential: RME_SendGrid
channels: [EMAIL]
priority: 1
failoverProvider: AMAZON_SES
dailyLimit: 500000
ipPool: "transactional"
sandbox: false
Per-provider notes
SendGrid
- Use a dedicated IP pool for transactional traffic and warm it before high volume.
- Create a subuser per environment so sandbox traffic never affects production reputation.
- Enable the Event Webhook with signed event verification.
Amazon SES
- Create a configuration set per environment and attach an SNS event destination.
- Move the account out of the SES sandbox before production.
- Prefer an IAM role with
ses:SendEmailandses:SendRawEmailonly.
Azure Communication Services
- Choose the data-residency region before provisioning; it cannot be changed later.
- Authenticate with Entra ID rather than access keys where possible.
- Route Event Grid events to the RME webhook endpoint.
Mailgun
- Use the EU endpoint (
api.eu.mailgun.net) for EU data residency. - Enable tracking selectively — open tracking rewrites image URLs.
Postmark
- Separate transactional and broadcast message streams.
- Postmark enforces strict content policy; broadcast content on a transactional stream is rejected.
SparkPost
- Use subaccounts to isolate business units.
- Configure bounce domains that match your authenticated sending domain.
Adding a custom provider
Implement the adapter interface and register the class on the provider config.
global interface RME_ProviderAdapter {
RME_SendResult send(RME_OutboundMessage msg, RME_ProviderContext ctx);
RME_NormalizedEvent parseEvent(RestRequest req);
Boolean verifySignature(RestRequest req, String secret);
}
global class AcmeMailAdapter implements RME_ProviderAdapter {
global RME_SendResult send(RME_OutboundMessage msg, RME_ProviderContext ctx) {
HttpRequest req = new HttpRequest();
req.setEndpoint('callout:' + ctx.namedCredential + '/v1/send');
req.setMethod('POST');
req.setHeader('Content-Type', 'application/json');
req.setBody(JSON.serialize(new Map<String, Object>{
'from' => msg.fromAddress,
'to' => msg.toAddress,
'subject' => msg.subject,
'html' => msg.htmlBody
}));
HttpResponse res = new Http().send(req);
return RME_SendResult.fromHttp(res, 'id');
}
// parseEvent + verifySignature omitted for brevity
}
Set Provider__c = CUSTOM and Adapter_Class__c = AcmeMailAdapter on the provider config.
Continue to Enterprise Email.
Was this helpful?
Last updated 1 month ago