我正在使用 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 网络客户端兼容?