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/&/&/gi; # & to &
$input =~ s/</</gi; # < to <
$input =~ s/>/>/gi; # > to >
$input =~ s/"/"/gi; # " to "
$input =~ s/'/'/gi; # ' to '
$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)
我不认为它发生在你的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>大脑放屁.现在好点了?