Получение идентификатора сообщения с помощью CakeEmail на Amazon SES через SMTP

Я использую 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>)

Как мне получить этот код ответа?


person billybobmac    schedule 24.02.2015    source источник
comment
Что вы имеете в виду под: Я не могу приписать жалобы и отказы конкретному сообщению электронной почты? Конкретно какие жалобы? Вы пытаетесь использовать коды ответа, чтобы определить, было ли письмо успешно доставлено?   -  person AgRizzo    schedule 24.02.2015
comment
Я не могу связать жалобы и отказы с конкретным электронным письмом? Конкретно какие жалобы? Жалобы на обратную связь по электронной почте, особенно жалобы на спам. Вы пытаетесь использовать коды ответа, чтобы определить, было ли письмо успешно доставлено? Нет, я пытаюсь вытащить идентификатор сообщения из ответного сообщения. Amazon берет идентификатор сообщения, который генерирует CakeEmail, и перезаписывает его. Это сделано для их внутреннего отслеживания. Они возвращают этот идентификатор вам в ответном сообщении 250 Ok **** идентификатор сообщения ****. Затем SES использует этот идентификатор сообщения, чтобы сообщить о любых жалобах или отказах.   -  person billybobmac    schedule 24.02.2015
comment
Имеет ли возвращаемое значение метода send код ответа 250, то есть $result = $Email->send();?   -  person AgRizzo    schedule 25.02.2015
comment
Я пробовал это. Он передает массив заголовков и сообщения. Переданный заголовок message-id является идентификатором сообщения до того, как SES его перезапишет.   -  person billybobmac    schedule 25.02.2015
comment
Пробовали работать с sns-уведомлениями?   -  person alexandresaiz    schedule 25.02.2015
comment
Можно использовать уведомление о доставке через SNS, это также может быть беспорядочным, если несколько сообщений отправляются на один и тот же адрес электронной почты одновременно. Это не выглядит элегантным способом, когда данные уже передаются в диалоге SMTP.   -  person billybobmac    schedule 25.02.2015
comment
Копаясь в коде, я не думаю, что можно без создания собственного транспорта. Если вы посмотрите на _smptSend, он никогда ничего не отправляет. к вызывающему коду, кроме фактического кода (например, 250)   -  person AgRizzo    schedule 25.02.2015
comment
@AgRizzo 2.1 немного устарел, в более поздних версиях последний ответ < / b> помещается в буфер. Однако, поскольку идентификатор сообщения, вероятно, содержится в ответе на команду DATA, для этого по-прежнему потребуется настраиваемый / расширенный транспорт, поскольку публично последний ответ - это ответ на команду QUIT. Это немного удобнее в 3.x, где вы можете поддерживать соединения.   -  person ndm    schedule 25.02.2015


Ответы (1)


В строке 316 файла ./vendor/cakephp/cakephp/lib/Cake/Network/Email/SmtpTransport.php, если вы добавляете третий элемент в массив, возвращаемый после отправки почты со стандартным транспортом CakePHP Smtp, вы можете принудительно получить последний ответ из SES, который будет возвращен, тем самым предоставив вам ссылку ID для атрибуции уведомлений о доставке AWS SNS, отказов или жалоб.

$this->_content = array('headers' => $headers, 'message' => $message, 'response' => $this->_lastResponse);

'response' затем предоставляет ...

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).

Из самого письма:

Идентификатор сообщения: ‹0000015137aa362a-f53a549b-9420-4056-8623-c24ecf8785de-000000@eu-west-1.amazonses.com>

Получите фактический идентификатор сообщения следующим образом:

$message['Email']['message_id'] = preg_replace('/Ok /', '', $response['response'][0]['message']);
person chopstik    schedule 24.11.2015