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); }
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(); } } }