SendGrid SendAt: Come schedulare l’invio

Utilizzi SendGrid ed hai la necessità di programmare l’invio di mail in particolari situazioni e/o momenti della giornata? In queste ultime settimane ho rimesso mano ad un progetto basato sull’invio di notifiche tramite posta elettronica e mi sono posto un dilemma su come fare a mandare le mail giuste all’orario corretto. Avevo due possibilità:

  • Una Azure Function di tipo TimeTrigger ogni X minuti

  • Una sola Azure Function  nella quale veniva calcolata la data di invio corretto e passata a SendGrid

Per una questione di costi dovuto al numero di chiamate ho optato per la seconda soluzione e questo mi è possible tramite SendAt offerto da SendGrid.

SendGrid SendAt: Come usarlo

Vi ricordate l’articolo che ho scritto dal titolo " SendGrid: Inviare Mail da Azure (Cloud Application) " dove spiegavo in poche righe come inviare mail? Il codice che mostro di seguito è una piccola estensione della precedente. Firma Send

1
2
3

public async Task<bool> Send(string fromMail, string fromName, string title, string text, DateTime? sentAtUtcDateTime = null)

La prima modifica da fare è quella di aggiungere il parametro

DateTime? sentAtUtcDateTime = null

come null in modo da non essere obbligati a modificare tutte le precedenti chiamate. Personalmente sono più favorevole per l’opzione di modificare tutte le chiamate, ma non voglio complicarvi la vita. Una volta arrivati a questo punto basta utilizzarlo

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13

[...]

if(sentAtUtcDateTime != null){
	DateTime dateTimeSendAt = (DateTime)sentAtUtcDateTime;
	long sentAtUtcDateTimeUnix = new DateTimeOffset(dateTimeSendAt).ToUnixTimeSeconds();
	msg.SendAt = sentAtUtcDateTimeUnix;
}

var response = await client.SendEmailAsync(msg);

[...]

Si, la modifica è solamente quella e si ottiene un grandissimo risultato. Quale? L’invio della mail all’orario UTC desiderato.

SendGrid SendAt: Mettiamolo al lavoro

Una volta scritto il codice ho provato a fare una classe dove chiamavo cinque volte il metodo Send con un intervallo di 120 secondi tra una mail e la successiva. Ecco il risultato ottenuto dopo una breve attesa Gli orari sono stati rispettati tutti e la mail è arrivata veramente puntuale. E’ facile, no?

! SendGrid SendAt: Come schedulare l’invio (GMail) (cs)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

string sendGridApiKey = "68dmfwCp2qHyMrRF74jkeoti";

DateTime utcNextMail = DateTime.UtcNow;
int secondsBetweenMail = 120;

DevAndreaCarrattaIT.SendGrid.SendGridMail mail = null;

for (int i = 0; i < 5; i++)
{
	utcNextMail = utcNextMail.AddSeconds(secondsBetweenMail);

	mail = new DevAndreaCarrattaIT.SendGrid.SendGridMail(sendGridApiKey)
	{
		To = new System.Collections.Generic.List<string>() { "mail@destinatario.com" }
	};

	await mail.Send("noreply@mailmittente.it", 
		$"Send By {utcNextMail} | {i}", 
		$"Test {utcNextMail} | {i}", 
		"Testo Mail", 
		utcNextMail);
}


SendGrid: Installazione Nuget

Per utilizzare il tutto è necessario aggiungere il pacchetto SendGrid attraverso nuget. Per farlo è sufficiente lanciare dal package manager il seguente comando:

Install-Package Sendgrid -Version 9.10.0

Per restare aggiornati con la versione più recente vi invito a vedere la pagina " NuGet Gallery | Sendgrid” con tutte le versioni del prodotto.