Perl将虚假字符插入电子邮件中的大块文本中

Tim*_*hle 1 string perl html-email

我在网上完成了在Perl中完成的操作(我对Perl一无所知).表单中的详细信息将通过电子邮件发送给某人处理.测试人员在电子邮件中回复了这个错误:

大块文本插入了虚假字符.在每个文本字段或文本区域中触发大约1961个字符.在大约1961年插入感叹号和空格,然后在8个字符后插入空格,然后大约每2048个字符重复一次.

所以我试图重复这个错误,这就是它返回的内容(角色1960 - 1970):

一个!defghij

我不知道是什么原因导致这种情况发生.我能想到"修复"它的唯一方法是这样做:

if (length($someInput) gt 1500){
    $someInput=substr($someInput, 0, 1500);
}
Run Code Online (Sandbox Code Playgroud)

有谁知道在Perl中发生这种情况的原因,以及我如何解决它?

编辑 这是我运行每个字段的功能.然后它就会被放入电子邮件html中.

#sanitises and returns the given input
sub sanitiseInput {
    my ($input) = @_;
    $input = trim(param($input));
    $input = HTML::Entities::decode($input);
    $input =~ s/<script[^>]*?>.*?<\/script>//gi; # strip out javascript
    $input =~ s/<style[^>]*?>.*?<\/style>//gi;   # strip out styles
    $input =~ s/<![\s\S]*?--[ \t\n\r]*>//gi;     # strip out multi-line comments
    $input =~ s/&/&amp;/gi;                      # & to &amp;
    $input =~ s/</&lt;/gi;                       # < to &lt;
    $input =~ s/>/&gt;/gi;                       # > to &gt;
    $input =~ s/"/&#34;/gi;                      # " to &#34;
    $input =~ s/'/&#39;/gi;                      # ' to &#39;
    $input =~ s/\r\n/<br>/gi;                    # return and newline to <br>
    $input =~ s/\r/<br>/gi;                      # return to <br>
    $input =~ s/\n/<br>/gi;                      # newline to <br>
    return $input;                               #return the new value
}
Run Code Online (Sandbox Code Playgroud)

编辑这是电子邮件html的功能

sub mailer {
    my ($from_eddress, $to_eddress, $subject, $mail_content, $fail_eddress)=@_;
    open(MAIL, "|/usr/sbin/sendmail -f $from_eddress $to_eddress") or print "Cannot fork to mail - $!\n";
    print MAIL "From: $from_eddress\n";
    print MAIL "To: $to_eddress \n";
    print MAIL "Subject: $subject\n";
    if ($fail_eddress != '') { print MAIL "fail-to: $fail_eddress\n"; }
    print MAIL "Content-type: text/html\n\n";
    print MAIL "\n";
    print MAIL "<html><head><style>body, p, th, td {font-size: 0.75em; font-family:  Arial, Helvetica, sans-serif;} a {font-size: 1em; font-family:  Arial, Helvetica, sans-serif;} .large{font-size: 1.2em;} .small{font-size: .8em;} </style></head><body>";
    print MAIL "$mail_content";
    print MAIL "</body></html>";
    close (MAIL);
}
Run Code Online (Sandbox Code Playgroud)

LHM*_*ies 5

我不认为它发生在你的Perl程序中.

我之前在尝试通过将它传递给sendmail来邮件时看到过这个.邮件规范中有一个行长度限制,但我实际上怀疑sendmail使用的是2048字节的输入缓冲区.

重点是,在将其传输<br>到sendmail之前,您要从输入中删除所有换行符(将它们转换为).别.也许将其添加为最后一个替换:

    $input =~ s/<br>/<br>\r\n/gi;                      # break up the single line
Run Code Online (Sandbox Code Playgroud)

(事实上​​你到第一个距离!比下一个距离更远,这让我怀疑sendmail将前导HTML位作为同一行的一部分 - RFC 822格式要求换\r\n行).

此外,如果用户可能输入没有换行符的3kb rant,您可能希望在原始空格分隔符上打破空格而不是原始换行符.

编辑:刚刚注意到我的正则表达式带走了<br>大脑放屁.现在好点了?