Ejemplo n.º 1
0
        public Guid Send(MailMessage message, MailOptions options)
        {
            var messageForDispatch = new SentMailMessage(message)
            {
                IsSigned       = options.Sign,
                IsEncrypted    = options.Encrypt,
                DeliveryStatus = options.Suspend ? DeliveryStatus.Suspended : DeliveryStatus.Pending,
                DelayUntil     = options.DelayUntil
            };


            db.Add(messageForDispatch);

            return(messageForDispatch.Id);
        }
Ejemplo n.º 2
0
        private bool TryDeliverMessage(SentMailMessage message)
        {
            using (var mailClient = new Smtp())
            {
                try
                {
                    var senderAccount = FindMailAccountFor(message.From.Address);

                    if (senderAccount == null)
                    {
                        throw new ArgumentException("Could not deliver message - invalid account");
                    }

                    if (message.ReplyTo.Count() == 0 && !string.IsNullOrWhiteSpace(senderAccount.ReplyTo))
                    {
                        message.ReplyTo.Add(new MailAddress()
                        {
                            Address = senderAccount.ReplyTo
                        });
                    }

                    var server = mailClient.SmtpServers.Add(senderAccount.ServerAddress, senderAccount.ServerUsername, senderAccount.ServerPassword);
                    server.Port    = senderAccount.ServerPort;
                    server.Timeout = 60000;

                    var email = new MailBeeMessage()
                    {
                        Charset = "utf-8", ThrowExceptions = true
                    };

                    email.From = new MailBeeEmailAddress(senderAccount.SenderEmailAddress, message.From.DisplayName ?? senderAccount.SenderDisplayName);
                    message.To.ForEach(to => email.To.Add(to.Address, to.DisplayName));
                    message.ReplyTo.ForEach(to => email.ReplyTo.Add(to.Address, to.DisplayName));
                    message.CC.ForEach(cc => email.Cc.Add(cc.Address, cc.DisplayName));
                    message.BCC.ForEach(bcc => email.Bcc.Add(bcc.Address, bcc.DisplayName));

                    email.Subject       = message.Subject;
                    email.BodyPlainText = message.IsBodyHtml ? null : message.Body;
                    email.BodyHtmlText  = message.IsBodyHtml ? message.Body : null;

                    foreach (var attachment in message.Attachments)
                    {
                        if (attachment.Content != null)
                        {
                            email.Attachments.Add(attachment.Content, attachment.Name, string.Empty, attachment.ContentType, null, NewAttachmentOptions.None, MailTransferEncoding.None);
                        }
                        else if (!string.IsNullOrEmpty(attachment.Path))
                        {
                            email.Attachments.Add(attachment.Path, attachment.Name, string.Empty, attachment.ContentType, null, NewAttachmentOptions.None, MailTransferEncoding.None);
                        }
                    }

                    if (message.IsEncrypted)
                    {
                        email = new Smime().SignAndEncrypt(email, new Certificate(senderAccount.CertificateFilePath, CertFileType.Pfx, senderAccount.CertificatePassword), FindAllRecipientCertificatesFor(message));
                    }
                    else if (message.IsSigned)
                    {
                        email = new Smime().Sign(email, new Certificate(senderAccount.CertificateFilePath, CertFileType.Pfx, senderAccount.CertificatePassword));
                    }

                    email.EncodeAllHeaders(System.Text.Encoding.UTF8, HeaderEncodingOptions.None);

                    mailClient.Message = email;
                    mailClient.Send();

                    message.DeliveryStatus = DeliveryStatus.Sent;
                    message.SentOn         = DateTime.UtcNow;
                    return(true);
                }
                catch (Exception ex)
                {
                    message.FailedOn       = DateTime.UtcNow;
                    message.FailureCount  += 1;
                    message.FailureMessage = ex.ToString();
                    message.DeliveryStatus = (message.FailureCount < config.SuspendMailAfterAttempts) ? DeliveryStatus.Failed : DeliveryStatus.Suspended;
                    return(false);
                }
                finally
                {
                    db.SaveChanges();
                }
            }
        }