2

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

我正在寻找能够做的是替换 PHP 用来发送电子邮件的默认方法。

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

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

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

4

3 回答 3

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 文件的内容基本上是您需要解析的内容,以便您可以重新发送它,或者您可以将其直接传递给您使用的任何 MTA。注意我没有对这个例子中的参数做任何事情,所以不要忘记那些。

查看man sendmail有关该过程的更多文档。 是 PHP 中将邮件写入sendmail_path指令的函数的链接php.ini,它可以帮助您了解调用时会发生什么mail()

希望有帮助。

于 2012-07-11T18:27:39.750 回答
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

享受和好运!

于 2012-07-11T18:05:44.383 回答
1

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

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

于 2012-07-11T18:17:10.370 回答