直接从 MIME 字符串将附件添加到 MailMessage

Posted

技术标签:

【中文标题】直接从 MIME 字符串将附件添加到 MailMessage【英文标题】:Adding attachment into MailMessage direct from MIME string 【发布时间】:2018-02-18 05:43:20 【问题描述】:

有许多从文件添加附件的好例子,但我想知道我是否可以以与AlternateView.CreateAlternateViewFromString 的工作方式类似的方式来做到这一点。

我分别使用 IMAP 从一个地址获取电子邮件的 body_text 和 body_headers,然后希望从另一个地址(通过 SMTP)发送它并进行一些更改,但尽可能忠实地添加附件。我正在使用 MailMessage 和 SmtpClient(System.Net 和 System.Net.Mail)

我编写了代码,通过它们的“Content-Type:”标签从 BODY[TEXT] 中提取 MIME 部分,并以这种方式愉快地将纯文本添加到 html 视图中。我在 MIME 中也有附件(请参见下面的示例),所以看起来我应该能够直接从我可以使用“Content-Type: application/octet-stream”从 MIME 中提取的字符串中轻松添加附件。目前,我只对它与 application/octet-stream 一起使用感兴趣。

我在我的部分代码中有这个可用的字符串,其中包含:

Content-Type: application/octet-stream; name="test_file.abc"
Content-Disposition: attachment; filename="test_file.abc"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_j7datrbn0

YWJjIGZpbGU=

或者

Content-Disposition: attachment; filename="test_file.abc"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_j7datrbn0

YWJjIGZpbGU=

来自示例:

* 53 FETCH (BODY[TEXT] 614
--001a1140ae52fcc4690558c101ec
Content-Type: multipart/alternative; boundary="001a1140ae52fcc4630558c101ea"

--001a1140ae52fcc4630558c101ea
Content-Type: text/plain; charset="UTF-8"

Blah blah

--001a1140ae52fcc4630558c101ea
Content-Type: text/html; charset="UTF-8"

<div dir="ltr">Blah blah</div>

--001a1140ae52fcc4630558c101ea--
--001a1140ae52fcc4690558c101ec
Content-Type: application/octet-stream; name="test_file.abc"
Content-Disposition: attachment; filename="test_file.abc"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_j7datrbn0

YWJjIGZpbGU=
--001a1140ae52fcc4690558c101ec--
)
$ OK Success

我的代码的所有其他方面都有效,但是有没有一种简单的方法可以直接从我拥有的 MIME 数据中添加附件。我没有使用 MimeKit 或标准 VS 以外的任何库。

感谢您阅读这么长的问题。

【问题讨论】:

【参考方案1】:

不是我真正想做的,但我实现了我需要的如下:

string name = find_item_by_key(attachment_content, "filename"); // looks for key="value" and returns value
string attachment_base64 = attachment_content.Substring(attachment_content.LastIndexOf("\r\n\r\n"));
attachment_base64 = attachment_base64.Trim('\r', '\n');
byte[] attachment_bytes = Convert.FromBase64String(attachment_base64);
Attachment att = new Attachment(new System.IO.MemoryStream(attachment_bytes), name);
mail.Attachments.Add(att);

正在进行许多毫无意义的转换,因为数据已经是 Base64 并且mail.Attachments.Add 无疑会再次将其转换回来。

【讨论】:

以上是关于直接从 MIME 字符串将附件添加到 MailMessage的主要内容,如果未能解决你的问题,请参考以下文章

使用 Mail_Mime 将附件发送到 GMail,接收“无名”附件

如何使用 MIME 添加和删除附件

如何正确添加和删除 MIME 附件

将 MIME 中的附加数据嵌入到电子邮件的 HTML 部分。未链接到附件

如何将 msg 中的附件附加到 Mime 以在 Python 中作为电子邮件发送?

在 mime smtp 中添加 pdf 的附件