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)).
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!
RispondiEliminaMax
Fantastico.
RispondiEliminaCopiato, parametrizzato fatto click e tutto è stato spedito perfettamente.
Ancora complimenti
Giuseppe
Grazie all'utilizzo del suo post sono riuscito ad inviare delle mail PEC tramite Aruba.
RispondiEliminaChe 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.
Salve Alessandro, anche io ho avuto lo stesso problema.
EliminaIl 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
Grazie mille per la sua cortesia.
EliminaSaluti.
grazie, mi hai salvato!!!
RispondiEliminaSalve, non riesco a mettere nessun allegato.
RispondiEliminaSe 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?
Salve,
Eliminaio 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!
Grazie Mille ho risolto mettendo il percorso assoluto
RispondiEliminaVisto 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?
RispondiEliminaGrazie Mille
Prova ad aggiungere questi header nella mail:
EliminanewMail.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
Sto impazzendo anch'io sul tema PEC! A ma basta l'invio, ma dopo aver scritto (vb.net 2010 express) così:
RispondiEliminaDim 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
Hai aggiunto il riferimento a System.Web.dll?? Magari stai facendo una WinForm o usando WPF e non c'è.
Elimina