Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 通过电子邮件发送大量文本:“quot;“参数列表太长”;_Linux_Bash_Shell_Perl - Fatal编程技术网

Linux 通过电子邮件发送大量文本:“quot;“参数列表太长”;

Linux 通过电子邮件发送大量文本:“quot;“参数列表太长”;,linux,bash,shell,perl,Linux,Bash,Shell,Perl,我的问题是关于通过Gmail发送大量的电子邮件文本 我正在开发一个简单的应用程序,它需要能够执行HTTPGET请求,并使用gmail帐户将收到的HTML作为文本发送。我相信我正在使用SSMTTP通过gmail发送文本,并且我使用perl的LWP::UserAgent来执行GET请求。当我执行Perl代码时,由于发送了大量文本,我收到以下错误: 无法执行“/bin/sh”:参数列表太长 我的互联网搜索找到了以下来源: 这使我更好地理解了约束条件,但由于以下原因,这并不能真正解决我的问题

我的问题是关于通过Gmail发送大量的电子邮件文本

我正在开发一个简单的应用程序,它需要能够执行HTTPGET请求,并使用gmail帐户将收到的HTML作为文本发送。我相信我正在使用SSMTTP通过gmail发送文本,并且我使用perl的
LWP::UserAgent
来执行GET请求。当我执行Perl代码时,由于发送了大量文本,我收到以下错误:

无法执行“/bin/sh”:参数列表太长

我的互联网搜索找到了以下来源:

这使我更好地理解了约束条件,但由于以下原因,这并不能真正解决我的问题:

  • 我无法重新编译内核
  • 我无法使用
    find
    或我自己的bash函数等将其“分解为更小的部分”
我正试图让这项工作的要求与大量的文本

下面是我的Perl代码的摘录:

    # 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,这是正确的。