Отправка писем через Zend Mail без подписи DKIM и попадание в спам на qq.com

Я борюсь с отправкой электронной почты с ZF2. Дело в том, что все они хорошо работают в других почтовых клиентах, которые я тестировал, но в qq.com вся почта попадает в папку со спамом. Вот код, который я использую для отправки почты:

$mailTransportModel = $sl->get('MailTransportModel');

$transport = $mailTransportModel->getMailTransport($parameters['api_key']);
$messageIdHost = $config['mailServers'][$parameters['api_key']]['messageIdHost'];

$mail = new Zend\Mail\Message();
$mail->addTo($parameters['to'])
    ->setFrom($parameters['from_email'], $parameters['from_name'])
    ->setSubject(CommonLib::assignTemplateVariables($parameters['template']['subject'], $parameters['context_variables']));

if(!empty($parameters['replyto_email'])) {
    if(!empty($parameters['replyto_name'])) {
    $mail->addReplyTo($parameters['replyto_email'], $parameters['replyto_name']);
    } else {
    $mail->addReplyTo($parameters['replyto_email']);
    }
}

$headers = $mail->getHeaders();

$messageId = sha1($config['salt'] . microtime());
$headers->addHeaderLine('Message-Id', "<" . $messageId . "@" . $messageIdHost . ">");

$html = new Part(CommonLib::assignTemplateVariables($parameters['template']['body'], $parameters['context_variables']));

$body = new Zend\Mime\Message();

// Create HTML part
$html          = new Part(CommonLib::assignTemplateVariables($parameters['template']['body'], $parameters['context_variables']));
$html->type    = Mime::TYPE_HTML;
$html->charset = 'utf-8';

// Create plain text part
$stripTagsFilter   = new \Zend\Filter\StripTags();
$textContent       = str_ireplace(array("<br />", "<br>"), "\r\n", CommonLib::assignTemplateVariables($parameters['template']['body'], $parameters['context_variables']));
$textContent       = $stripTagsFilter->filter($textContent);
$textPart          = new Zend\Mime\Part($textContent);
$textPart->type    = Mime::TYPE_TEXT;

// Create separate alternative parts object
$alternatives           = new Zend\Mime\Message();
$alternatives->setParts(array($textPart, $html));
$alternativesPart       = new Zend\Mime\Part($alternatives->generateMessage());
$alternativesPart->type = Mime::MULTIPART_ALTERNATIVE . "; \n boundary=\"" . $alternatives->getMime()->boundary() . "\"";
$body->addPart($alternativesPart);
$mail->setBody($body);
$mail->setEncoding("UTF-8");

$headers->get('content-type')->setType('multipart/alternative');

$transport->send($mail);

А вот примеры заголовков из полученной почты:

Delivered-To: CUSTOMER_EMAIL
Received: by SOMEIP with SMTP id e9csp1233069oid;
        Thu, 2 Apr 2015 07:35:03 -0700 (PDT)
X-Received: by SOMEIP with SMTP id eg3mr25568854wib.11.1427985302528;
        Thu, 02 Apr 2015 07:35:02 -0700 (PDT)
Return-Path: <[email protected]>
Received: from something (something. [OTHERIP])
        by mx.google.com with ESMTP id ew1si9167339wjb.35.2015.04.02.07.35.01
        for <CUSTOMER_EMAIL>;
        Thu, 02 Apr 2015 07:35:02 -0700 (PDT)
Received-SPF: pass (google.com: domain of [email protected] designates OTHERIP as permitted sender) client-ip=OTHERIP;
Authentication-Results: mx.google.com;
       spf=pass (google.com: domain of [email protected] designates OTHERIP as permitted sender) [email protected]
Message-ID: <[email protected]>
X-Google-Original-Message-ID: =?UTF-8?Q?<[email protected]>?=
Received: from HOST (OTHERHOST [SOMEIP])
    by HOST (Postfix) with ESMTP id 834E3195
    for <CUSTOMER_EMAIL>; Thu,  2 Apr 2015 17:35:01 +0300 (EEST)
X-DKIM: Sendmail DKIM Filter v2.8.3 HOST 834E3196
Date: Thu, 02 Apr 2015 17:35:01 +0300
To: CUSTOMER_EMAIL
From: =?UTF-8?Q?SOMETHING.COM?= <[email protected]>
Subject: =?UTF-8?Q?Daily=20Statement?=
MIME-Version: 1.0
Content-Type: multipart/alternative;
 boundary="=_c802aad96623e4d95c320e2cbceca602"
Content-Transfer-Encoding: =?UTF-8?Q?8bit?=
Sender: 

This is a message in Mime Format.  If you see this, your mail reader does not support this format.

--=_c802aad96623e4d95c320e2cbceca603
Content-Type: text/plain
Content-Transfer-Encoding: 8bit

<SOME HTML THINGS HERE>

--=_c802aad96623e4d95c320e2cbceca603--

Что я заметил, так это сбой подписи DKIM... Я подозреваю, что это может быть из-за пустой строки заголовка Sender:, но я пробовал пару вещей, но никто не смог ее удалить...

Заранее спасибо!


person valio_sg    schedule 02.04.2015    source источник


Ответы (1)


Ура, наконец-то я нашел решение своей проблемы. Оказывается, моя версия ZF2 слишком старая. На самом деле это 2.2.4. Дело в том, что после того, как я передаю сообщение электронной почты на транспорт, Zend внутренне (класс Smtp.php, функция prepareHeaders()) клонирует объект Headers и по какой-то причине удаляет заголовок Bcc. Мало того, он также добавляет пустой заголовок Sender (поскольку я не установил для него никакого значения в клиентском коде). Поэтому после передачи сообщения в Postfix оно имеет пустой заголовок Sender:, который не может быть проанализирован в DKIM-фильтре. Решение на стороне PHP состояло в том, чтобы добавить значение для заголовка Sender: при создании самого сообщения:

$mail->addTo($parameters['to'])
    ->setFrom($parameters['from_email'], $parameters['from_name'])
    ->setSubject(CommonLib::assignTemplateVariables($parameters['template']['subject'], $parameters['context_variables']))
    ->setSender($parameters['from_email'], $parameters['from_name']);

Последним штрихом было сообщить DKIM-фильтру, что хосты, с которых отправляются письма, являются доверенными.

Мне потребовалось некоторое время, чтобы понять это. Я надеюсь, что это будет полезно для кого-то еще :)

person valio_sg    schedule 04.06.2015