用自定义版本替换PHP邮件功能

时间:2012-07-11 17:59:59

标签: php sendmail

我目前正在开发一个电子邮件服务器程序,该程序将跟踪通过我的网站/网络应用程序发送的电子邮件,并重试因SMTP错误而可能失败的任何邮件。

我正在考虑的是替换PHP用于发送电子邮件的默认方法。

我尝试创建一个与邮件功能具有相同参数的php脚本,并将此脚本添加到php.ini文件中的sendmail路径,但是当我尝试这个时,浏览器就是他们没有做任何事情。

这个想法是用户只需要重新配置php来使用我自己的版本而不必编写不同的代码,即他们可以使用与他们目前用来通过php发送电子邮件完全相同的代码而不是php做发送,它只是将我自己的版本所需的详细信息传递给电子邮件服务器。

这是可能的,感谢您提供的任何帮助

3 个答案:

答案 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/runkit

参考http://ca.php.net/manual/en/function.runkit-function-redefine.php

否则,您也可以试着给override_function一个镜头。

参考http://php.net/manual/en/function.override-function.php

享受并祝你好运!

答案 2 :(得分:1)

我已经使用了一段时间而我喜欢它。

http://sourceforge.net/projects/phpmailer/