Real Messaging Engine

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

ProviderChannelsAuthEvent delivery
SendGridEmailAPI key (Bearer)Event Webhook
Amazon SESEmailSigV4 / IAM roleSNS → HTTPS endpoint
Azure Communication ServicesEmail, SMSEntra ID / access keyEvent Grid
MailgunEmailAPI key (Basic)Webhooks
PostmarkEmailServer tokenWebhooks
SparkPostEmailAPI keyEvent Webhook
TwilioSMS, RCS, WhatsApp, VoiceAccount SID + tokenStatus callbacks
Future providersAnyPluggableAdapter 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:SendEmail and ses:SendRawEmail only.

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