Как отследить маршрут прохождения электронного письма: пошаговая инструкция

Умение отслеживать, как проходит электронное письмо через почтовые сервисы, важно для IT-специалистов, администраторов и пользователей почты. Эта задача актуальна при решении проблем с доставкой писем, проверке безопасности, расследовании инцидентов и контроле переписки.
Когда нужна отладка маршрута письма
- устранение проблем с доставкой (не приходит письмо, задержка доставки);
- подтверждение получения и прочтения сообщения адресатом;
- расследование случаев подозрительных писем, фишинга или спама;
- аудит и соответствие корпоративным требованиям по e-mail;
- анализ производительности почтовых серверов и маршрутизации писем.
Что потребуется для анализа
- идентификатор письма (Message-ID) — его можно найти в технических сведениях письма;
- доступ к серверу и логам почтовой системы;
- специализированный скрипт для поиска по логам (пример ниже).
Инструкция по отслеживанию письма
1. Получите Message-ID письма
Message-ID хранится в заголовках письма, эта уникальная строка необходима для поиска в почтовых логах.
2. Используйте скрипт для анализа логов почтового сервера
Применяется специальный Bash-скрипт, который показывает путь прохождения письма от отправки до доставки. Пример запуска:
./trace-message.sh <message-id>
Где <message-id>
— уникальный идентификатор письма (только часть до символа @
).
3. Анализируйте результат работы скрипта
В выводе будет видно:
- этапы прохождения письма по почтовому серверу;
- временные метки и задержки доставки;
- адреса участников обмена;
- статусы доставки и фильтрации.
Пояснения к результатам проверки
Исходящее письмо
- Находится по Message-ID.
- Определяется Queue-ID — идентификатор очереди сервера для этого письма.
- Фиксируются технические детали: IP-адреса, размер, время прохождения через фильтры и внутренние сервисы (например, антивирус, антиспам).
- Регистрируются этапы: обработка сервером, передача на внешний SMTP-сервер, успешная доставка.
Входящее письмо
- Аналогично находится по Message-ID.
- Проверяется прохождение фильтрации, внутренние переговоры между сервисами.
- Отмечается момент доставки во внутренний ящик почты.
Каждый этап сопровождается временной меткой и итоговым статусом («Ok», «Доставлено», «Удалено из очереди» и т.д.). Это важно для аудита, технической поддержки и соблюдения норм безопасности.
Пример простого скрипта на bash
#!/bin/bash
MESSAGE_ID="$1"
if [ -z "$MESSAGE_ID" ]; then
echo "❗ Использование: $0 "
exit 1
fi
# Цвета
RED='\033[0;31m'
GREEN='\033[0;32m'
CYAN='\033[1;36m'
NC='\033[0m' # No Color
echo -e "${CYAN}🔍 Поиск письма с Message-ID: ${GREEN}${MESSAGE_ID}${NC}\n"
# 1. Объединяем все логи postfix
echo -e "${CYAN}📂 Объединяем логи...${NC}"
LOG_FILES=$(ls -tr /var/log/mail.log /var/log/mail.log.* 2>/dev/null | grep -v '.gz')
TEMP_LOG="/tmp/all-mail.log"
cat $LOG_FILES > "$TEMP_LOG"
# 2. Ищем Queue-ID по Message-ID
echo -e "${BLUE}🔎 Поиск Queue-ID по Message-ID...${NC}"
QUEUE_IDS=$(grep "$MESSAGE_ID" "$TEMP_LOG" | grep 'postfix/cleanup' | sed -n 's/.*postfix\/cleanup.*: \([A-Za-z0-9]\+\): message-id=.*/\1/p' | sort -u)
if [ -z "$QUEUE_IDS" ]; then
echo -e "${RED}⛔ Не найдено Queue-ID по Message-ID: ${MESSAGE_ID}${NC}"
exit 1
fi
for QID in $QUEUE_IDS; do
echo -e "\n${CYAN}📦 Прослеживаем путь письма по Queue-ID: ${GREEN}$QID${NC}"
grep "$QID" "$TEMP_LOG" | sed "s/$QID/${GREEN}$QID${NC}/g"
done
echo -e "\n${GREEN}✅ Готово!${NC}"