代码之家  ›  专栏  ›  技术社区  ›  mowgli

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

  •  2
  • mowgli  · 技术社区  · 6 年前

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

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

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

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

    我如何伪造函数(或对象/类),以便调用 $mail->发送() 都是真的,其余的都是真的 $mail->something() 等等被忽略/为真,所以不发送电子邮件?

    2 回复  |  直到 6 年前
        1
  •  2
  •   steros    6 年前

    扩展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);
    }
    
        2
  •  0
  •   Community Mr_and_Mrs_D    4 年前

    为什么要效仿?

    我使用INI文件根据环境为PHPMailer提供配置变量。Live显然有服务器的邮件设置。Local使用我的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注释并显示 ";"