Trim 来自 PHP 邮寄者的 header 的电子邮件地址
Trim email address from header of 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>";
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 是做不到的。但是你可以写你自己的subclass。
可能是沿着这些路线
<?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]);
}
}
}
我正在使用 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])
. '>';
}
并使用电子邮件格式化...对此您无能为力。
所以使用 phpmailer 是做不到的。但是你可以写你自己的subclass。 可能是沿着这些路线
<?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]);
}
}
}