Verhoogde snelheid versturen e-mail met Invantive UniversalSQL mail driver

Invantive UniversalSQL biedt een aantal serviceproviders, waaronder “Os”, “DataDictionary”, “Outlook” (indien Outlook geopend is) en “Mail”.

Met de mail driver is het mogelijk vanuit SQL om e-mails te versturen naar meerdere ontvangers, met of zonder bijlagen. De data kan afkomstig zijn uit elke ondersteunde database zoals SQL Server, Oracle, Exact Online, Yuki of Salesforce. De data in het mailbericht kan ook afkomstig zijn uit een andere serviceprovider zoals onderstaand voorbeeld met het sturen van e-mails op basis van het bestandssysteem laat zien.

E-mail vanuit SQL sturen

Het verzenden van e-mails vanuit SQL-statements gebeurt door een SQL insert op de tabel smtp@mail.

De e-mails worden achtereenvolgens verzonden via een SMTP-server door de “mail” driver. Afhankelijk van de boolean waarde van de kolom failOnError wordt bij een foutmelding het verzenden meteen afgebroken of dit alleen geregistreerd. Na afloop van het insert-statement is in de tabel smtp@mail via een SQL select op te vragen welke e-mails hoe verwerkt zijn door de SMTP-server.

Het sturen van e-mail met een SQL-statement ziet er bijvoorbeeld als volgt uit voor het sturen van een mail per plaatje in een map:

insert into smtp@mail
( toEmail
, ccEmail
, bccEmail
, subject
, body
, attachment1Contents
, attachment1Name
, attachment1MimeType
)
select 'myrecipient@acme.com'
       toEmail
,      cast(null as varchar2)
       ccEmail
,      cast(null as varchar2)
       bccEmail
,      'The subject'
       subject
,      'The body in HTML or text.'
       body
,      rfe.file_contents
       attachment1Contents
,      basename(fle.file_path)
       attachment1Name
,      cast(null as varchar2)
       attachment1MimeType
from   files('c:\temp', '*.png', true)@os fle
join   read_file(fle.file_path)@os rfe

E-mail Verwerking Instellen

In het algemeen worden zaken zoals de e-mailverwerkende server en het mailformaat van te voren ingesteld met SQL set-statements zoals:

set smtp-minimum-deliver-duration-ms@mail 1000;
set smtp-host-address@mail "email-smtp.google.com";
set smtp-user-name@mail "my-email-log-on-code";
set smtp-password@mail "secret";
set [mail-from-name]@mail "Your Sender";
set [mail-from-email]@mail "sender@acme.com";
set [mail-body-html]@mail false;
set smtp-enable-ssl@mail true;

Sneller e-mails sturen met parallel verzenden

Echter, bij het verzenden van honderden of meer e-mails met bijlages is de verzendsnelheid laag. Het is niet ongebruikelijk dat het verwerken van elke individuele e-mail meerdere seconden duurt. Sommige e-mailverwerkers bieden daarom de mogelijkheid om e-mails parallel aan te bieden, zodat de doorvoersnelheid hoger wordt. Het maximum wordt dan alleen nog beperkt op basis van het maximum aantal e-mails per seconde, bijvoorbeeld 50 e-mails per seconde.

Ten opzichte van 1 e-mail per vijf seconden naar 50 e-mails per seconde levert het parallel verzenden van e-mails een enorme snelheidswinst op.

Invantive UniversalSQL biedt vanaf versie 20.2.200 het parallel sturen van e-mails.

Om e-mails parallel te versturen vanuit SQL is het nodig om drie zaken aan te passen in het SQL-script:

  • Wissel de modus van insert in bulk insert.
  • Stel de maximale mate van parallellisme in via set smtp-max-parallel 32 (standaardwaarde 32 parallelle verwerkingen)
  • Stel de minimale afleverduur per parallelle verwerking in via set smtp-minimum-deliver-duration-ms@mail 500 (geen standaardwaarde)

Uitgaande van het voorbeeld met maximaal 50 e-mails per seconde en een reguliere afleverduur van 5 seconden per e-mail, krijg je dan de volgende instellingen:

  • Mate van parallellisme 250 (50 maximum / 0.2 e-mails per seconden), zodat er 250 e-mails per 5 seconden verwerkt kunnen worden.
  • Minimale afleverduur per bericht van 5000 ms, zodat er niet meer dan 50 berichten per seconde verzonden worden door alle parallelle stromen tegelijk.

Meestal is het verstandig om niet heel scherp aan de wind te zeilen; verlaag het aantal parallelle verwerkers daarom met bijvoorbeeld 20% van 250 naar 200.

De SQL-statements om dan met 200 stromen tegelijk de e-mails met bijlagen te verzenden worden dan:

set smtp-minimum-deliver-duration-ms@mail 5000
set smtp-max-parallel@mail 200

bulk insert into smtp@mail
( toEmail
, ccEmail
, bccEmail
, subject
, body
, attachment1Contents
, attachment1Name
, attachment1MimeType
)
select 'myrecipient@acme.com'
       toEmail
,      cast(null as varchar2)
       ccEmail
,      cast(null as varchar2)
       bccEmail
,      'The subject'
       subject
,      'The body in HTML or text.'
       body
,      rfe.file_contents
       attachment1Contents
,      basename(fle.file_path)
       attachment1Name
,      cast(null as varchar2)
       attachment1MimeType
from   files('c:\temp', '*.png', true)@os fle
join   read_file(fle.file_path)@os rfe

Het SQL insert-statement is dus volledig identiek, buiten de toevoeging van bulk.