如何通过命令行管道发送邮件


9

我有一个运行文件的cron命令,我正在尝试设置输出,以便通过电子邮件发送给我。我将其与不想修改直接文件的第三方脚本一起使用,因此我需要通过管道传递输出,而不是修改PHP。

我正在从使用的服务器迁移到使用mail的服务器sendmail。我正在努力寻找如何通过命令行将主题正确发送到sendmail的方法。

/usr/local/bin/php -f /path/to/file.php 2>&1 | /usr/sbin/sendmail -s "My Test Email Subject" test@email.com

sendmail是系统用来路由由提交给它的邮件的二进制文件mail。它是sendmailpostfixexim等程序集的一部分。因此,您需要安装适当的邮件包。因此,请告诉我们您正在使用的linux发行版。
adamo 2012年

UNIX / Linux的所有POSIX兼容形式都应提供一些名为“ sendmail”的可执行文件,并采用与sendmail功能的子集兼容的一组特定选项(包括-t选项,如下面的timday所述)。Exim,Postfix和qmail都提供了这些---例如,有时它们将安装在/ usr / libexec / sendmail下,而不是/ usr / bin或/ usr / sbin下。
Jim Dennis

Answers:


3

/ usr / sbin / sendmail

错了

您应该在某处有一个mail命令。可以称为mailx。应该在/bin/目录中。按照标准惯例,php脚本绝不应在/sbin或中调用任何内容/usr/sbin。sbin程序通常用于root用户。

另外,php具有内置的mail函数


如果不是,mail或者mailx可能是Mail。但是,即使这些不存在,您也可以安装mutt并运行mutt -xemulates mailx
adamo 2012年

这是正确的...确定了我的路径,我跑which mail了回来/bin/mail
Webnet 2012年

2
sendmail是更好的方法(这是Posix标准)……但是最好使用sendmail -t(从输入流中获取标头)。通过允许发送邮件的程序仅与sendmail实用程序进行交互而根本不调用任何shell,这避免了许多可能的shell变量插值漏洞。有关详细信息,请参见“ timday的”答案。
Jim Dennis 2014年

13

在我的Debian系统上(具有Exim而不是“真实” sendmail,但仍具有sendmail二进制文件以实现兼容性),当我想从脚本发送邮件时,我要做的事情等同于:

cat <<EOF | sendmail -t
To: recipient@example.com
Subject: Testing
From: sender@example.com

This is a test message
EOF

请注意,空白行很重要。


1
空行用于将消息的标题部分与消息正文分开。为什么不sendmail -t <<EOF呢?
adamo 2012年

@adamo:因为它更接近原始问题中的模式,所以可以使用“ |”将其传递到sendmail中 (实际上,我自己做的地方通常是generate_test_message.sh | sendmail -t)。
2012年

2
这是在UNIX下安全地发送程序邮件的规范方法。
Jim Dennis

终于有了sendmail的工作示例!谢谢!
内部力量

如果sendmail失败并写入STDERR,我如何将其捕获为变量以供稍后在脚本中使用?
streetster '19

1
echo -e "This is my body\nSecond line" 2>&1 | sed '1!b;s/^/To: test@email.com\nSubject: My Test Email Subject\n\n/' | sendmail -t

echo =电子邮件的正文。
sed stuff =应用电子邮件标题,以及正文和标题之间的重要双线。
sendmail -t =直接通过sendmail传递它。


-1
php -f file.php 2>&1 | sed 's/^/To: test@email.com\nSubject: My Test Email Subject\n\n/' | sendmail -t

1
嗨,欢迎来到服务器故障。也许您可以详细说明您的答案?
slm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.