使用普通,HTML和SMTP中的附件修正电子邮件的电子邮件格式?

时间:2012-06-03 19:28:04

标签: smtp

问题:

我尝试复制yahoo和hotmail使用的基于SMTP的标题/电子邮件,并通过Telnet发送,但我收到的电子邮件不显示附带的附件,但它确实正确显示了消息。

我怀疑是什么造成的:

我相信我的电子邮件格式不正确,尽管在线搜索了大量文章(以及尝试掌握复杂且难以阅读的RFC),但我没有找到任何有用或简洁的文章来解释如何使用所有文章SMTP中的三个(普通,HTML和附件)正确。我花了几天时间尝试更改代码,但我要么只是消息(没有附件)或整个SMTP Data正文显示(包括边界,html代码等)。

我希望通过这个问题实现的目标:

我希望有人可以查看我在下面收集的信息,并能够告诉我我错过了什么(或者电子邮件格式的确切方式不正确)。

调试信息:

我将发送到SMTP服务器的信息的副本提供给文件,我已将信息粘贴到pastebin(删除/删除任何个人信息 - Base64编码的附件只是另一封电子邮件的文本文件来自IMAP):

逐字(减去控制字符)发送到SMTP服务器的信息:

http://pastebin.com/QYwzWT0S

我在电子邮件客户端中看到的内容(请注意没有附件):

http://i45.tinypic.com/29b1zci.jpg

IMAP在下载电子邮件时看到的内容(注意格式不正确):

http://pastebin.com/zv3PBr8N

IMAP的格式正确无误:

http://pastebin.com/3yBySbxU

我怀疑SMTP错误解释了我发送的内容,这就是为什么当IMAP尝试检索电子邮件时,多部分/替代方案丢失了。我究竟做错了什么?服务器期望什么?

[感谢你的支持 - 我可以重新启用链接!]

2 个答案:

答案 0 :(得分:5)

我清理了多部分边界说明符并得到了这个,这对我的服务器起作用了(我在这里没有关闭SMTP命令):

From: "Edited Out" <editedout@yahoo.com> 
To: "Edited Out" <editedout@yahoo.com> 
Subject: Testing 4
MIME-Version: 1.0
Content-Type: multipart/alternative;
  boundary="boundary-type-1234567892-alt"

--boundary-type-1234567892-alt
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable


Testing the text to see if it works!

--boundary-type-1234567892-alt
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable


<html>Does this actually work?</html>

--boundary-type-1234567892-alt
Content-Transfer-Encoding: base64
Content-Type: text/plain;name="Here2.txt"
Content-Disposition: attachment;filename="Here2.txt"

KiAxMyBGRVRDSCAoQk9EWVtURVhUXSB7NjU5fQ0KLS1fZjZiM2I1ZWUtMjA3YS00ZDdiLTg0NTgtNDY5YmVlNDkxOGRhXw0    KQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJpc28tODg1OS0xIg0KQ29udGVudC1UcmFuc2Zlci1FbmNvZG    luZzogcXVvdGVkLXByaW50YWJsZQ0KDQoNCkp1c3Qgc2VlaW5nIHdoYXQgdGhpcyBhY3R1
YWxseSBjb250YWlucyEgCQkgCSAgIAkJICA9DQoNCi0tX2Y2YjNiNWVlLTIwN2EtNGQ3Yi04NDU4LTQ2OWJlZTQ5MThkYV8    NCkNvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PSJpc28tODg1OS0xIg0KQ29udGVudC1UcmFuc2Zlci1FbmNvZG    luZzogcXVvdGVkLXByaW50YWJsZQ0KDQo8aHRtbD4NCjxoZWFkPg0KPHN0eWxlPjwhLS0N
Ci5obW1lc3NhZ2UgUA0Kew0KbWFyZ2luOjBweD0zQg0KcGFkZGluZzowcHgNCn0NCmJvZHkuaG1tZXNzYWdlDQp7DQpmb25    0LXNpemU6IDEwcHQ9M0INCmZvbnQtZmFtaWx5OlRhaG9tYQ0KfQ0KLS0+PC9zdHlsZT48L2hlYWQ+DQo8Ym9keSBjbGFzcz    0zRCdobW1lc3NhZ2UnPjxkaXYgZGlyPTNEJ2x0cic+DQpKdXN0IHNlZWluZyB3aGF0IHRo
aXMgYWN0dWFsbHkgY29udGFpbnMhIAkJIAkgICAJCSAgPC9kaXY+PC9ib2R5Pg0KPC9odG1sPj0NCg0KLS1fZjZiM2I1ZWU    tMjA3YS00ZDdiLTg0NTgtNDY5YmVlNDkxOGRhXy0tDQopDQpmbHlubmNvbXB1dGVyIE9LIEZFVENIIGNvbXBsZXRlZA


--boundary-type-1234567890-alt--

多部分电子邮件中的边界说明符是任何不太可能出现在电子邮件正文/附件中的任意文本。当它在前面显示两个破折号时,它指定了新部件的开头(包括第一部分。当它在开头和结尾显示两个破折号时,它指定了邮件的结尾。

您的原始邮件在邮件中间(<html>Does this actually work?</html>之后)有这个“结束边界”标记,并且有两个不同的边界标记(--boundary-type-1234567890--boundary-type-1234567892-alt)。这就解释了为什么附件没有了。

答案 1 :(得分:2)

事实证明这个问题非常微妙。

传统的Hotmail(this was the original email I based it on),对电子邮件的多个部分使用术语“multipart / alternative”。我在电子邮件中使用了“multipart / alternative”。

事实证明雅虎不喜欢'multipart / alternative'并且只会正确地显示纯文本,html和附件,而不是使用术语'multipart / mixed'(因为我注意到雅虎兼容的电子邮件使用这个术语代替替代),结合ejdyksen的建议(虽然这两个建议都不适用于雅虎的服务器。)

虽然从技术上讲,这是“正确的”答案,但我会选择ejdyksen的答案,因为他的努力表明它是服务器端的技术性(他的SMTP服务器和hotmail都显示附件,雅虎没有) 。礼貌地赞成了ejdyksen的回答,因为他完成了大部分的工作。