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

时间:2013-04-13 21:12:57

标签: c# .net outlook gmail smime

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

1 个答案:

答案 0 :(得分:3)

当outlook生成已签名的电子邮件时,它会添加带有签名邮件的备用视图,带有html版本的另一个备用视图,然后使用纯文本版本添加另一个备用视图。我想如果你也这样做,它将适用于大多数电子邮件客户端。

有一个未签名的纯文本备用视图 内容类型:text / plain; 字符集= “US-ASCII” 内容传输编码:7位

有一个未签名的html版本 内容类型:text / html; 字符集= “US-ASCII” Content-Transfer-Encoding:quoted-printable

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