模拟通过phpmailer成功发送($ mail-> Send())

时间:2018-07-24 12:48:38

标签: php phpmailer

在本地服务器上构建和测试网站时,我想模拟通过phpmailer的成功发送,因此避免实际发送电子邮件。

我通常使用if ($mail->Send()) { the mail was sent, now do this }

对于本地测试,我认为最好的方法是跳过整个phpmailer包含,而不是添加很多if语句等。

但是跳过phpmailer会导致php抱怨$mail->Send()$mail->addAddress('emailaddress')等。

我该如何伪造函数(或对象/类),以使对$mail->Send()的调用始终为true,而其余的$mail->something()等仅被忽略/ true,从而不发送电子邮件?

2 个答案:

答案 0 :(得分:2)

扩展PHPMailer类并覆盖public function send()

class UnitTestMailer extends PHPMailer {

    public function send() {
        return $this;
    }

}

class User {
   public function __construct(PHPMailer $mailer) {
      $this->mailer = $mailer;
   }

   public function sendActiviation() {
      return $this->mailer->send();
   }
}

// ... somewhere in your test
public function test_if_from_is_properly_set() {
    // ...
    $user = new User(new UnitTestMailer);
    // ...
    $mailer = $user->sendActivation();
    $this->assertEquals($expectedFrom, $mailer->From);
}

答案 1 :(得分:0)

为什么要模仿?

我根据环境使用INI文件为PHPMailer提供配置变量。 Live显然具有服务器的邮件设置。本地使用我的Gmail帐户凭据发送邮件。

您可以两全其美:)


例如在工作目录中的某个位置保留一个config.ini文件(我倾向于使用root,但这是首选项),并确保它位于您的.gitignore或类似文件中。您的本地版本如下所示:

[PHPMailer Settings]
EMAIL_HOST = "smtp.gmail.com"
EMAIL_PORT = 587
EMAIL_SMTPSECURE = "tls"
EMAIL_SMTPAUTH = "true"
EMAIL_USERNAME = "my_email@gmail.com"
EMAIL_PASSWORD = "my_password"

然后在您的PHP中:

  
$ini = parse_ini_file($_SERVER['DOCUMENT_ROOT'] . "/config.ini", true, INI_SCANNER_TYPED);

// use settings from INI file:

$foo = $ini['PHPMailer Settings']['EMAIL_HOST'];
$bar = $ini['PHPMailer Settings']['EMAIL_PORT'];

安全奖金

将INI文件的语法更改为如下所示,并将其重命名为config.ini.php

; <?php
; die();
; /*
[PHPMailer Settings]
EMAIL_HOST = "smtp.gmail.com"
EMAIL_PORT = 587
EMAIL_SMTPSECURE = "tls"
EMAIL_SMTPAUTH = "true"
EMAIL_USERNAME = "my_email@gmail.com"
EMAIL_PASSWORD = "my_password"
; */ ?>

(请记住在PHP代码中使用新文件名)

PHP仍然可以解析设置,但是如果有人尝试访问INI文件,它将被解析为PHP注释并仅显示";"