2015-04-02 29 views
0

我正在用ZF2發送電子郵件掙扎。問題是,他們在我測試過的其他郵件客戶端都能正常工作,但在qq.com上,所有郵件都轉到垃圾郵件文件夾。這裏是我用來發送郵件的代碼:從收到郵件通過Zend郵件發送郵件未通過DKIM簽名並轉到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簽名失敗......我懷疑它可能來自空發件人:標題行,但我已經嘗試了幾件事,但沒有人可以刪除它...

先謝謝您!

回答

0

嗚,終於我找到了解決我的問題的方法。事實證明,我的ZF2版本太老了。實際上它是2.2.4。問題是,在我將電子郵件傳遞給傳輸器之後,Zend內部(Smtp.php類,prepareHeaders()函數)克隆Headers對象,並由於某種原因刪除了Bcc標頭。不僅如此,它還添加了空發件人頭(因爲我沒有在客戶端代碼中爲它設置任何值)。因此,在將消息傳遞給Postfix後,它有一個空的Sender:頭,它不能在DKIM-過濾器中解析。在PHP端解決方案是爲發件人添加值:頭在構造消息本身:

$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過濾器知道的主機,從該郵件被髮送,被信任。

我花了一段時間才弄明白這一點。我希望它會對別人有用:)

相關問題