Example #1
0
        public static void AddAttachment(this MailBuilder builder, IMail messageToAttach)
        {
            MimeRfc822 rfc822 = new MimeFactory().CreateMimeRfc822();

            rfc822.Data = messageToAttach.Render();
            builder.AddAttachment(rfc822);
        }
Example #2
0
        public byte[] Send(MailMessage message, bool returnBlob = false, bool needDispositionNotification = false, StandardMailAddress notificationTo = null)
        {
            // Gestore dei messaggi
            MailBuilder builder = new MailBuilder {
                MessageID = Guid.NewGuid().ToString(), Subject = message.Subject
            };

            // Creo il messaggio base
            builder.From.Add(new MailBox(message.From.Address, message.From.DisplayName));
            builder.Text = message.Body;
            builder.Html = message.Body.Replace(Environment.NewLine, "<br />");

            // Carico i destinatari A
            foreach (var recipient in message.To)
            {
                builder.To.Add(new MailBox(recipient.Address, recipient.DisplayName));
            }

            // Carico i destinatari CC
            foreach (var recipient in message.CC)
            {
                builder.Cc.Add(new MailBox(recipient.Address, recipient.DisplayName));
            }

            //Specifico se notificare al mittente la notifiche di lettura e ricezione
            if (needDispositionNotification && notificationTo != null)
            {
                MailBox originalSender = new MailBox(notificationTo.Address, notificationTo.DisplayName);
                builder.RequestReadReceipt();
                builder.NotificationTo.Clear();
                builder.ReplyTo.Clear();
                builder.ReturnReceiptTo.Clear();
                builder.NotificationTo.Add(originalSender);
                builder.ReturnReceiptTo.Add(originalSender);
            }

            // Carico gli allegati
            foreach (var attachment in message.Attachments)
            {
                var mime = new MimeFactory().CreateMimeData();
                using (var ms = new MemoryStream())
                {
                    attachment.ContentStream.CopyTo(ms);
                    mime.Data = ms.ToArray();
                }

                mime.ContentType = ContentType.Parse(attachment.Name.GetMimeType());
                mime.FileName    = attachment.Name;
                builder.AddAttachment(mime);
            }

            // Priorità
            switch (message.Priority)
            {
            case MailPriority.Low:
                builder.Priority = MimePriority.NonUrgent;
                break;

            case MailPriority.Normal:
                builder.Priority = MimePriority.Normal;
                break;

            case MailPriority.High:
                builder.Priority = MimePriority.Urgent;
                break;
            }

            // Genero la mail da spedire
            var email = builder.Create();

            var       sent          = false;
            var       i             = 0;
            Exception lastException = null;

            while (!sent && i < 5)
            {
                using (var smtp = new Smtp())
                {
                    // Accetto anche i certificati non validi
                    smtp.ServerCertificateValidate += ServerCertificateValidateCallBack;

                    // Connessione al server
                    smtp.Connect(_server, _port, AuthenticationType == MailClient.AuthenticationType.Ssl);

                    // Attivazione Tls, se richiesta
                    if (AuthenticationType == MailClient.AuthenticationType.Tls)
                    {
                        smtp.StartTLS();
                    }

                    // Login, se necessario
                    if (!UseDefaultCredentials)
                    {
                        smtp.UseBestLogin(Credentials.UserName, Credentials.Password);
                    }

                    // Imposto il timeout per la richiesta
                    smtp.SendTimeout = new TimeSpan(0, 0, 0, 0, Timeout);

                    // Invio e calcolo il risultato
                    var messageResult = smtp.SendMessage(email);
                    sent = (messageResult.Status == SendMessageStatus.Success);
                    try
                    {
                        smtp.Close(true);
                    }
                    catch (Exception ex)
                    {
                        lastException = ex;
                    }
                }

                if (!sent)
                {
                    Thread.Sleep(1000 * 30);
                    continue;
                }
                i++;
            }

            if (returnBlob && email != null)
            {
                byte[] eml = email.Render();
                return(eml);
            }

            if (!sent && lastException != null)
            {
                throw new Exception("Impossibile inviare il messaggio dopo 5 tentativi.", lastException);
            }

            return(null);
        }