Я использую C #, .NET 4.0 для отправки электронной почты с цифровой подписью, например:
private void SendMailMessage(string emailTo)
{
MailMessage message = new MailMessage();
message.From = new MailAddress(fromAddress);
message.To.Add(new MailAddress(emailTo));
message.Subject = "Regarding your lottery winnings";
message.IsBodyHtml = false;
string body = "Content-Type: text/plain;charset=\"iso-8859-1\"\nContent-Transfer-Encoding: quoted-printable\n\nThe URL to your secret is: " + url + "\nIt can only be viewed once.";
byte[] messageBytes = Encoding.ASCII.GetBytes(body);
ContentInfo content = new ContentInfo(messageBytes);
SignedCms signedCms = new SignedCms(content, false);
CmsSigner Signer = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, emailCert);
signedCms.ComputeSignature(Signer);
byte[] signedBytes = signedCms.Encode();
MemoryStream ms = new MemoryStream(signedBytes);
AlternateView av = new AlternateView(ms, "application/pkcs7-mime; smime-type=signed-data;name=smime.p7m");
message.AlternateViews.Add(av);
SmtpClient client = new SmtpClient(smtpServer, int.Parse(smtpServerPort));
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.Send(message);
message.Dispose();
client = null;
}
Обратите внимание, что message.Body
оставлено пустым, и к электронному письму добавляется только AlternateView. Когда я отправляю это электронное письмо и просматриваю его в Outlook, оно отлично отображается со значком сертификата в сообщении электронной почты, а расширения S / MIME Outlook успешно и автоматически проверяют подпись.
Тузы.
(Если я добавлю что-нибудь в message.Body
, он сломается. Outlook больше не распознает это как подписанное электронное письмо, и я вижу только текст message.Body
, а не AlternateView.)
Но если я отправлю это электронное письмо на адрес Gmail, например, оно будет отображаться как пустое электронное письмо с прикрепленным файлом smime.p7m, а внутри я вижу текст письма, но он окружен тем, что выглядит как тонна бинарная тарабарщина.
Есть ли способ сделать это электронное письмо с цифровой подписью совместимым как с клиентом Outlook, так и с веб-клиентом Gmail?