Questo sito utilizza i cookie per migliorare servizi ed esperienza del lettore. Se decidi di continuare la navigazione consideriamo che accetti il loro uso . Per e informazioni sulla Privacy leggere la Google Policies Privacy

Se continui nella navigazione accetti il loro uso. OK

lunedì 9 agosto 2010

Inviare posta certificata di Aruba con C#

La posta certificata sta entrando a far parte della vita di tutti i giorni, con l'obbligo introdotto per legge di utilizzo per gli enti pubblici e il prossimo obbligo di utilizzo per tutte le aziende private.
Quindi, come non esimersi da creare delle procedure per l'invio di posta certificata.
In questo post ci soffermiamo sull'uso della posta certificata offerta da Aruba, ma i metodi qui descritti sono validi anche per altri provider di posta elettronica.
Prima di iniziare lo sviluppo controlliamo quello che ci viene detto da aruba per la configurazione di un client (alla fine ci serviranno proprio quei parametri per configurare il nostro client): http://assistenzaold.aruba.it/kb/idx/51/981/article/Parametri-per-la-configurazione-delle-caselle-PEC-sul-Client-di-Posta.html
Dato che vogliamo inviare la posta, i parametri che ci interessano sono quelli della posta in uscita, e quindi smtp. Andando a leggere la guida già ci accorgiamo di due cose, l'uso di una connessione autenticata SSL (Secure Socket Layer) impostata in maniera implicita (e cioè la connessione deve essere già in modalità SSL e quindi non impostata da un comando AUTH TLS). E qui cominciano già i primi problemi, infatti la classe System.Net.Mail supporta solo l'SSL impostato in modo esplicito. Di conseguenza una sequenza di comandi del genere:
Connect port 25 -> Start TLS -> Send
non viene recepita da un server che si attende già una connessione autenticata.
Ma attenzione, non disperate, in quanto il framework nasconde un segreto o più precisamente ha introdotto un segreto, infatti il vecchio namespace System.Web.Mail che dal complatore viene marcato come deprecato con messaggi di sfida ad usarlo, può operare in maniera SSL implicita. Tutto questo, ovviamente, non senza qualche difficoltà...
System.Web.Mail.MailMessage newMail = new System.Web.Mail.MailMessage();
newMail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserver", "smtps.pec.aruba.it");
newMail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", "465");
newMail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusing", "2");
newMail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1");
newMail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "miamail@pec.it");
newMail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "password");
newMail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", "true");

newMail.From = "miamail@pec.it";
newMail.To = "[dest]";
newMail.Subject = "[object]";
newMail.BodyFormat = System.Web.Mail.MailFormat.Text;
newMail.Body = "[body]";
newMail.Priority = System.Web.Mail.MailPriority.High;

System.Web.Mail.SmtpMail.SmtpServer = "smtps.pec.aruba.it:465";
System.Web.Mail.SmtpMail.Send(newMail);
il parametro sendusing permette di impostare il meccanismo di invio (in questo caso utilizzando la rete (SMTP over the network)).

13 commenti:

  1. Questo post mi è stato molto utile, effettivamente utilizzando System.Net.Mail non funzionava, mentre usando System.Web.Mail ed il codice di questo articolo sono riuscito ad inviare una PEC tramite la mia applicazione in CSharp!
    Max

    RispondiElimina
  2. Fantastico.
    Copiato, parametrizzato fatto click e tutto è stato spedito perfettamente.
    Ancora complimenti
    Giuseppe

    RispondiElimina
  3. Grazie all'utilizzo del suo post sono riuscito ad inviare delle mail PEC tramite Aruba.
    Che lei sappia, è possibile anche salvare una copia della mail inviata nella cartella "Inviate" dell'account di posta?
    Ho provato ad aggiungere
    newMail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/savesentitems", "true")
    ma purtroppo il messaggio inviato non viene salvato.

    Grazie mille.
    Alessandro.

    RispondiElimina
    Risposte
    1. Salve Alessandro, anche io ho avuto lo stesso problema.
      Il campo che ha indicato (savesentitems) non è considerato se viene impostato il campo sendusing = 2 (SMTP over the network), perchè per default viene considerato uguale a true, purtroppo ignoro il motivo per cui non venga memorizzata una copia in posta inviata.
      Personalmente uso le email di verifica che vengono inviate all'indirizzo di posta certificata, che chiaramente mancano di messaggio, ma che contengono almeno l'oggetto.
      Nel caso in cui avessi un'illuminazione, provvederò immediatamente a rispondere nuovamente al post.
      Saluti

      Elimina
    2. Grazie mille per la sua cortesia.
      Saluti.

      Elimina
  4. Salve, non riesco a mettere nessun allegato.

    Se scrivo:

    System.Web.Mail.MailAttachment allegato = new System.Web.Mail.MailAttachment("pec.txt", MailEncoding.Base64);
    newMail.Attachments.Add(allegato);


    al System.Web.Mail.SmtpMail.Send(newMail);

    Mi dà l'errore HttpException protocollo sconosciuto. Cosa devo fare?

    RispondiElimina
    Risposte
    1. Salve,
      io invio gli allegati senza aggiungere MailEncoding.Base64:

      System.Web.Mail.MailAttachment allegato = new System.Web.Mail.MailAttachment("pec.txt");
      newMail.Attachments.Add(allegato);

      Chiaramente il percorso del file deve essere assoluto.

      Mi faccia sapere!

      Elimina
  5. Grazie Mille ho risolto mettendo il percorso assoluto

    RispondiElimina
  6. Visto che sei così gentile, secondo te è possibile con la Pec e questa libreria fare una ricevuta di ritorno che il destinatario ha letto la mail come si fa con la mail normale?

    Grazie Mille

    RispondiElimina
    Risposte
    1. Prova ad aggiungere questi header nella mail:

      newMail.Headers.Add("Delivery-Notification-To", Configuration.ConfigurationManager.AppSettings("REPLY_TO"));
      newMail.Headers.Add("Disposition-Notification-To", Configuration.ConfigurationManager.AppSettings("REPLY_TO"));
      newMail.Headers.Add("Return-Receipt-To", Configuration.ConfigurationManager.AppSettings("REPLY_TO"));

      Non sono tutti, magari fai delle prove e verifica quale è il migliore, la documentazione in proposito è un po' nebulosa...

      Buon lavoro

      Elimina
  7. Sto impazzendo anch'io sul tema PEC! A ma basta l'invio, ma dopo aver scritto (vb.net 2010 express) così:

    Dim newMail As New System.Web.Mail.MailMessage

    il compilatore mi segnala che System.Web.Mail.MailMessage è di un tipo non definito.
    Analogamente dentro il codice ho tradotto
    >newMail.BodyFormat = System.Web.Mail.MailFormat.Text;
    con
    >newMail.BodyFormat = System.Web.Mail.MailFormat.Text
    e mi dice che 'Mail' non è membro di 'Web'.

    Dov'è il mio errore?
    Grazie per la risposta

    RispondiElimina
    Risposte
    1. Hai aggiunto il riferimento a System.Web.dll?? Magari stai facendo una WinForm o usando WPF e non c'è.

      Elimina