Perl MIME :: Lite正在分解HTML正文

时间:2015-05-08 21:12:43

标签: perl email-attachments

回到2004年左右,我写了一个带有MIME :: Lite的Perl电子邮件,从那时起一直在工作。只有现在客户端才会尝试使用它发送HTML。以下代码(修剪到重要部分)正确设置所有值。 HTML正文附加为text / html。在附加之前,数据显然没有CR(CRLF或LF)。但是在附加它之后,HTML 确实具有嵌入式CR。这似乎是在1000个字符后添加的。

不幸的是,它会在标记中间着陆,从而打破在收件人电子邮件中呈现为标记的标记,而不是完全呈现为格式化文本:<BR>显示为{{ 1}}。并且它没有打破特定的标签。我可以更改标签,它总是围绕相同的角色位置。我已经阅读了MIME :: Lite代码(我非常生疏的Perl技能),但我不知道它将在何处进行这种分割操作。

< BR>

不仅use MIME::Lite; # v3.030 my $bodyWithNoCR = "<html>" . ("x" x 1020) . "</html>"; my $mime_msg = MIME::Lite->new( From => 'x@x.com', To => 'x@x.com', Subject => 'Subject', Type =>'multipart/mixed') or die "$!\n"; $mime_msg->attach( Type => 'text/html', Data => $bodyWithNoCR) or die "$!\n"; my $bodyWithCR = $mime_msg->as_string; 显示了这一点,Net :: SMTP转储显示跨行的HTML拆分,这反映在收件人的电子邮件客户端中。

我知道MIME :: Lite被认为是错误的。但我的问题是这个具体问题是否得到承认(最好是引用跟踪器ID)。回答是,是的,我已经看到了#34;是有帮助的,但(尊敬地)并不足以确认这是旧代码中的已知问题。如果我可以找到此问题的跟踪器项目,那么我将知道是否可以查找补丁,或者我是否需要向用户建议此特定代码不能用于此特定目的。< / p>

任何人都可以为as_string建议替代代码,这可能会导致它避免破坏阻止它的任何内容吗?

至于使用其他工具(预期的响应),多年后我用其他客户端重写了PHPMailer,但API不同,客户端重新使用它会很麻烦。我还可以用其他东西替换MIME :: Lite(如维护者所推荐的那样)但是在旧的Linux机器上,对依赖链的要求可能会阻止加载任何更新的东西。也就是说,欢迎使用MIME :: Lite的替代方法。

目前没有更好的解决方案,考虑的唯一解决方法(但根本不喜欢)是使用980-1020,1980-2020等列中的嵌入空间构建HTML,这样即使CR是嵌入后,空白在收件人的邮件客户端中不可见。 (是的,哎呀!)

2 个答案:

答案 0 :(得分:2)

我相信this可能与正在发生的事情有关:

clothes.add("hello, world");
(dictionary.get(0)).add("hello, world");

答案 1 :(得分:1)

SMTP服务器具有行长度限制,可以允许少至1000个八位字节。因此,MIME :: Lite提供了以下有关选择内容传输编码的说明:

quoted-printable

启发式默认使用8位,因此MIME :: Lite正在添加换行符,以便在输入不合适时尽力而为。解决方案是告诉MIIME :: Lite使用base64(或$mime_msg->attach( Type => 'text/html', Encoding => 'quoted-printable', Data => $bodyWithNoCR) or die "$!\n"; )编码。

Encoding => 'quoted-printable'

[在评论中OP明确表示他的意思是&#34;换行&#34;当你说&#34; CR&#34;。然而,OP仍然提到CR,所以我在这里留下这段。]

至于回程,我在添加$bodyWithCR之前没有得到任何回报。我怀疑你的$bodyWithCR没有回车,并且该错误是你检查它的方法。具体来说,我认为您先将binmode打印到句柄上,而不先对其进行//Choice 1 public class Example{ private int x; // Class Constructor public Example(){ x = setX(); } private int setX(){ return 1; } } //Choice 2 public class Example{ private int x; // Class Constructor public Example(){ setX(); } private void setX(){ x = 1; } }