如何发送带附件的签名电子邮件

时间:2014-09-11 06:59:14

标签: c# email x509certificate email-attachments

我有方法,通过证书签署我的电子邮件。如果添加附件的行已注释掉,则此工作正常。

private static void mailer()
    {
        MailAddress from = new MailAddress("test@email.cz");
        MailAddress to = new MailAddress("test@email.cz");

        MailMessage message = new MailMessage(from, to);

        message.Subject = "Test subject email";
        message.IsBodyHtml = true;

        string body = "Content-Type: text/html; charset=utf-8 \r\n Content-Transfer-Encoding: 7bit \r\n\r\n";
        body += " Email body signed by certificate ";

        byte[] messageData = Encoding.ASCII.GetBytes(body);
        SignedCms Cms = new SignedCms(new ContentInfo(messageData));

        RSACryptoServiceProvider csp = null;
        X509Certificate2 cert = new X509Certificate2(@"C:\TFS\cert_test.p12", "password");

        if (cert != null)
        {
            csp = (RSACryptoServiceProvider)cert.PrivateKey;
        }
        else
        {
            throw new Exception("Valid certificate was not found");
        }

        CmsSigner Signer = new CmsSigner(SubjectIdentifierType.IssuerAndSerialNumber, cert);
        Cms.ComputeSignature(Signer);
        byte[] SignedBytes = Cms.Encode();
        MemoryStream signedStream = new MemoryStream(SignedBytes);
        AlternateView signedView = new AlternateView(signedStream, "application/pkcs7-mime; smime-type=signed-data; name=sig.p7m");
        message.AlternateViews.Add(signedView);

        ContentType contentType = new ContentType();
        contentType.MediaType = MediaTypeNames.Application.Octet;
        contentType.Name = "test.xml";
        MemoryStream ms = new MemoryStream(fileData);
        ms.Position = 0;
        Attachment attachment = new Attachment(ms, contentType);
        //message.Attachments.Add(attachment);

        SmtpClient client = new SmtpClient("smtp.server.net");
        client.UseDefaultCredentials = false;
        client.Credentials = new System.Net.NetworkCredential("smtp.server.net", "password", "user");

        try
        {
            client.Send(message);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

但我必须在电子邮件中添加附件(3个或更多)。当我添加附件(仅一个附件)时,电子邮件不再显示为已签名且电子邮件正文无法显示。我找到了一些问题的样本,但对我来说没用。

我没有加密电子邮件和附件。我只需要通过证书签署一封电子邮件。

感谢您的帮助。

编辑:对不起,我已经添加了已签名的AlternateView注释掉了这一行。右边评论说,该行是添加电子邮件的附件。

0 个答案:

没有答案