В symfony 1.4, используя swiftmailer, setTo со скобками в имени прерывает отправку сообщения

У меня возникают проблемы с отправкой почты с помощью быстрой почтовой программы, когда имя получателя содержит круглые скобки ( и )

пример кода:

$mail = new Swift_Message();
$mail->setTo('[email protected]', 'Recipient (bla bla)');
$mail->setFrom('[email protected]', 'Sender');
$mail->setSubject('Test email');
$mail->setBody('<html><body><h3>Hello</h3></body></html>', 'text/html');
sfContext::getInstance()->getMailer()->send($mail);

Если получатель использует gmail, он получает электронное письмо, но при нажатии на стрелку вниз для получения дополнительной информации часть Кому: пуста:

Отсутствует: часть

Проблема в том, что некоторые другие почтовые службы не получают это письмо.

Что касается исходного содержания сообщения, то здесь слишком много деталей, чтобы затемнить их, но в основном мой вопрос заключается в том, как я могу использовать круглые скобки, не нарушая ничего.


person bksunday    schedule 21.06.2013    source источник


Ответы (1)


Похоже, base64_encode может помочь, поэтому я изменил класс swiftmailer SimpleMessage.php, чтобы это исправление применялось каждый раз.

Изменение SimpleMessage из этого:

public function setTo($addresses, $name = null)
{
  if (!is_array($addresses) && isset($name))
  {
    $addresses = array($addresses => $name);
  }

  if (!$this->_setHeaderFieldModel('To', (array) $addresses))
  {
    $this->getHeaders()->addMailboxHeader('To', (array) $addresses);
  }
  return $this;
}

К этому:

public function setTo($addresses, $name = null)
{
  // if $name is set, encode it
  if(isset($name))
  {
    $name = $this->encodeName($name);
  }

  // if $addresses is an non numeric array (email => name), encode each name.
  if(is_array($addresses) && array_keys($addresses) !== range(0, count($addresses) - 1))
  {
    foreach($addresses as $key => $value)
    {
      $addresses[$key] = $this->encodeName($value);;
    }
  }

  if (!is_array($addresses) && isset($name))
  {
    $addresses = array($addresses => $name);
  }

  if (!$this->_setHeaderFieldModel('To', (array) $addresses))
  {
    $this->getHeaders()->addMailboxHeader('To', (array) $addresses);
  }
  return $this;
}

/**
 * Encode the name to avoid issues with some characters
 *
 * @param string $name
 * @return string
 */
private function encodeName($name)
{
  return "=?UTF-8?B?". base64_encode($name) . '?=';
}

Этот ответ помог мне: Base64 encode from name for email

person bksunday    schedule 21.06.2013