我正在使用Java Mail创建电子邮件,它几乎正常工作,但我遇到了一个问题,我不知道如何解决它。
Content-Transfer-Encoding quoted-printable在很多行中打破了我的身体,每行有77个字符,当下一行开始且第一个字符是a时,就会出现问题。 (点)。
这方面的一个例子:
<table border=3D"0" cellpadding=3D"0" cellspacing=3D"0" align=3D"center">
<tbody>
<tr>
<td><br /><font color=3D"#666666" face=3D"Arial, Helvetica, sans-serif=
" size=3D"1">Lala não leleler lala lalalaa, <a href=3D"http://t.laiu=
com.ar/TestsTrackings/op.aspx?Osa8Br5zxNpqrv0AtVqBIiGIGG0CPNrUoxbqY7WYcGhP7=
LrlPvlBijtUAlN+b07u4cgghR7erUuf
P9PWGu7YtTkb51txcLYb9+6jzjBtWhf/L8Ai/gdZjrXfmIamviwsffMsjXa8mtnQm8n/XXkWuDw=
8
gW6EpcofAgSMsqpqmqxv85MRVG2vIFuD9v6lFD1H+dMk0RtR/cMhg/zgtjdIym6pig8sSTDT">c=
lalal lala</a>.</font><br /></td>
</tr>
</tbody>
</table>
在线我有一个以 http://t.laiu .... 开头的链接,在下一行它只删除了我的点。当用户收到电子邮件时,他会输入 t.laiucom.ar ... 这样的链接,而不是 t.laui.com.ar 。
任何人都知道如何避免它?
提前感谢。
答案 0 :(得分:1)
在评论中,您确认使用Message.writeTo
创建了一个文件,并且该文件中有句点。
所以问题不在于javamail或引用的可打印编码。
根据rfc5321(或rfc2821 / rfc821),拾取文件的取件服务似乎已经预期它适合SMTP传输,这意味着行开头的句点必须加倍。 Message.writeTo
不会直接执行此操作,因为它不关心已使用的传输,只是将消息写入流中。
通常,当通过javax.mail.Transport
发送到SMTP时,javamail通过将输出流包装在SMTPOutputStream中来处理此问题,因此一切正常。但是直接使用Message.writeTo
,您需要在较低级别操作,并且需要正确处理格式化输出,以便拾取服务自己接受它。
这意味着你需要自己用两个点替换一行开头的点。为此,您可以使用上面提到的SMTPOutputStream包装器类(但它不是公共/文档化的API),或者编写自己的流包装器来执行相同操作。或者修改您喜欢的生成数据的任何其他方式......