5 декабря 2011 г.

Настройка отправки почты

При отправке почты через Sendmail возникает проблема - отправленные письма не доходят до адресатов или попадают в папки со спамом.

Особенно проблема часто возникает, если отправка почты происходит с виртуального хоста, используя php функцию mail().

Во первых нужно отправить почту на какой-нибудь свой ящик и посмотреть почтовые заголовки. Например, хороший заголовок может выглядеть так:

Delivered-To: user@gmail.com
Received: by 10.223.115.147 with SMTP id i19cs115329faq;
Sun, 4 Dec 2011 22:53:40 -0800 (PST)
Received: by 10.205.127.70 with SMTP id gz6mr3599995bkc.134.1323068018724;
Sun, 04 Dec 2011 22:53:38 -0800 (PST)
Return-Path: <user@sender.com>
Received: from srv.host.com (srv.host.com. [xx.xxx.xxx.xx])
by mx.google.com with ESMTPS id dr20si17678469bkb.102.2011.12.04.22.53.37
(version=TLSv1/SSLv3 cipher=OTHER);
Sun, 04 Dec 2011 22:53:38 -0800 (PST)
Received-SPF: pass (google.com: domain of user@sender.com designates xx.xxx.xxx.xx as permitted sender) client-ip= xx.xxx.xxx.xx ;
Authentication-Results: mx.google.com; spf=pass (google.com: domain of user@sender.com designates xx.xxx.xxx.xx as permitted sender) smtp.mail= user@sender.com
Received: from srv.host.com (localhost.localdomain [127.0.0.1])
by srv.host.com (8.13.8/8.13.8) with ESMTP id pB56rafW028225
 for <user@gmail.com>; Mon, 5 Dec 2011 08:53:37 +0200
Received: (from apache@localhost)
by srv.host.com (8.13.8/8.13.8/Submit) id pB56ra1H028224;
Mon, 5 Dec 2011 08:53:36 +0200
Date: Mon, 5 Dec 2011 08:53:36 +0200
Message-Id: <201112050653.pB56ra1H028224@srv.host.com  >
X-Authentication-Warning: srv.host.com : apache set sender to user@sender.com   using -f
To: user@gmail.com
Subject: subj
Content-type: text/plain; charset=windows-1251
Content-Transfer-Encoding: 8bit
From: user < user@sender.com >
X-Priority: 1
Reply-To: <user@sender.com>

здесь видно, что:
1. сервер-отправитель это srv.host.com с ip: xx.xxx.xxx.xx
2. письмо отправлено с ящика  user@sender.com
3. адрес для ответа  user@sender.com
4. адрес для возврата  user@sender.com
5. видим важную строку
Received-SPF: pass (google.com: domain of user@sender.com designates xx.xxx.xxx.xx as permitted sender) client-ip= xx.xxx.xxx.xx;  
Это сервер Гугла проверил  SPF запись для домена  sender.comв которой значится, что для этого домена разрешена отправка с IP адреса  xx.xxx.xxx.xx. В данном случае IP отправителя и IP в записи совпали, т.е. спам-фильтр пройден.
6. видим еще такое: 
X-Authentication-Warning: srv.host.com : apache set sender to user@sender.com   using -f .
Это значит, что Apache принудительно установил отправителя как user@sender.com, он будет значиться в Return-Path  

Итак, для того, чтобы письмо не было квалифицировано как спам, необходимо:
1. Return-Path=From
2. Сервер-отправитель должен быть одобрен в SPF записи домена  From
3. Для сервера-отправителя должна существовать обратная зона DNS.

Лучше, чтобы были удовлетворены все три условия. Теперь о том как это сделать.

[SPF]
Чтобы прописать SPF запись для домена, нужно иметь доступ к редактированию DNS записей домена-отправителя sender.com. Создаем запись типа TXT такого содержания:
v=spf1 +mx +ip4:xx.xxx.xxx.xx
где,  xx.xxx.xxx.xx - IP адрес сервера-отправителя  srv.host.com

[Return-Path]  
Теперь сделаем, чтобы поле  Return-Path совпадало с полем From.  По умолчанию Sendmail заполняет поле Return-Path адресом демона-отправителя, если письмо отправлено скриптом php то это будет apache@srv.host.com. Без вмешательств в конфигурацию sendmail мы сделаем это в php функции mail():
mail($addr,$subj,$msg,$headers," -f user@sender.com");
в пятый параметр и добавили Return-Path.

[Reverse DNS]
Чтобы прописать обратную зону ДНС, как правило нужно обратиться к владельцу IP адреса  xx.xxx.xxx.xx - хостеру и попросить прописать для него адрес srv.host.com. Проверить это можно утилитой nslookup.

[Кодировка]
Ну и чтобы почта приходила без "кракозябр" нужно в заголовках прописать правильно кодировку. Если это простой Win текст то достаточно указать:
Content-type: text/plain; charset=windows-1251
Content-Transfer-Encoding: 8bit

8 bit говорит о том, что текст не закодирован и может содержать кириллицу.

Еще несколько важных моментов. Когда наш сервер отправляет почту, он должен как-то представиться серверу-приемщику почты. В примере он представился как  srv.host.com. Это имя хоста наш сервер берет с файла /ect/hosts:
xx.xxx.xxx.xx srv.host.com srv 
здесь должно быть прописано имя нашего сервера и его IP. Также для успешной отправки почты наш сервер использует DNS сервера, которые должны быть прописаны в файле /etc/resolv.conf:
nameserver 8.8.8.8
здесь указан  DNS сервер Google, не зря же гугл рекомендует их для безопасности :)

Пробуем отправить почту, смотрим на заголовки, корректируем если что-то не так и добиваемся, чтобы письма ходили на большинство почтовых сервисов типа mail.ru, gmail, ukr.net и т.д.

Комментариев нет:

Отправить комментарий