本质上,您需要创建自己的与 PHP 兼容的 sendmail 样式包装器。当 PHP 调用sendmail
发送邮件时,它会打开一个进程,并将消息数据写入 sendmail,它对消息执行任何操作。
您将需要重新解析消息以发送它,或者在您为消息登录/帐户后将其按原样转发到您的 MTA。
这是一个不支持任何选项的示例脚本,但如果您想走这条路,应该可以帮助您入门:
#!/usr/bin/php -q
<?php
// you will likely need to handle additional arguments such as "-f"
$args = $_SERVER['argv'];
// open a read handle to php's standard input (where the message will be written to)
$fp = fopen('php://stdin', 'rb');
// open a temp file to write the contents of the message to for example purposes
$mail = fopen('/tmp/mailin.txt', 'w+b');
// while there is message data from PHP, write to our mail file
while (!feof($fp)) {
fwrite($mail, fgets($fp, 4096));
}
// close handles
fclose($fp);
fclose($mail);
// return 0 to indicate acceptance of the message (not necessarily delivery)
return 0;
此脚本需要可执行,因此将其权限设置为755
.
现在,编辑php.ini
指向这个脚本(例如sendmail_path = "/opt/php/php-sendmail.php -t -s"
)
现在在另一个脚本中,尝试 sendmail 一条消息。
<?php
$ret = mail('drew@example.com', 'A test message', "<b>Hello User!</b><br /><br />This is a test email.<br /><br />Regards, The team.", "Content-Type: text/html; charset=UTF-8\r\nX-Mailer: MailerX", '-fme@example.com');
var_dump($ret); // (bool)true
调用之后, 的内容/tmp/mailin.txt
应该包含类似于以下内容:
To: drew@example.com
Subject: A test message
X-PHP-Originating-Script: 1000:test3.php
Content-Type: text/html; charset=UTF-8
X-Mailer: MailerX
<b>Hello User!</b><br /><br />This is a test email.<br /><br />Regards, The team.
上述 txt 文件的内容基本上是您需要解析的内容,以便您可以重新发送它,或者您可以将其直接传递给您使用的任何 MTA。注意我没有对这个例子中的参数做任何事情,所以不要忘记那些。
查看man sendmail
有关该过程的更多文档。 这是 PHP 中将邮件写入sendmail_path
指令的函数的链接php.ini
,它可以帮助您了解调用时会发生什么mail()
。
希望有帮助。