Ejemplo n.º 1
0
        public void SendEncryptedEmail(EncryptedEmail encryptedEmail)
        {
            Logger.LogTrace($"Sending {encryptedEmail.ToString()}");

            if (EmailSenderConfiguration.IsDisabled)
            {
                // used in unit-tests to prevent mass email sending...
                return;
            }

            IList <MailMessage> mailMessages;

            if (EmailSenderConfiguration.InSimulationMode)
            {
                Logger.LogWarning($"InSimulation Mode -> Changing Recipients: {EmailSenderConfiguration.AdministratorEmailAddresses.ToSeparatedString( a => a )}");

                var simulatedEmailBody = "<div style='font-family: Arial, Verdana; font-size: 10px; font-weight: bold'>" +
                                         "This mail would have been sent to:" +
                                         "<br/>" + encryptedEmail.Recipients.ToSeparatedString(t => t.Address) +
                                         "<br /><br /></div>" +
                                         "-- The encrypted mail body is hidden in a simulated, unencrypted mail --";

                var simulatedEmail = new Email(from: encryptedEmail.From, to: EmailSenderConfiguration.AdministratorEmailAddresses, cc: null, bcc: null, subject: encryptedEmail.Subject, body: simulatedEmailBody, attachments: encryptedEmail.Attachments != null ? encryptedEmail.Attachments.ToArray() : null);

                mailMessages = ConvertEmailToMailMessages(simulatedEmail);
            }
            else
            {
                mailMessages = ConvertEncryptedEmailToMailMessages(encryptedEmail);
            }

            this.SendMailMessages(mailMessages);
        }
Ejemplo n.º 2
0
        private IList <MailMessage> ConvertEncryptedEmailToMailMessages(EncryptedEmail encryptedEmail)
        {
            var mailMessages = new List <MailMessage>();

            var body = encryptedEmail.Body.Replace("\r", "").Replace("\n", "<br />");

            var sb = new StringBuilder();

            if (encryptedEmail.Attachments != null && encryptedEmail.Attachments.Count > 0)
            {
                sb.Append("MIME-Version: 1.0\r\n");
                sb.Append("Content-Type: multipart/mixed; boundary=unique-boundary-1\r\n");
                sb.Append("\r\n");
                sb.Append("This is a multi-part message in MIME format.\r\n");
                sb.Append("--unique-boundary-1\r\n");
                sb.Append("Content-Type: text/html; charset=\"utf-8\"\r\n");
                sb.Append("Content-Transfer-Encoding: 7Bit\r\n\r\n");
                sb.Append(body);
                if (!body.EndsWith("\r\n"))
                {
                    sb.Append("\r\n");
                }
                sb.Append("\r\n\r\n");

                foreach (var attachment in encryptedEmail.Attachments)
                {
                    sb.Append("--unique-boundary-1\r\n");
                    sb.Append("Content-Type: application/octet-stream; file=" + attachment.FileName + "\r\n");
                    sb.Append("Content-Transfer-Encoding: base64\r\n");
                    sb.Append("Content-Disposition: attachment; filename=" + attachment.FileName + "\r\n");
                    sb.Append("\r\n");

                    byte[] binaryData  = attachment.Data;
                    string base64Value = Convert.ToBase64String(binaryData, 0, binaryData.Length);
                    int    position    = 0;

                    while (position < base64Value.Length)
                    {
                        int chunkSize = 100;
                        if (base64Value.Length - (position + chunkSize) < 0)
                        {
                            chunkSize = base64Value.Length - position;
                        }
                        sb.Append(base64Value.Substring(position, chunkSize));
                        sb.Append("\r\n");
                        position += chunkSize;
                    }
                    sb.Append("\r\n");
                }
            }
            else
            {
                sb.AppendLine("Content-Type: text/html; charset=\"utf-8\"");
                sb.AppendLine("Content-Transfer-Encoding: 7bit");
                sb.AppendLine();
                sb.AppendLine(body);
            }

            var bodyData = Encoding.UTF8.GetBytes(sb.ToString());

            foreach (var recipient in encryptedEmail.Recipients)
            {
                var envelopedCms = new EnvelopedCms(new ContentInfo(bodyData));
                var cmsRecipient = new CmsRecipient(SubjectIdentifierType.IssuerAndSerialNumber, recipient.Certificate);
                envelopedCms.Encrypt(cmsRecipient);
                var encryptedBytes = envelopedCms.Encode();

                var mailMessage = new MailMessage(encryptedEmail.From, recipient.Address)
                {
                    Priority = encryptedEmail.MailPriority,
                    DeliveryNotificationOptions = encryptedEmail.DeliveryNotificationOptions,
                    Subject    = encryptedEmail.Subject,
                    IsBodyHtml = true
                };
                mailMessage.AlternateViews.Add(new AlternateView(new MemoryStream(encryptedBytes), "application/pkcs7-mime; smime-type=signed-data; name=smime.p7m"));

                if (!string.IsNullOrEmpty(mailMessage.Subject))
                {
                    while (("=?utf-8?B?" + Convert.ToBase64String(mailMessage.Subject.ToByte(System.Text.Encoding.UTF8)) + "?=").Length > 255)
                    {
                        // Bugfix for some mailservers/clients which cannot handle UTF8-encoded and to Base64 converted strings which are longer than 255 characters (including control characters)
                        mailMessage.Subject = mailMessage.Subject.RemoveLast(10) + "...";
                    }
                }

                mailMessages.Add(mailMessage);
            }

            return(mailMessages);
        }