Удаление адресов электронной почты, на которые письмо не было отправлено

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

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

Итак, в настоящее время это выглядит примерно так:

<cfloop query="rsCustomers">
<cftry>

<cfmail to="rsCustomers.Email" from="[email protected]" failto="[email protected]" subject="Whatever">
[email text here]
</cfmail>

<cfcatch type="any">
<!--- just to skip this record when it fails to send --->
</cfcatch>
</cftry>

</cfloop>

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

Можно ли как-то «поймать» сообщения, которые не удалось отправить, а затем отправить их обратно в запрос на удаление из базы данных?


person volume one    schedule 27.01.2016    source источник
comment
Я думаю, что это будет сильно зависеть от вашего конкретного почтового сервера. Если есть надежда сделать это в CF, это почти наверняка потребует отключения буферизации (от администратора CF). Буферизация отправляет данные на почтовый сервер асинхронно, поэтому сообщения об ошибках не возвращаются на вызывающую страницу.   -  person Tim Jasko    schedule 27.01.2016
comment
Я не думаю, что вы можете сделать это с помощью try/catch вокруг тега cfmail. Я знаю, что одна из наших почтовых служб, которую мы используем, отправит нам запрос API для возвращенных писем, и мы можем затем проанализировать оттуда. Но вы ничего не получите от результата cfmail.   -  person beloitdavisja    schedule 27.01.2016
comment
Но, учитывая, что сбой обычно связан с отправкой на другой почтовый сервер и ожиданием их возврата, вам, вероятно, потребуется опросить папку «Входящие» на наличие возвращенных сообщений в отдельном процессе.   -  person Tim Jasko    schedule 27.01.2016
comment
Вы, вероятно, захотите взглянуть на что-то вроде MailGun, который отправляет электронную почту через API. Затем этот API можно запросить, чтобы найти отказы и т. д., которые вы можете использовать для очистки вашей базы данных. Я считаю, что mailGun может работать и через SMTP, но API достаточно прост в использовании.   -  person John Whish    schedule 27.01.2016
comment
Вы получите сообщение об ошибке только в том случае, если возникнет проблема со связью между ColdFusion и вашим почтовым сервером. Ваш почтовый сервер не будет знать, что электронная почта не существует, пока/если он не получит уведомление от почтового сервера для адреса, на который вы пытаетесь отправить сообщение.   -  person Scott Stroz    schedule 27.01.2016


Ответы (2)


Однажды кто-то сделал презентацию по этому поводу на мероприятии, которое я посетил. Подход был:

  • при отправке почты используйте специальный адрес электронной почты в атрибуте failto.
  • напишите файл .cfm, который использует тег cfpop для чтения почты, отправленной на этот адрес. (Возможно, это было до появления тега cfexchange)
  • добавьте код, который читает уведомления об ошибках доставки и извлекает адреса электронной почты.
  • сделать что-нибудь с этими адресами

Докладчик запустил этот файл как запланированное задание.

person Dan Bracuk    schedule 27.01.2016
comment
это действительно полезно - person volume one; 28.01.2016

Ответ Дэна Бракука выше - это самый близкий к хорошему ответу, который вы, вероятно, получите. Вот почему: сервер CF сам по себе не доставляет почту. Это просто передача почтового отправления настоящему почтовому серверу (даже если этот сервер работает на той же машине) для доставки. После того, как он принят, работа CF выполнена. Недоставка на этом этапе в любом случае отражается не на качестве адреса, а скорее на соединении между вашим сервером CF и почтовым сервером.

Оттуда он снова буферизуется почтовым сервером. Иногда домен получателя принимает электронную почту, а вопросы задает позже. Единственный способ узнать, не удалось ли доставить электронную почту, — это дождаться отправки отчета о недоставке (электронной почты) на отказоустойчивый (если используется) или с адреса. Это может исходить от «вашего» почтового сервера или почтового сервера домена получателя. В зависимости от вариантов повторной попытки доставки вашего почтового сервера и сторонних задержек это может занять день или больше. Если вы хотите сделать это самостоятельно, вам придется написать процедуру для POP и прочитать электронную почту от учетных записей и проанализировать их, чтобы определить, являются ли они отчетами о недоставке и какого типа. Отчеты о недоставке могут указывать на жесткие или мягкие отказы, блокировки, задержки или состояния шлюза. Очевидно, что многие из этих ситуаций не являются "выбрасываемыми", поэтому вам придется анализировать их на наличие SMTP-кодов http://www.serversmtp.com/en/smtp-error и ключевые слова, чтобы определить, следует ли удалить или отметить адрес электронной почты.

person GumbyG    schedule 24.02.2016