Я использую CakePHP 2.6 и использую CakeEmail для отправки подтверждающего электронного письма пользователям.
$Email = new CakeEmail('smtp');
$Email->to($this->request->data['Account']['account_email']);
$Email->subject('Verify your account before you continue');
$Email->send('http://localhost/Accounts/verify/'.$this->request->data['Account']['account_verificationhash']);
Поскольку Amazon SES переписывает идентификатор сообщения, я не могу приписывать жалобы и отказов конкретному сообщению электронной почты. Согласно их документам, Amazon SES возвращает идентификатор сообщения в окончательном SMTP-ответе. То есть(250 Ok <Message ID>)
Как я могу получить этот код ответа?
В строке 316 ./vendor/cakephp/cakephp/lib/Cake/Network/Email/SmtpTransport.php, если вы добавляете третий элемент в массив, возвращаемый после отправки письма со стандартным транспортом CakePHP Smtp, вы можете принудительно выполнить последний ответ от SES, которая будет возвращена, тем самым предоставляя вам идентификационную ссылку для атрибутов уведомлений о доставке, отказов или жалоб AWS SNS.
$this->_content = array('headers' => $headers, 'message' => $message, 'response' => $this->_lastResponse);
«ответ» затем обеспечивает …
Array(
[code] => 250
[message] => Ok 00000151379549a4-6e36766f-849e-4e3c-9ac9-6ac1c6ad5434-000000
)
Предложите вам дублировать / имитировать транспорт Smtp, чтобы избежать перезаписи этого хака при обновлении CakePHP (http://book.cakephp.org/2.0/en/core-utility-libraries/email.html#creating-custom-transports).
Из самой электронной почты:
Message-ID:
<0000015137aa362a-f53a549b-9420-4056-8623-c24ecf8785de-000000@eu-west-1.amazonses.com>
Получить фактический идентификатор сообщения с этим:
$message['Email']['message_id'] = preg_replace('/Ok /', '', $response['response'][0]['message']);
Других решений пока нет …