вступление

В этой статье предполагается, что вы знаете, как работает современная электронная почта. Даже если вы этого не сделаете, вы поймете, в чем была проблема, и вы также можете получить некоторое представление к концу этой статьи. Заголовок может показаться несвязанным, но проблема возникла, когда агенты Google MTA перестали размещать сообщение.
Электронные письма, отправленные Mattermost (альтернатива Slack с открытым исходным кодом), помечались как спам многими фильтрами спама. Это происходило из-за отсутствия электронных писем message-id который, согласно Формат интернет-сообщения спецификация, не является обязательной, но все же должна присутствовать [mixed signals!].

Разделитель разделов


Что нужно было сделать

хороший способ — поместить доменное имя (или буквальный IP-адрес домена) хоста, на котором был создан идентификатор сообщения, справа от «@» (поскольку доменные имена и IP-адреса обычно уникальны), и поместите комбинацию текущей абсолютной даты и времени вместе с каким-либо другим в настоящее время уникальным (возможно, последовательным) идентификатором, доступным в системе (например, номером идентификатора процесса) в левой части.

просто формат должен был быть:
<unique_stringdate_time@host_name>

  • Напишите модульные тесты, чтобы убедиться, что message-id всегда присутствует.

Разделитель разделов


Как я это сделал

  1. unique_string: уже была написана функция для генерации случайной строки, поэтому я использовал ее. Хотя не гарантируется, что случайная строка будет уникальной, поскольку одна и та же строка может быть сгенерирована снова (вероятность повторения случайной строки из 16 символов, в которой есть все 10 цифр, в идеале составляет один раз из 10 ^ 16).

  2. date-time: Используемые Go пакет времени к генерировать временную метку из объект текущего времени.

  3. host_name: Eсть SMTPConfig объект, который имеет всю конфигурацию SMTP, включая имя хоста.
    Итак, присоединяясь ко всем этим, используя fmt.Sprintf:

msgID := fmt.Sprintf("<%s-%d@%s>", model.NewRandomString(randomStringLength), time.Now().Unix(), config.Hostname)
Войти в полноэкранный режим

Выйти из полноэкранного режима

  1. Тестовый пример: это был тестовый пример, который гарантировал, что электронные письма без message-id разрешены. Я только что отредактировал его, чтобы проверить, есть ли у каждого письма message-id.

Разделитель разделов


Следующий шаг

Разделитель разделов


использованная литература

Нижний колонтитул