首页 > 解决方案 > 从 PHP Mailer 的标题中修剪电子邮件地址

问题描述

我正在使用 PHPMailer 向我的客户发送电子邮件。但我对输出的结果不满意

在此处输入图像描述

我想<michael@gmail.com>在我的名字末尾删除,但不知道该怎么做。

我当前的脚本:

$mail->SetFrom("michael@gmail.com",'Michael Chu');
$mail->XMailer = 'Microsoft Mailer';
$mail->AddAddress($email);
$mail->Subject = "TEST Email";
$mail->Body = "<p>TEST Email<p>";

标签: phpphpmailer

解决方案


PHPMailer 代码中的相关部分在 Pre Send 例程中,该例程组装邮件(显然总是在发送之前在内部调用):

public function preSend() {
    ...
    try {
        $this->error_count = 0; // Reset errors
        $this->mailHeader = '';
    ...         
        // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
        $this->MIMEHeader = '';
        $this->MIMEBody = $this->createBody();
        // createBody may have added some headers, so retain them
        $tempheaders = $this->MIMEHeader;
        $this->MIMEHeader = $this->createHeader();
        $this->MIMEHeader .= $tempheaders;
    ...         
    return true;

这将始终被调用。现在:当我们查看 createHeader 函数时,我们会看到:

public function createHeader()
{
    $result = '';
    ...
    $result .= $this->addrAppend('From', [[trim($this->From), $this->FromName]]);
    ...
    return $result;
}

所以: Create Header 总是添加 From Address 部分,但它依赖于 addrAppend 来格式化它(传递 'From' 和一个包含一个地址数组 [email, name] 的数组)

public function addrAppend($type, $addr)
{
    $addresses = [];
    foreach ($addr as $address) {
        $addresses[] = $this->addrFormat($address);
    }
    return $type . ': ' . implode(', ', $addresses) . static::$LE;
}

地址数组被传递:

public function addrFormat($addr)
{
    if (empty($addr[1])) { // No name provided
        return $this->secureHeader($addr[0]);
    }
    return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') .
         ' <' . 
         $this->secureHeader($addr[0])
         . '>';
}

并用电子邮件格式化......你无能为力。

所以用phpmailer你不能这样做。但是您可以编写自己的子类。可能是这样的

<?php

//Import PHPMailer classes into the global namespace
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require '../vendor/autoload.php';
/**
 * Use PHPMailer as a base class and extend it
 */
class myPHPMailer extends PHPMailer
{

public function addrFormat($addr)
{
    if (empty($addr[1])) { // No name provided
            return $this->secureHeader($addr[0]);
        }
    else {          
            return $this->secureHeader($addr[1]);
    }
}   
}   

推荐阅读