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

| 我正在网上进行维护,以在Perl中完成(我不了解Perl)。表格中的详细信息会通过电子邮件发送给他人处理。测试人员在电子邮件中返回此错误:   大块文字插入了虚假字符。大约在1961年触发   每个文本字段或文本区域中的字符。感叹号和空格插入   大约1961年,然后间隔八个字符,然后大约每2048个字符重复一次。 因此,我尝试重复此错误,这是它返回的内容(字符1960-1970):   一种!德夫吉 我不知道会导致这种情况发生的原因。我认为“修复”的唯一方法是这样做:
if (length($someInput) gt 1500){
    $someInput=substr($someInput, 0, 1500);
}
有谁知道是什么原因导致这种情况在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
}
编辑这是通过电子邮件发送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);
}
    
已邀请:
我认为这不会在您的Perl程序中发生。 在尝试通过管道将内容发送到sendmail之前,我已经看到了这一点。邮件规格中有行长限制,但我实际上怀疑sendmail使用的是2048字节输入缓冲区。 重点是,在将管道中的所有换行符传送到sendmail之前,都将其删除(将其转换为
<br>
)。别。也许将其添加为最后一个替代:
    $input =~ s/<br>/<br>\\r\\n/gi;                      # break up the single line
(事实上​​,您到第一个前5个字符的距离比下一个前5个字符的距离小,这让我怀疑sendmail将前HTML比特算作同一行的一部分-RFC 822格式要求使用6个换行符)。 另外,如果用户可能输入的3kb rant没有换行符,则您可能希望在空白处换行,而不是在原始换行符上换行。 编辑:刚注意到我的正则表达式带走了
<br>
-脑子放屁。现在好点了?     
Perl似乎不太可能(不可能)随机执行此操作。代码中必须存在错误,或者在将数据馈送到perl的任何过程中都必须存在错误。 没有足够的信息来进一步推测。     
乍一看,这些正则表达式在我看来好像会失去第一个正则表达式?中的字符:
$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/<![\\s\\S]*?--[ \\t\\n\\r]*>//gi;     # strip out multi-line comments
[\\ s \\ S]中的\\ S可以匹配多行注释的末尾,因为\\ S可以匹配[->]字符。     

要回复问题请先登录注册