以编程方式生成的数字签名电子邮件在 Outlook 中显示正确,但在 Gmail 中显示不正确

Posted

技术标签:

【中文标题】以编程方式生成的数字签名电子邮件在 Outlook 中显示正确,但在 Gmail 中显示不正确【英文标题】:Programmatically-generated, digitally signed email appears correct in Outlook, but not in Gmail 【发布时间】:2013-04-06 06:12:44 【问题描述】:

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

【问题讨论】:

嗯,多么好的消息主题。你不是在创建另一个垃圾邮件机器人,是吗? @alex 这是个玩笑。我喜欢在我的求助中加入一点幽默。 【参考方案1】:

当 Outlook 生成签名的电子邮件时,它会添加一个带有签名消息的替代视图、另一个带有 html 版本的替代视图,然后是另一个带有纯文本版本的替代视图。我认为,如果您也这样做,那么它将适用于大多数电子邮件客户端。

有一个未签名的纯文本替代视图 内容类型:文本/纯文本; charset="us-ascii" 内容传输编码:7bit

有一个未签名的html版本 内容类型:文本/html; charset="us-ascii" 内容传输编码:引用打印

有一个签名的备用视图 内容类型:application/pkcs7-signature; 名称="smime.p7s" 内容传输编码:base64 内容处置:附件; 文件名="smime.p7s"

【讨论】:

以上是关于以编程方式生成的数字签名电子邮件在 Outlook 中显示正确,但在 Gmail 中显示不正确的主要内容,如果未能解决你的问题,请参考以下文章

使用 Excel VBA 以编程方式禁止 Outlook 电子邮件发送警告消息

如果附件本身是邮件,如何在 Outlook 中以编程方式访问附件数据

AD 脚本kixtart运用之六(outlook邮件批量生成签名)

如何以编程方式确定从主功能区创建的 Outlook 新项目 --> 新项目

双证书体系key usage扩展——Outlook使用证书发送加密签名邮件

电子邮件签名未在Outlook中显示