2011-12-14 3 views
7

Я получаю письма от Gmail с помощью PHP и IMAP; однако некоторые электронные письма не имеют messageid. Не все сообщения должны иметь messageid?PHP IMAP - Должны ли электронные письма иметь messageid?

Мне нужен уникальный идентификатор для справки, поэтому я не уверен, как еще отслеживать электронные письма без него.

Я делаю что-то неправильно?

Например здесь является заголовок электронной почты я получаю

[date] => Sun, 06 Nov 2011 21:21:56 -0500 
    [subject] => Daylight Saving Time? Chili's Saving Time! 
    [to] => [email protected] 
    [message_id] => 
    [from] => [email protected] 
    [sender] => [email protected] 
    [reply_toaddress] => [email protected] 
    [size] => 14385 
    [msgno] => 156 
    [status] => Unread 

Благодарности

ответ

5

Любой MTA, с которым я когда-либо сталкивался, добавит Message-ID, если он еще не присутствует. Однако, если вам нужно отслеживать сообщения или использовать их, вам необходимо установить Message-ID. Заголовок References и заголовок In-Reply-To используют значение предыдущего Message-ID для связывания сообщений вместе.

References содержит список предыдущих Message-ID значений в ответе цепи, и In-Reply-To содержит Message-ID, к которому текущее сообщение является прямым ответом.

Обратите внимание, что согласно спецификации RFC-2822, a Message-ID is technically not required. Хорошо составленные MTA обычно включают один, но некоторые комментаторы ниже описывают случаи, когда идентификатор сообщения отсутствовал, что приводит к сбоям в клиентах обмена сообщениями.

+0

Но поскольку нет ничего, гарантирующего это, это не помешает ошибочному/злонамеренному MTA использовать одинаковые идентификаторы сообщений для разных писем? Каков наилучший способ защитить эту ситуацию? – Pacerier

+0

@ Pacerier, если ваша проблема заключается в том, что другой MTA не может реплицировать идентификатор сообщения вашего сервера, это сложно. Вы можете создать идентификатор сообщения как хэш времени сообщения, вашего имени хоста и секретного ключа, что затруднит создание идентификатора сообщения, но я не уверен, что вы многого выиграете. Единственным сильным методом проверки отправителя в электронной почте является подписание PGP и шифрование. –

+1

Обновление к этому старому вопросу: я всегда считал, что идентификатор сообщения является «обязательным», но я только что обнаружил письмо в моем почтовом ящике IMAP, у которого его нет! Я посмотрел на источник. Из-за этого мое программное обеспечение для чтения сообщений IMAP потерпело крах из-за этого, как и я предполагал, что всегда есть идентификатор сообщения. –

5

сообщение ID не имеет ничего общего с IMAP, но является частью самой почты и указывается в RFC 2822 как «дополнительный» (хотя он говорит, что он должен присутствовать):

Хотя необязательно, каждое сообщение ДОЛЖНО иметь поле «Message-ID:».

Таким образом, вы не делаете ничего плохого, если в некоторых почтовых рассылках отсутствует Message-ID. Это происходит для всех писем, которые MUA, изначально отправивший почту, не генерирует один (для чего обычно используется каждый используемый MUA).

Что касается уникального идентификатора для идентификации писем через IMAP, вы можете посмотреть поле UID, описанное in the standard.