Обрезать адрес электронной почты из заголовка PHP Mailer - PullRequest
0 голосов
/ 12 июня 2018

Я использую PHPMailer для отправки электронной почты своим клиентам.Но я не удовлетворен выводом

enter image description here

Я хочу удалить <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>";

1 Ответ

0 голосов
/ 13 июня 2018

Соответствующие части в коде 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 и массивсодержащий один адресный массив [электронная почта, имя])

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