什么';通过CGI发送邮件与通过Perl发送邮件有什么区别?

什么';通过CGI发送邮件与通过Perl发送邮件有什么区别?,perl,sendmail,Perl,Sendmail,我在perl中使用sendmail,并注意到(在多次头部撞击墙壁之后)当脚本在命令行上运行时,需要您在电子邮件和收件人的电子邮件地址之后省略\n,以便正确格式化邮件,但在通过CGI运行时,如果这些\n它会返回一个错误,指出收件人的电子邮件格式不正确 还有其他人遇到过这种情况吗?两者有什么不同之处?数据来自哪里?在脚本中硬编码,还是从web表单中硬编码 顺便说一句,如果你从网络表单中获得收件人的电子邮件地址,你的表单将被垃圾邮件发送者使用。这是100%的保证。我敢打赌,您是从命令行中的提示中获取数

我在perl中使用sendmail,并注意到(在多次头部撞击墙壁之后)当脚本在命令行上运行时,需要您在电子邮件和收件人的电子邮件地址之后省略\n,以便正确格式化邮件,但在通过CGI运行时,如果这些\n它会返回一个错误,指出收件人的电子邮件格式不正确


还有其他人遇到过这种情况吗?两者有什么不同之处?

数据来自哪里?在脚本中硬编码,还是从web表单中硬编码


顺便说一句,如果你从网络表单中获得收件人的电子邮件地址,你的表单将被垃圾邮件发送者使用。这是100%的保证。

我敢打赌,您是从命令行中的提示中获取数据,而不是像这样对它们进行加密:

my $send_to = <>;
my$send_to=;
这意味着$send\u to将已经有一个“\n”。要使它们以相同的方式工作,请选择变量:

my $send_to = <>;
chomp($send_to);
my$send_to=;
chomp($send_to);
或者只是

chomp(my $send_to = <>);
chomp(我的$send_to=);
术语“CGI”很宽泛,如果您指的是作为CGI运行的perl脚本,而不是在命令行上运行的yur perlscript,那么我将关注脚本的路径及其一般继承环境。尤其是当您将其作为不同的用户ID运行时。如果Web服务器位于chroot中,等等

use Data::Dumper;
warn(Dumper(\%ENV));

我猜您可以通过命令行运行它:

my $your_email = "you@foo.bar";
my $recipient_email = "them@foo.bar";
当“通过CGI运行”时:


因此,我想问你的问题是,你如何使用上述变量调用sendmail,以及你说“通过CGI运行”与通过命令行运行是什么意思?您只是添加了CGI代码,并且仍然通过命令行运行还是通过在web浏览器中访问其URL来运行?

在您的一些评论中,您提到您正在使用-l选项(perl-l foo.CGI)从命令行运行脚本


-l选项启用自动行尾处理,由于您的问题是行尾,我建议您在不使用-l的情况下尝试使用它。

如果您发布脚本的相关部分,将更容易看到no。。。我不会在没有确定的情况下发布这个问题。数据最终将来自用户,但为了测试的目的,我只是对值进行硬编码。那么,您是否使用换行符对它们进行硬编码?你在问是什么导致了这一切,却没有真正的线索,除了一堆猜测,你还能指望什么?已经有换行符的变量可能会导致问题。接下来要查找的是,当您运行commandline vs.CGI.interest时,环境是否不同。是的,它是一个带有cgi扩展的perl脚本。当我像so>perl-lfoo.cgi[enter]那样运行它时,它坚持将to字段设置为“to:foo@bar.com“但是,当我通过浏览器运行它时,它会失败,除非它”要:foo@bar.com\n“我不确定环境与它有什么关系,但我会仔细研究一下。为什么要使用“perl-l”?l选项会弄乱行尾,这可能会导致不同的行为。我正在以标准规定的方式打印sendmail。我正在运行同一个文件,只是在运行之间更改它。当我说CGI时,我的意思是,我通过浏览器调用它,chmoded它+x和765。在命令行中,我只是以perl-lfoo.cgi的形式运行它
my $your_email = "you@foo.bar\n";
my $recipient_email = "them@foo.bar\n";