У меня есть приложение для внутреннего управления небольшой компанией, написанное на Python и работающее на Linode VPS, с помощью которого пользователи могут время от времени отправлять своим клиентам электронные письма. Электронные письма довольно просты: текстовая часть (т.е. не HTML) с вложением счета в формате PDF, созданная с помощью email
stdlib и отправляется через внешний SMTP-сервер (который не размещен на VPS).
Некоторое время все шло гладко, но в последнее время я получаю жалобы на то, что получающие почтовые серверы часто классифицируют электронные письма как спам. Я отправил тестовое письмо на адрес http://www.mail-tester.com и обнаружил, что добавление нескольких недостающих заголовков (Date
и Message-ID
в частности) помог снизить уровень "спамности" моих сообщений. Однако есть одна проблема SpamAssassin, связанная с SPF, которая все еще ускользает от меня:
SPF_HELO_SOFTFAIL SPF: HELO does not match SPF record (softfail)
Я попытался отправить тестовое письмо на свою учетную запись Gmail, и вот соответствующие заголовки, которые можно найти, когда я нажимаю «Показать оригинал»:
Received-SPF: pass (google.com: domain of <sender_address> designates <ip_smtp_server> as permitted sender) client-ip=<ip_smtp_server>;
Received: from [<ip_linode_vps>] (helo=<domain_name_linode_vps>)
Из этой и некоторой дополнительной информации, которую я собрал здесь и там, я почти уверен, что эту проблему можно решить, каким-то образом изменив запись SPF домена SMTP-сервера (которая уже существует, как запись TXT с "v=spf1 a mx... ~all"
строка, содержащая ip4
ссылка на <ip_smtp_server>
), но моего нынешнего понимания недостаточно, поэтому я буду признателен за любую помощь.
Обновить:
<ip_linode_vps> = 69.164.216.89
<domain_name_linode_vps> = li131-89.members.linode.com
<ip_smtp_server> = 192.99.17.51
<domain_name_smtp_server> = mail.roucet.com
<already_existing_spf_record> = "v=spf1 a mx ip4:192.99.17.51 ip4:158.85.89.116 ip4:158.85.77.121 ~all"
Все авторизованные почтовые серверы должны быть указаны в записи SPF. Поскольку теперь у вас есть новый авторизованный почтовый сервер, его следует добавить. Некоторые проверки на СПАМ различают перечисленные (A, MX) и разрешенные (~ all), и не рассматривают незарегистрированный адрес как проход. Это наказывает отправителей, которые не отправляют сообщения через утвержденный сервер (часто это спам-боты). В ~all
политика указывает на то, что пользователю все равно, кто использует его домен, по сравнению с -all
политика, которая может заблокировать электронную почту или поместить ее в карантин.
Альтернативный подход - настроить новый сервер для ретрансляции сообщений с использованием существующего сервера. Для приложений обычно разрешается настраивать сервер ретрансляции электронной почты. В python вы должны настроить имя вашего VPS-сервера вместо localhost.
Какой бы сервер ни отправлял электронную почту, он должен добавить необходимые заголовки при получении сообщения от вашего приложения. Как вариант, вы можете добавить заголовки в приложение. В заголовке Date есть определенный формат даты. Заголовок Message-id имеет определенный формат, но не такой строгий. Идентификаторы сообщений напоминают адрес электронной почты, но в левой части должен быть уникальный идентификатор.