Знать, было ли электронное письмо ответом с использованием IMAP в PHP
Я не уверен, есть ли это в заголовках или нет, но я ищу способ определить, является ли полученное мной электронное письмо ответом на отправленное мной электронное письмо, и если да, то только захватить новый текст, а не "текст в кавычках"
Небольшая предыстория: Я создаю скрипт, который будет автоматически отправлять электронные письма. Я создаю задание cron для периодического запуска, чтобы проверить, были ли какие-либо ответы. Если бы были ответы, я хотел бы взять только новые вещи, а не старые.
В в прошлом я отправлял электронные письма с идентификатором в теме (у вас есть новый ответ [1234]), а затем проверял тему на наличие материала между [и]. Затем я бы взял все сообщение и сохранил его, так как каждый веб-браузер/электронная почта использует другой символ или стиль для текста в кавычках. Некоторые делают ">", некоторые делают горизонтальное правило, некоторые не делают абсолютно ничего.
В любом случае, я просто ищу что-то в заголовке электронной почты, что указывало бы, что они отвечают и какой новый текст может оказаться. Если это невозможно, я просто буду продолжать делать то, что делаю.
2 answers
К сожалению, клиенты электронной почты, по сути, могут делать с вашим сообщением все, что им заблагорассудится, и не существует надежного стандарта для определения того, как полученное сообщение возникло у клиента. Кроме того, IMAP на самом деле не имеет к этому никакого отношения. Электронные письма можно отправлять несколькими различными способами, включая веб-почту.
Лучшее, что вы можете сделать, это найти идентификационный номер в строке темы (при условии, что люди не меняют его, что они редко делают). Вы также можете делать то, что делает Google... нечетко сопоставьте текст ответа с электронной почтой, которую вы отправили на этот адрес. Если это совпадает, считайте это частью ответа. Однако это требует больших усилий.
Вы можете узнать, является ли электронное письмо ответом на другое электронное письмо или нет, используя комбинацию In-Reply-To
и References
.
Каждое электронное письмо имеет уникальный идентификатор в заголовке под названием Message-ID
, согласно этому RFC 1, вы можете отслеживать предков любого электронного письма.
Я проверил его, и он работает во всех клиентах (Outlook, Thunderbird)
Я приведу пример для использования.
1- В заголовке электронного письма, которое вы отправляете в первый раз, вы (ваша почта сервер или вы в коде) отправьте ID (Message-ID)
, если вы откроете исходный код письма, вы увидите его вот так в верхнем разделе:
... // You (your code) send:
Message-ID: <[email protected]>
...
Вам просто нужно сохранить это Message-ID
в своей программе. любой последующий ответ будет относиться к этому ID
.
2- Клиент ответит вам по электронной почте 1. Клиент отправит вам crucial header
, чтобы сообщить, для какого электронного письма этот ответ в дополнение к своему собственному Message-ID
.
... // Client(Thunderbird) send:
Message-ID: <[email protected]>
In-Reply-To: <[email protected]>
...
Когда вы получите второе электронное письмо, вам будет легко сохранить отслеживайте предыдущее отправленное вами электронное письмо, потому что ID
почты(1) находится в заголовке In-Reply-To
почты(2).
3- если вы хотите снова ответить на это электронное письмо в своем коде, вам просто нужно поместить Message-ID
почты(2) в заголовок In-Reply-To
и Message-ID
почты(1) и почты(2) в заголовок References
. Таким образом, клиент правильно поймет цепочку.
... // You (your code) send:
Message-ID: <[email protected]>
In-Reply-To: <[email protected]>
References: <[email protected]> <[email protected]>
...
Этим заголовком вы сообщаете клиенту, что это электронное письмо является ответом на почту (2), а предками являются почта(1) и почта (2).
Я работал с ними и читал о них, и это работает, моя проблема сейчас состоит в том, чтобы просто получить текст последнего электронного письма, а не цитируемый текст из ответов. (у нас работает собственная система продажи билетов, мы создаем комментарий для каждого электронного письма)