我在 perl 中使用 sendmail 并注意到(在头撞墙之后)当脚本在命令行运行时,它需要您在电子邮件和收件人的电子邮件地址之后省略 \n(s)为了正确格式化邮件,但是当通过 CGI 运行时,如果那些 \n(s) 不存在,它会返回一个错误,指出收件人的电子邮件格式不正确。
有人遇到过这种情况么?两人在做什么不同?
我敢打赌,您是从命令行的提示中获取数据,而不是像这样咀嚼它们:
my $send_to = <>;
这意味着 $send_to 已经有一个“\n”。为了使它们都以相同的方式工作,请选择变量:
my $send_to = <>;
chomp($send_to);
要不就
chomp(my $send_to = <>);
数据从何而来?硬编码在脚本中,还是来自网络表单?
顺便说一句,如果您从网络表单中获取收件人的电子邮件地址,您的表单将被垃圾邮件发送者使用。这是 100% 的保证。
术语“CGI”很宽泛,如果你的意思是你的 perl 脚本作为 CGI 运行而不是你的 perlscript 在命令行运行,我会关注脚本的路径及其一般继承环境。特别是如果您以不同的用户 ID 运行它。如果网络服务器在 chroot 中,等等。
use Data::Dumper;
warn(Dumper(\%ENV));
所以我猜你有这样的东西可以通过命令行运行它:
my $your_email = "you@foo.bar";
my $recipient_email = "them@foo.bar";
当“通过 CGI 运行”时:
my $your_email = "you@foo.bar\n";
my $recipient_email = "them@foo.bar\n";
所以我要问你的问题是你如何使用上述变量调用 sendmail,以及当你说“通过 CGI 运行”与通过命令行运行时你的意思是什么?您是否只是添加 CGI 代码并仍然通过命令行或在 Web 浏览器中访问其 URL 来运行?
在您的一些评论中,您提到您正在使用 -l 选项(perl -l foo.cgi)从命令行运行脚本。
-l 选项启用自动行尾处理,并且由于您的问题是行尾,我建议您尝试不使用 -l。