我目前正在开发一个电子邮件服务器程序,该程序将跟踪通过我的网站/网络应用程序发送的电子邮件,并重试因SMTP错误而可能失败的任何邮件。
我正在考虑的是替换PHP用于发送电子邮件的默认方法。
我尝试创建一个与邮件功能具有相同参数的php脚本,并将此脚本添加到php.ini文件中的sendmail路径,但是当我尝试这个时,浏览器就是他们没有做任何事情。
这个想法是用户只需要重新配置php来使用我自己的版本而不必编写不同的代码,即他们可以使用与他们目前用来通过php发送电子邮件完全相同的代码而不是php做发送,它只是将我自己的版本所需的详细信息传递给电子邮件服务器。
这是可能的,感谢您提供的任何帮助
答案 0 :(得分:3)
基本上,您需要创建自己的与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文件的内容基本上是你需要parse所需要的,所以你可以重新发送它,或者你可以将它直接传递给你使用的任何MTA。注意我对这个例子中的参数没有做任何处理,所以不要忘记这些。
请查看man sendmail
以获取有关该流程的更多文档。 Here是PHP中函数的链接,用于将邮件写入sendmail_path
中的php.ini
指令,它可以帮助您了解调用mail()
时会发生什么。
希望有所帮助。
答案 1 :(得分:1)
如果您安装了runkit
扩展程序,则可能有兴趣使用runkit_function_redefine
覆盖email
功能。不幸的是,使用PHP,不支持本机覆盖函数。
参考:http://ca.php.net/manual/en/function.runkit-function-redefine.php
否则,您也可以试着给override_function
一个镜头。
参考:http://php.net/manual/en/function.override-function.php
享受并祝你好运!
答案 2 :(得分:1)
我已经使用了一段时间而我喜欢它。