Mailgun: inviare gratuitamente (o quasi) le tue mail

Mailgun è un ottimo strumento per inviare mail e lo posso confermare dopo l’intenso utilizzo dell’ultimo anno. Per questo motivo ho deciso di condividere (in una serie di articoli) la mia libreria e relativa Azure Function per utilizzare al meglio questo servizio.

Mailgun: Step 0

Come primo passaggio per utilizzare Mailgun dovete andare sul sito, registrarvi e completare la registrazione. La carta di credito dovrà essere inserita anche nel caso di utilizzo del piano free. Se non presente, non verranno inviate mail.

MailGun - Classe per Inviare Mail

Il fulcro del progetto (e della serie di articoli) è la classe MailGunEngine presente nel componente DevAndreaCarrattaIT.MailGun.Lib grazie alla quale possiamo effettuare l’invio delle nostre comunicazioni.

 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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84

using RestSharp;
using RestSharp.Authenticators;
using System;
using System.Collections.Generic;

namespace DevAndreaCarrattaIT.MailGun.Lib
{
    public class MailGunEngine : IMailGunEngine
    {

        public string ApiBaseUri { get; set; }
        public string ApiKey { get; set; }
        public string Domain { get; set; }
        public string Expression { get; set; }
        public bool AddHeaderNativeSend { get; set; }
        public string FromMail { get; set; }
        public string FromName { get; set; }


        public MailGunEngine()
        {
        }

        public string Send(string Subject, string Text, string BodyHtml, string To, string Cc = null, string Ccn = null)
        {

            // Nuget : RestSharp 
            RestClient client = new RestClient();
            client.BaseUrl = new Uri(this.ApiBaseUri);
            client.Authenticator = new HttpBasicAuthenticator("api", this.ApiKey);
            RestRequest request = new RestRequest();
            request.AddParameter("domain", this.Domain, ParameterType.UrlSegment);
            request.Resource = "{domain}/messages";
            request.AddParameter("from", $"{FromName} <{FromMail}>");

            if (AddHeaderNativeSend)
            {
                request.AddParameter("x-mailgun-native-send", true);
                request.AddParameter("o:skip-verification", true);
            }

            if (string.IsNullOrEmpty(this.Expression))
            {
                request.AddParameter("priority", 0);
                request.AddParameter("description", $"Route {Guid.NewGuid()}");
                request.AddParameter("expression", this.Expression);
            }

            request.AddParameter("to", To);

            if (string.IsNullOrEmpty(Cc) == false)
            {
                request.AddParameter("cc", Cc);
            }

            if (string.IsNullOrEmpty(Ccn) == false)
            {
                request.AddParameter("ccn", Ccn);
            }

            request.AddParameter("subject", Subject);

            if (string.IsNullOrEmpty(Text) == false)
            {
                request.AddParameter("text", Text);
            }

            if (string.IsNullOrEmpty(BodyHtml) == false)
            {
                request.AddParameter("html", $"<html>{BodyHtml}</html>");
            }

            request.Method = Method.POST;
            var executeResult = client.Execute(request);

            string result = executeResult.Content.ToString();

            return result;
        }

    }
}

Come avete potuto notare non è molto codice, ma grazie ad esso basterà:

  • Si potrà effettuare un solo new MailGunEngine ed impostare ApiBaseUri, ApiKey, Domain (ottenuti in fase di registrazione)

  • Chiamare il metodo Send ogni volta che occorre inviare una mail passando diversi parametri in ingresso.

Il metodo ha un valore di ritorno (string) e contiene l’esito della chiamata a Mailgun

1
2
3
4
5
6

{
  "id": "<YYYYMMDDHHMMDD.1.XXXXXXXXXXXXXXXX@mg.yyyyyyyyyyy.it>",
  "message": "Queued. Thank you."
}