【发布时间】:2012-03-27 03:00:08
【问题描述】:
我在 LAMP 环境中工作,系统会发送大量电子邮件通知。我想要一种方法来阻止 PHP 在我的开发环境中发送实际的电子邮件。现在,我正在注释掉所有的 mail() 行,但这开始引起下游 QA 人员的困惑,因为他们正在删除注释掉的行并将它们推送给测试人员。
有什么简单的方法在 PHP 中禁用 sendmail 而不会引发错误?
【问题讨论】:
标签: php development-environment sendmail
我在 LAMP 环境中工作,系统会发送大量电子邮件通知。我想要一种方法来阻止 PHP 在我的开发环境中发送实际的电子邮件。现在,我正在注释掉所有的 mail() 行,但这开始引起下游 QA 人员的困惑,因为他们正在删除注释掉的行并将它们推送给测试人员。
有什么简单的方法在 PHP 中禁用 sendmail 而不会引发错误?
【问题讨论】:
标签: php development-environment sendmail
你为什么不直接使用 Mailerclass:
class MyMailer {
private static $is_development_state = true;
public static function mail(...) {
if (self::$is_development_state) {
...
}
}
}
我的意思是:将邮件重构为 MyMailer::mail 可以为您完成所有 IDE ;)
【讨论】:
解决您的问题的另一种方法是将本地后缀设置为本地交付。每封电子邮件都会发送到您的本地电子邮件帐户!
https://serverfault.com/questions/137591/postifx-disable-local-delivery
【讨论】:
你也可以尝试在 PHP 中使用 override_function 方法:
http://php.net/manual/en/function.override-function.php
它允许您将 mail() 函数降级为虚拟函数。这样什么都不会发生,但是如果您为生产环境注释 override_function,代码仍然可以在生产环境中工作。
【讨论】:
你也可以像here 描述的那样设置一个小的 php 脚本来写邮件到var/log/mails:
#!/usr/bin/php
<?php
$input = file_get_contents('php://stdin');
preg_match('|^To: (.*)|', $input, $matches);
$filename = tempnam('/var/log/mails', $matches[1] . '.');
file_put_contents($filename, $input);
将脚本放入/usr/local/bin/sendmail,使其可执行并放入行
sendmail_path = /usr/local/bin/sendmail
在你的php.ini
【讨论】: