Linux 通过电子邮件发送大量文本:“quot;“参数列表太长”;
我的问题是关于通过Gmail发送大量的电子邮件文本 我正在开发一个简单的应用程序,它需要能够执行HTTPGET请求,并使用gmail帐户将收到的HTML作为文本发送。我相信我正在使用SSMTTP通过gmail发送文本,并且我使用perl的Linux 通过电子邮件发送大量文本:“quot;“参数列表太长”;,linux,bash,shell,perl,Linux,Bash,Shell,Perl,我的问题是关于通过Gmail发送大量的电子邮件文本 我正在开发一个简单的应用程序,它需要能够执行HTTPGET请求,并使用gmail帐户将收到的HTML作为文本发送。我相信我正在使用SSMTTP通过gmail发送文本,并且我使用perl的LWP::UserAgent来执行GET请求。当我执行Perl代码时,由于发送了大量文本,我收到以下错误: 无法执行“/bin/sh”:参数列表太长 我的互联网搜索找到了以下来源: 这使我更好地理解了约束条件,但由于以下原因,这并不能真正解决我的问题
LWP::UserAgent
来执行GET请求。当我执行Perl代码时,由于发送了大量文本,我收到以下错误:
无法执行“/bin/sh”:参数列表太长
我的互联网搜索找到了以下来源:
- 我无法重新编译内核
- 我无法使用
或我自己的bash函数等将其“分解为更小的部分”find
# Uses ssmtp to send an email
sub sendEmail{
my ($destination, $subject, $body) = @_;
#say $destination; say $subject;say $body;
# Create the bash command
my $command="echo \'$body\' | mail -s \'$subject\' $destination";
say "\nExecuting shell command: $command";
my $output = qx($command);
}
我知道理想情况下我不应该发送带有html文本的电子邮件。这是我被要求做的,所以我正试图按照要求去做。您不需要通过shell来实现这一点。使用perl的open:
open (my $pipe, "|-", "mail", "-s", $subject, $destination) or die "Could not run mail: $!";
print $pipe $body;
close $pipe or die $?;
或尝试或寻求更多的控制
编辑:按照@chepner++的建议,将open替换为列表形式。当您不需要任何shell语法(如重定向)时,这通常更安全。更好的是,尽可能使用列表形式(
打开我的$pipe,“-”、“mail”、“-s”、$subject、$destination
),以完全避免shell参与。将未知文本替换到shell命令中是非常不安全的。如果您的正文
包含'$(rm-rf~)'
(以echo\'
开头的文字引号结尾),这可能会产生灾难性的结果。(如果$body
是由shell扩展的,那么它是安全的,但在原始代码中不是这样的——在调用shell之前,它是由Perl扩展的。)Woah@CharlesDuffy很好。我没有想到。我是perl/bash新手,还在学习语言的语义。我不知道你可以在扩展它之前将变量传递给shell。如果这是一个愚蠢的问题,很抱歉,但是可以帮我解决语法问题吗?我只是尝试搜索互联网,没有找到任何东西ng.实际上这是另一个问题。您需要像在系统(“echo\$HOME”);
中一样转义$
。然后shell将在系统(“echo$HOME”)中计算$HOME
Perl将对其进行求值。但要实现此目的,$HOME
必须在shell或Perl脚本中已知。正如PerlDuck所说——要通过shell传递变量进行扩展,请将它们作为显式参数列表向量成员(并在shell脚本中将它们称为$1
,$2
,等等。使用适当的转义来防止perl首先尝试扩展它们)但这两种方法在这里都不起作用,因为环境变量存在于用于命令行参数的有限空间中;tinita的答案是经过编辑的,在stdin上输入内容,完全避免使用shell,这是正确的。