C# 将邮件消息转换为流将删除密件抄送

C# 将邮件消息转换为流将删除密件抄送,c#,mailmessage,C#,Mailmessage,使用这个SO post(),我们能够以流的形式获取邮件消息。但是,Bcc已被删除。To和CC仍然有效,但Bcc无效 为什么要将其删除,以及如何将其保留在邮件中?非常确定密件抄送字段永远不会与邮件一起发送 密件抄送字段用于向收件人发送“盲副本”。发件人: 在通信上下文中,盲复写(缩写为Bcc:)允许消息发送者对其他收件人隐藏在Bcc:字段中输入的人 如果“密件抄送”字段中的收件人实际上包含在电子邮件的原始SMTP文本中,则无法强制执行此保证 SmtpClient很可能使用您在问题中链接的方法来准备

使用这个SO post(),我们能够以流的形式获取邮件消息。但是,Bcc已被删除。To和CC仍然有效,但Bcc无效


为什么要将其删除,以及如何将其保留在邮件中?

非常确定密件抄送字段永远不会与邮件一起发送

密件抄送字段用于向收件人发送“盲副本”。发件人:

在通信上下文中,盲复写(缩写为Bcc:)允许消息发送者对其他收件人隐藏在Bcc:字段中输入的人

如果“密件抄送”字段中的收件人实际上包含在电子邮件的原始SMTP文本中,则无法强制执行此保证

SmtpClient
很可能使用您在问题中链接的方法来准备要传输的消息。因此,它必须忽略BCC字段才能保持预期的行为

要将其保留在中,您必须手动将其插入到输出文本中:

var email = new MailMessage();
using (var reader = new StreamReader(email.RawMessage())) 
using (var writer = new StringWriter()) {
    while(true) {
        var line = reader.ReadLine();
        if (line == null) break; // EOF

        if (line != "") { 
            // Header line
            writer.WriteLine(line);
            continue;
        }

        // End of headers, insert bcc, read body, then bail
        writer.WriteLine("Bcc: " + email.Bcc.ToString()); // or however you want to format it
        writer.WriteLine("");
        writer.Write(reader.ReadToEnd());
        break;
    }

    var messageText = writer.ToString();
    // Do something with message text which now has Bcc: header
}

可以肯定的是,BCC字段永远不会与消息一起发送

密件抄送字段用于向收件人发送“盲副本”。发件人:

在通信上下文中,盲复写(缩写为Bcc:)允许消息发送者对其他收件人隐藏在Bcc:字段中输入的人

如果“密件抄送”字段中的收件人实际上包含在电子邮件的原始SMTP文本中,则无法强制执行此保证

SmtpClient
很可能使用您在问题中链接的方法来准备要传输的消息。因此,它必须忽略BCC字段才能保持预期的行为

要将其保留在中,您必须手动将其插入到输出文本中:

var email = new MailMessage();
using (var reader = new StreamReader(email.RawMessage())) 
using (var writer = new StringWriter()) {
    while(true) {
        var line = reader.ReadLine();
        if (line == null) break; // EOF

        if (line != "") { 
            // Header line
            writer.WriteLine(line);
            continue;
        }

        // End of headers, insert bcc, read body, then bail
        writer.WriteLine("Bcc: " + email.Bcc.ToString()); // or however you want to format it
        writer.WriteLine("");
        writer.Write(reader.ReadToEnd());
        break;
    }

    var messageText = writer.ToString();
    // Do something with message text which now has Bcc: header
}

下面是我对RawMessage()的VB.NET重新编译,它在头中包含BCC。基于其他人对原始SO链接的重复使用:


下面是我对RawMessage()的VB.NET重新编译,它在头中包含BCC。基于其他人对原始SO链接的重复使用:


既然你提到了,那就有点道理了。SmtpClient.Send()方法将去掉BCC。我们通过SendRawEmail()方法将其发送到Amazon SES。相反,我想我只是手动创建MIME消息字符串,创建流,然后完成。只是想澄清一下,如果您将密件抄送至SES,它会正确地执行此操作。可能是因为在
RCPT to:
交换期间,它在实际的SMTP信封(不属于邮件标题/正文)中使用了密件抄送。既然您提到了它,这就有点道理了。SmtpClient.Send()方法将去掉BCC。我们通过SendRawEmail()方法将其发送到Amazon SES。相反,我想我只是手动创建MIME消息字符串,创建流,然后完成。只是想澄清一下,如果你将密件抄送给SES,它会正确地执行。可能是因为在
RCPT to:
交换期间,它在实际的SMTP信封(不属于邮件头/正文)中使用了密件抄送。我用C#编写了上述代码。请看我在上的帖子,我用C#编写了上面的代码。请参阅我的帖子,注意:由于API的变化,这在NET50中不再有效。注意:由于API的变化,这在NET50中不再有效。