Знайте, было ли письмо ответом с использованием IMAP в PHP - PullRequest
3 голосов
/ 28 ноября 2011

Я не уверен, находится ли он в заголовках или нет, но я ищу способ узнать, является ли полученное письмо ответом на отправленное письмо, и если да, то только для того, чтобы получить новый текст, не "цитируемый текст"

Немного предыстории: я создаю скрипт, который будет автоматически рассылать электронные письма. Я создаю задание cron для периодического запуска, чтобы проверить, есть ли какие-либо ответы. Если бы были ответы, я бы хотел получить только новое, а не старое.

Раньше я отправлял электронные письма с идентификатором в теме (у вас есть новый ответ [1234]), а затем проверял предмет на предмет того, что находится между [и]. Затем я бы взял все сообщение и сохранил его, так как каждый веб-браузер / электронная почта использует разные символы или стиль для цитируемого текста. Некоторые делают «>», горизонтальное правило, некоторые - абсолютно ничего.

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

Ответы [ 2 ]

9 голосов
/ 29 января 2017

Вы можете узнать, является ли электронная почта ответом на другую электронную почту или нет, используя комбинацию In-Reply-To и References.Каждое письмо имеет уникальный идентификатор в заголовке Message-ID, в соответствии с этим RFC 1 , вы можете отслеживать предков любого письма.

Я проверил, и он работает во всех клиентах (Outlook, Thunderbird)Я приведу пример для использования. 1- В заголовке письма, которое вы отправляете в первый раз, вы (ваш почтовый сервер или вы в коде) отправляете ID (Message-ID), если вы откроете источник письма, вы увидите его следующим образомв верхнем разделе:

... // You (your code) send:
Message-ID: <1@your-domain-mandatory.com>    
...

Вам просто нужно сохранить это Message-ID в вашей программе.любой последующий ответ будет ссылаться на этот ID.

2- Клиент ответит вам по электронной почте 1 .Клиент отправит вам crucial header, чтобы вы сообщили, для какого письма этот ответ является дополнением к его собственному Message-ID.

... // Client(Thunderbird) send:
Message-ID: <2@your-domain-mandatory.com>    
In-Reply-To: <1@your-domain-mandatory.com>
...

Когда вы получите второе письмо, вам будет легкоотслеживать предыдущее письмо, которое вы отправили, потому что ID письма (1) находится в In-Reply-To заголовке письма (2).

3- , если вы хотитечтобы снова ответить на это письмо внутри своего кода, вам просто нужно поместить Message-ID письма (2) в заголовок In-Reply-To и Message-ID письма (1) и mail (2) в заголовок References.Таким образом, клиент будет правильно понимать цепочку.

... // You (your code) send:
Message-ID: <3@your-domain-mandatory.com>
In-Reply-To: <2@your-domain-mandatory.com>
References: <1@your-domain-mandatory.com> <2@your-domain-mandatory.com>   
...

С помощью этого заголовка вы сообщаете клиенту, что это электронное письмо является ответом на почту (2), а предками являются почта (1) и почта (2).

Я работал с ними, читал о них, и это работает, моя проблема сейчас заключается в том, чтобы просто получить текст последнего письма, а не цитируемый текст из ответов.(у нас работает собственная система продажи билетов, мы создаем комментарий для каждого письма)

3 голосов
/ 28 ноября 2011

К сожалению, почтовые клиенты, по сути, могут делать с вашим сообщением все, что захотят, и нет надежного стандарта для определения того, как полученное сообщение возникло у клиента.Кроме того, IMAP не имеет к этому никакого отношения.Электронные письма можно отправлять разными способами, включая веб-почту.

Лучшее, что вы можете сделать, - это найти идентификационный номер в строке темы (при условии, что люди не меняют его, что они редко делают),Вы также можете делать то, что делает Google ... нечетко сопоставлять текст ответа с электронной почтой, которую вы отправили на этот адрес.Если это совпадает, считайте это частью ответа.Это требует больших усилий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...