首页 > 解决方案 > 使用 C# 加密带有附件的电子邮件

问题描述

我正在尝试从系统发送一封将被加密的电子邮件。当证书安装在客户端计算机中时,用户将能够阅读电子邮件的内容。如果未安装证书,则不会显示电子邮件内容。

下面是相同的代码

    X509Certificate2 SignCert = new X509Certificate2(SigningCertPath, "Password");

    X509Certificate2 EncryptCert = new X509Certificate2(EncryptingCertPath, "");

    Attachment attachment = new System.Net.Mail.Attachment("C:/Files/Sample.docx");

    MailMessage Msg = new MailMessage();

    StringBuilder Message = new StringBuilder();

    Message.AppendLine("Content-Type: text/" + ((HTML) ? "html" : "plain") +

        "; charset=\"iso-8859-1\"");

    Message.AppendLine("Content-Transfer-Encoding: 7bit");

    Message.AppendLine();

    Message.AppendLine(Body);

    byte[] BodyBytes = Encoding.ASCII.GetBytes(Message.ToString());

    EnvelopedCms ECms = new EnvelopedCms(new ContentInfo(BodyBytes));

    CmsRecipient Recipient = new CmsRecipient(

        SubjectIdentifierType.IssuerAndSerialNumber, EncryptCert);

    ECms.Encrypt(Recipient);

    byte[] EncryptedBytes = ECms.Encode();


    MemoryStream memStream = new MemoryStream(EncryptedBytes);

    AlternateView av = new AlternateView(memStream,

        "application/pkcs7-mime; smime-type=signed-data;name=smime.p7m");

    Msg.AlternateViews.Add(av);


    SignedCms Cms = new SignedCms(new ContentInfo(EncryptedBytes));

    CmsSigner Signer = new CmsSigner

        (SubjectIdentifierType.IssuerAndSerialNumber, SignCert);


    Cms.ComputeSignature(Signer);

    byte[] SignedBytes = Cms.Encode();

    string smtp_from = "From Email Address";

    MailAddress fromAddress = new MailAddress(smtp_from, "From EmailAddress");

    Msg.From = fromAddress;

    Msg.To.Add(new MailAddress(To));

    Msg.Subject = Subject;

    //Msg.Attachments.Add(attachment);


    SmtpClient smtpClient = new SmtpClient();

    string smtp_server = "smtpdetails";
    int smtp_port = 587;
    string smtp_username = "smtpusername";
    string smtp_password = "smtp_password";

    smtpClient.Host = smtp_server;
    smtpClient.Port = smtp_port;

    System.Net.NetworkCredential myCredentials =
    new System.Net.NetworkCredential(smtp_username, smtp_password);
    smtpClient.Credentials = myCredentials;

    smtpClient.Send(Msg);

该代码运行良好,没有任何问题,并发送了一封加密的电子邮件。但是,当我尝试向代码添加附件时,加密逻辑不起作用,我收到一封带有附件的未加密电子邮件。

我尝试使用 mimekit,但是没有用。谁能让我知道我需要为我的场景做哪些改变?我不想加密附件。我只想加密电子邮件内容并为其添加附件。

感谢您的理解。

标签: c#

解决方案


推荐阅读