Вы сказали:
Подробно объяснить как работают уведомление о прочтении и доставки письма Серверами клиентами почтовыми
Системы уведомлений о доставке и прочтении email-писем работают через комбинацию механизмов, встроенных в протоколы электронной почты и клиентские приложения. Разберем их подробно:
Это уведомление, которое сообщает отправителю, что письмо доставлено на почтовый сервер получателя (а не обязательно прочитано).
Отправитель включает в заголовках письма запрос на уведомление о доставке:
Используется заголовок Return-Receipt-To: или Delivery-Status-Notification:.
SMTP-сервер отправителя передаёт письмо SMTP-серверу получателя.
SMTP-сервер получателя (если он поддерживает эту функцию) может отправить отчёт о доставке обратно на адрес отправителя.
Этот отчёт приходит как отдельное техническое письмо, содержащее статус: успешно доставлено или ошибка (например, ящик не существует, переполнен и т.д.).
Не все почтовые серверы поддерживают или разрешают отправку таких уведомлений.
Gmail, Яндекс, Mail.ru — чаще игнорируют такие запросы (ради безопасности и приватности).
Это уведомление, отправляемое отправителю, когда получатель открыл письмо (т.е. якобы прочитал его).
Отправитель включает в письмо специальный заголовок:
Disposition-Notification-To: — используется для запроса уведомления о прочтении.
Когда почтовый клиент получателя (например, Outlook, Thunderbird) открывает письмо, он может отобразить диалог:
"Отправитель запросил уведомление о прочтении. Отправить его?"
Если получатель соглашается:
Почтовый клиент формирует уведомление (как отдельное письмо) и отправляет его на адрес, указанный в Disposition-Notification-To.
Это уведомление приходит отправителю и содержит информацию, что письмо было открыто (прочитано).
Уведомление о прочтении не обязательно отправляется — зависит от клиента и действий пользователя.
Gmail Web, Mail.ru, Yahoo и т.д. не поддерживают отправку уведомлений о прочтении.
Outlook и Thunderbird поддерживают, но пользователь может отказаться.
Из-за ограничений выше, многие используют неофициальные методы:
В тело письма встраивается невидимое изображение (1×1 px), например:
arduino<img src="https://yourserver.com/track?id=12345" width="1" height="1" />
Когда получатель открывает письмо, клиент загружает изображение → сервер отправителя фиксирует факт открытия.
📌 Этот метод широко используется в email-маркетинге.
Многие почтовые клиенты блокируют автоматическую загрузку изображений.
При чтении письма в текстовом режиме или offline, пиксель не сработает.
| Вид уведомления | Как работает | Зависит от сервера? | Зависит от клиента? | Точное ли? |
|---|---|---|---|---|
| Доставка | На уровне SMTP | ✅ Да | ❌ Нет | ✅ Да |
| Прочтение | Disposition-Notification | ❌ Нет | ✅ Да (пользователь решает) | ⚠️ Нет (не всегда отправляется) |
| Пиксель | Веб-запрос при открытии | ❌ Нет | ✅ Да (если не блокируется) | ⚠️ Нет (может быть заблокирован) |
Приватность пользователей — основная причина. Почтовые клиенты и серверы умышленно ограничивают эти функции.
Спамеры активно используют такие уведомления для подтверждения "живых" адресов.
Большинство email-платформ не доверяют запросам на read/delivery receipts и/или блокируют их.
| Что можно сделать для надежного отслеживания |
|---|
| Использовать email-сервисы с поддержкой tracking (например, Mailchimp, SendGrid) |
| Встраивать пиксели (с пониманием их ограничений) |
| Использовать корпоративные почтовые клиенты, где можно настраивать отчеты вручную (например, Outlook + Exchange) |
Если тебе нужна реализация или пример с кодом (например, как вставить пиксель в письмо или заголовки SMTP), могу помочь с этим.
Отличный вопрос — ты как раз затрагиваешь одну из "скрытых" возможностей SMTP-протокола, а именно расширение DSN (Delivery Status Notification), где и используется NOTIFY=SUCCESS,FAILURE.
NOTIFY=SUCCESS,FAILURE в SMTP?Это часть расширения SMTP DSN (RFC 3461), позволяющая отправителю запрашивать уведомления о статусе доставки письма. Указывается как параметр к команде RCPT TO.
smtpRCPT TO:<user@example.com> NOTIFY=SUCCESS,FAILURE
Это означает:
"Сообщи мне, был ли успешный или неудачный результат доставки письма получателю."
NOTIFYSUCCESS – прислать уведомление, если письмо доставлено успешно.
FAILURE – прислать уведомление, если письмо не может быть доставлено.
DELAY – уведомление, если доставка задерживается (например, очередь на сервере).
NEVER – не посылать вообще никакие уведомления (даже при ошибке).
Можно указать несколько через запятую:
smtpNOTIFY=SUCCESS,FAILURE,DELAY
Команда RCPT TO может выглядеть так:
rubyRCPT TO:<bob@example.com> NOTIFY=SUCCESS,FAILURE
Это часть SMTP-сессии:
rubyMAIL FROM:<alice@example.com> RET=FULL
RCPT TO:<bob@example.com> NOTIFY=SUCCESS,FAILURE
DATA
...
Если он поддерживает расширение SMTP DSN, то:
Принимает параметр NOTIFY.
Позже (после попытки доставки) формирует специальное отчётное сообщение — DSN.
Отправляет его обратно на адрес отправителя (или указанный в параметре ENVID / ORCPT).
Пример уведомления об ошибке доставки:
cssReporting-MTA: dns; mx.example.com
Final-Recipient: rfc822; bob@example.com
Action: failed
Status: 5.1.1
Diagnostic-Code: smtp; 550 5.1.1 user unknown
Не все SMTP-серверы поддерживают DSN или уважают NOTIFY=....
Gmail, например, игнорирует такие параметры.
Эта функция более распространена в корпоративной почте (MS Exchange, Postfix, Exim с нужной настройкой).
| Характеристика | Значение |
|---|---|
Что такое NOTIFY=... | Расширение SMTP (DSN) для запроса уведомлений |
| Где указывается | В команде RCPT TO во время SMTP-сессии |
| Что можно запросить | Успех, сбой, задержка, или вовсе ничего |
| Поддерживается всеми? | ❌ Нет. Только серверами с поддержкой RFC 3461 |
| Приносит ли письмо об ошибке? | ✅ Да, если сервер настроен правильно |
Если хочешь, могу показать пример отправки SMTP-письма с NOTIFY и анализом ответа с помощью Python (через smtplib) или telnet.
Отличный вопрос! Работа с PHPMailer (или вообще с PHP для отправки писем) может включать частичную проверку доставки и отслеживание прочтения, но с рядом важных ограничений. Давайте разберем подробно.
PHPMailer сам по себе не может гарантировать, что письмо доставлено получателю, потому что:
После передачи письма на SMTP-сервер оно выходит из-под контроля скрипта.
PHPMailer может только подтвердить, что SMTP-сервер принял письмо, а не то, что оно дошло до адресата.
Использовать опцию DSN (Delivery Status Notification), если SMTP-сервер поддерживает её.
php$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host = 'smtp.example.com';
$mail->SMTPAuth = true;
$mail->Username = 'you@example.com';
$mail->Password = 'password';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->setFrom('you@example.com', 'You');
$mail->addAddress('recipient@example.com', 'Recipient');
// Запрос DSN — уведомление о сбое или успехе
$mail->addCustomHeader('Return-Receipt-To', 'you@example.com'); // Запрос уведомления о доставке (не всегда работает)
$mail->addCustomHeader('Disposition-Notification-To', 'you@example.com'); // Запрос уведомления о прочтении (не надёжен)
$mail->addCustomHeader('X-Confirm-Reading-To', 'you@example.com'); // Некоторыми клиентами уважается
$mail->Subject = 'Тестовое письмо';
$mail->Body = 'Это тело письма.';
if ($mail->send()) {
echo 'Письмо отправлено успешно!';
} else {
echo 'Ошибка при отправке: ' . $mail->ErrorInfo;
}
Добавление отслеживающего пикселя (1×1 px прозрачного изображения), который загружается при открытии письма.
php$trackingUrl = 'https://yourdomain.com/track.php?email=recipient@example.com';
$mail->Body = '
<html>
<body>
<p>Привет!</p>
<img src="' . $trackingUrl . '" width="1" height="1" style="display:none;" />
</body>
</html>
';
$mail->isHTML(true);
На сервере создаешь файл track.php, который регистрирует открытие:
track.php:php<?php
$email = $_GET['email'] ?? 'unknown';
file_put_contents('read_log.txt', date('Y-m-d H:i:s') . " - Opened by: $email\n", FILE_APPEND);
// Отдаем прозрачное изображение
header('Content-Type: image/gif');
echo base64_decode('R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==');
| Функция | Можно в PHPMailer? | Ограничения |
|---|---|---|
| Проверка доставки | Частично | Зависит от SMTP-сервера, нет гарантии |
| Отслеживание прочтения | Да (через пиксель) | Блокируется многими почтовыми клиентами |
| Уведомления SMTP (DSN) | Да (частично) | Должен поддерживаться сервером |
| Заголовки read receipt | Да | Почтовые клиенты часто игнорируют |
PHPMailer предоставляет техническую возможность добавить запросы на доставку и прочтение, но:
Успешная доставка письма — не гарантирует его доставку в «входящие».
Прочтение письма — можно отслеживать через пиксели, но не надежно.
Надежное отслеживание требует использования специализированных сервисов (например: Mailgun, SendGrid, Postmark), которые дают webhooks, статистику по открытию и доставке.
Хочешь — могу показать пример на SendGrid или Mailgun, где отслеживание работает стабильно и официально.
Хороший вопрос — но тут важно пояснить:
строка
php$mail->addCustomHeader('Return-Path: bounces@yourdomain.com');
не работает так, как многие ожидают. Давайте разберём, почему.
Return-PathReturn-Path — это специальный заголовок, который:
Указывает, куда почтовый сервер должен отправлять уведомления о недоставке (bounce).
Он устанавливается не в теле письма, а на уровне SMTP-сессии, в команде MAIL FROM:.
smtpMAIL FROM:<bounces@yourdomain.com> RCPT TO:<recipient@example.com> DATA ...
Когда письмо не может быть доставлено, сервер отправляет уведомление о сбое на адрес, указанный в MAIL FROM — и этот адрес автоматически попадает в Return-Path:.
addCustomHeader('Return-Path: ...') не работаетКогда вы пишете в PHPMailer:
php$mail->addCustomHeader('Return-Path: bounces@yourdomain.com');
Вы всего лишь добавляете строку Return-Path в тело письма — это бесполезно, потому что:
Почтовые серверы игнорируют Return-Path в теле письма.
Правильное значение Return-Path сервер устанавливает сам, на основе MAIL FROM.
Чтобы установить Return-Path, нужно использовать свойство:
php$mail->Sender = 'bounces@yourdomain.com';
php$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host = 'smtp.yourdomain.com';
$mail->SMTPAuth = true;
$mail->Username = 'you@yourdomain.com';
$mail->Password = 'your_password';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->setFrom('you@yourdomain.com', 'Your Name');
$mail->addAddress('recipient@example.com');
// Установка Return-Path
$mail->Sender = 'bounces@yourdomain.com';
$mail->Subject = 'Test message';
$mail->Body = 'Hello!';
$mail->send();
📌 Это установит
MAIL FROM:<bounces@yourdomain.com>, иReturn-Pathбудет корректным.
SMTP-сервер должен разрешать отправку от имени bounces@yourdomain.com. Иначе он отклонит письмо или подменит адрес.
Лучше всего использовать поддомен типа bounces.yourdomain.com, и прописать SPF / DKIM / DMARC правильно.
| Что делаем | Работает? | Комментарий |
|---|---|---|
addCustomHeader('Return-Path: ...') | ❌ Нет | Игнорируется |
$mail->Sender = 'bounces@...' | ✅ Да | Устанавливает правильный Return-Path |
Если тебе нужно настроить обратную обработку bounce-сообщений (например, собирать их на сервере или обрабатывать в скрипте), могу помочь с этим тоже — напиши, какие задачи нужно решать.