直接从MIME字符串

时间:2017-09-09 13:06:17

标签: email attachment mime mailmessage

从文件中添加附件有很多很好的例子,但我想知道我是否可以采用与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 个答案:

答案 0 :(得分:0)

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

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无疑会再次将其转换回来。