修剪PHP Mailer标题中的电子邮件地址

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (46)

我正在使用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>";
提问于
用户回答回答于

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])
         . '>';
}

并使用电子邮件格式化......没有什么可以做的。

因此,如果您确实需要更改该行为并仍想使用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]);
    }
}   
}   

扫码关注云+社区

领取腾讯云代金券