Пользователь
0,0
рейтинг
22 января 2012 в 04:33

Администрирование → Грамотная настройка сервера отправки почты для скриптов PHP, настройка функции mail()

В этом топике вы узнаете, как грамотно настроить, сервер исходящей почты и в частности функцию mail() в PHP. Сам являюсь жутким педантом. Люблю, что бы везде было все на своих местах, не терплю халтуры. Увидев один раз полную чушь в заголовках письма со своего сервера я разобрался с этим кардинально и безоговорочно. Под грамотной настройкой я подразумеваю такую, которая удовлетворяет потребности спам фильтров крупных почтовых систем, и просто выглядело красиво и осмысленно.

Как известно протокол SMTP не подразумевает никаких средств защиты от спама и аутентификации пользователя, поэтому крупными и не очень компаниями были придуманы «фиксы» безопасности протокола.
Если вы устанавливаете выделенный сервер с доменом размещенным на нем, очень рекомендуется выполнить данные настройки, что бы все было как надо.

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

Название заголовка выбрал именно такое, так как вначале своего пути я искал что-то вроде этого. Настраивать будем postfix, php, dns (ptr, spf), и другое.

Эта статья будет интересная людям, настраивающим выделеные сервера, но не менее интересна для обычных программистов.

Подробности под катом

Преамбула


Кто-то пользуется либами, которые заменяют функцию mail (например phpmailer), они могут общаться с SMTP напрямую, а могут отправлять и на локальный сервер. Но лучше использовать стандартную встроенную и настроенную функцию PHP mail() которая будет отправлять почту на локальный сервер исходящей почты, который в свою очередь будет с ней сам разбираться. При использовании данной функции тормозов всегда наименьшее количество, так как локальный почтовый агент быстро принимает либо отклоняет почту, а если принимает, то доставляет самостоятельно.

Статья отформатирована не самым лучшим образом. Извиняюсь, время поджимает, а рассказать хочется пока вспомнил, а то потом не времени будет.

Чем проверять нашу работу?


Тестируем вот этим методом
$result = mail('yourmail@domain.ru', 'subject', 'message');

if($result)
{
	echo 'все путем';
}
else
{
	echo 'что-то не так';
}


Мы будем очень много читать заголовки писем. Просматривать заголовки очень удобно в gmail, там есть такая фишка в 2 клика, сами найдете.

Каких целей в заголовках нам требуется достичь?


— Вот этих заголовков от gmail.com
Прошу заметить, что это заголовки с которыми письмо попадает в ящик конечного пользователя
Delivered-To: YOURMAIL@DOMAIN.DOM
Received: by 10.182.0.137 with SMTP id 9cs9033obe;
        Sat, 21 Jan 2012 13:25:09 -0800 (PST)
Received: by 10.205.119.199 with SMTP id fv7mr1052469bkc.113.1327181107295;
        Sat, 21 Jan 2012 13:25:07 -0800 (PST)
Return-Path: <no-reply@wartur.ru>
Received: from wartur.ru (wartur.ru. [188.134.79.140])
        by mx.google.com with ESMTP id ua10si4066845bkb.110.2012.01.21.13.25.06;
        Sat, 21 Jan 2012 13:25:07 -0800 (PST)
Received-SPF: pass (google.com: domain of no-reply@wartur.ru designates 188.134.79.140 as permitted sender) client-ip=188.134.79.140;
Authentication-Results: mx.google.com; spf=pass (google.com: domain of no-reply@wartur.ru designates 188.134.79.140 as permitted sender) smtp.mail=no-reply@wartur.ru
Received: by wartur.ru (Postfix, from userid 1002)
	id 9913B61D; Sun, 22 Jan 2012 01:24:55 +0400 (MSK)
To: YOURMAIL@DOMAIN.DOM
Subject: subject
X-PHP-Originating-Script: 1002:index.php
Message-Id: <20120121212455.9913B61D@wartur.ru>
Date: Sun, 22 Jan 2012 01:24:55 +0400 (MSK)
From: no-reply@wartur.ru

— А так же этих заголовков от mail.ru
Return-path: <no-reply@wartur.ru>
Received-SPF: pass (mx64.mail.ru: domain of wartur.ru designates 188.134.79.140 as permitted sender) client-ip=188.134.79.140; envelope-from=no-reply@wartur.ru; helo=wartur.ru;
Received: from [188.134.79.140] (port=64667 helo=wartur.ru)
	by mx64.mail.ru with esmtp (envelope-from <no-reply@wartur.ru>)
	id 1RoiQJ-0005E9-6r
	for wartur@list.ru; Sun, 22 Jan 2012 01:24:31 +0400
X-Mru-BL: 0:0:0:0
X-Mru-PTR: wartur.ru
X-Mru-NR: 1
X-Mru-OF: Linux (ethernet/modem)
X-Mru-RC: RU
Received: by wartur.ru (Postfix, from userid 1002)
	id 460BC9B7; Sun, 22 Jan 2012 01:24:20 +0400 (MSK)
To: wartur@list.ru
Subject: subject
X-PHP-Originating-Script: 1002:index.php
Message-Id: <20120121212420.460BC9B7@wartur.ru>
Date: Sun, 22 Jan 2012 01:24:20 +0400 (MSK)
From: no-reply@wartur.ru
X-Spam: Not detected
X-Mras: Ok
X-Mru-Authenticated-Sender: uid:1002@wartur.ru


Когда вы только начнете, вы увидите, что таких красивых заголовков у вас нет. Принимающий сервер почты будет считать вас каким-то чучмеком, об этом и будет писать в заголовке письма с предупреждением, что вот еще чуть чуть и он тебя точно в блек-лист поставит. Вся информация в заголовке используются всеми цепочками серверов и принимающий агент для того что бы в зависимости от настроек спам фильтра отклонить письмо или принять. Самые драконовые методы это блек-листы, а мягкие определяют плохих по заголовкам и жалобам.

Так же замечаю, если установить в функции mail() 4-й параметр и поставить туда заголовок From то и заголовок From: no-reply@wartur.ru тоже изменится, а если не задавать, то оно будет автоматически определяться таким же как и заголовок Return-path: <no-reply@wartur.ru>, что вы можете видеть у меня в заголовках.
Очень удобна такая схема: отправка идет через сервер с измененным заголовком From, а прием на gmail (через службы домена). Желательно, что бы почта тоже принадлежала к тому же домену, для которого настроен сервер, а так же выполнены некоторые пункты указанные ниже.

Приступим


— Совет
Господа, я люблю ставить все пакетами и новичкам не советую заниматься самодеятельностью, во многих пакетах уже есть скрипты автоматической настройки, результаты которых надо только чутка подправить и все будет хорошо. Кроме того, из репозиториев оно само обновляется и вообще меньше запары просто потому что её меньше.

— Настройка PHP
Ставим как хотим php, это вы как-нибудь без меня.

Идем в настройки php, заменяем эквивалентно:
sendmail_path = /usr/sbin/sendmail -t -i -fno-reply@wartur.ru


Этим мы указали заголовок Return-Path: <no-reply@wartur.ru>

Кстати 1: это будет таковым для всех виртуальных доменов сервера, что бы это исправить и настроить под текущий, то требуется передать 5-й параметр в функцию mail().
$result = mail('YOURMAIL@DOMAIN.DOM', 'subject', 'message', 'From ...', '-fno-reply@yourdomine.ru');

Кстати 2: если вы поставите 5-й параметр на обычном виртуальном хостинге, то вам тоже рекомендуется проводить настройку вашего домена, как это описано ниже. Обращаю внимание, что операцию с PTR записями сделать невозможно, так как 1 IP = Домен, ну или по крайней мере не рекомендуется делать их 2, не помню уже.

— Настройка MTA, он же локальный сервер исходящей почты
Я вам искренне советую postfix, далее идем в настройки /etc/postfix/main.cf
для тех, кто уже нарвался на sendmail, и понял как они трудно выпиливаются из системы, советую команду:
aptitude purge sendmail


Далее, делаем эквивалетно вот так
myhostname = wartur.ru
#smtp_helo_name = k-wartur.wartur.ru
mydestination = _ALL_, wartur.ru, k-wartur.wartur.ru, localhost.wartur.ru, localhost

(k-wartur.wartur.ru — это мой сервер в домене wartur.ru)

— Если я не ошибаюсь, это помогло. Когда агент доставки представляется другому серверу передается HELO. Поменяете myhostname, поменяется следующий заголовок:
Message-Id: <20120121212420.460BC9B7@wartur.ru>

— smtp_helo_name по дефолту это myhostname, читаем матчасть

— mydestination — если я не ошибаюсь, это задает те домены с которых MTA будет принимать почту на обработку, если у вас виртуальный хостинг (что я устроил на сервере дома), то без _ALL_ у вас будут проблемы с отправкой почты с других доменов кроме указанных.

Ну вот, видите, заголовки уже намного правильнее не так ли, а то ужас поначалу был.

— Разборки с почтовыми сервисами (почтовики)
А они нас считают как недобрый источник.
Наш сервер смог правильно helo представиться, но вот только почтовики нам все равно не доверяют.
Для этого были придуман алгоритм, для того что бы владелец домена с помощью DNS (если он конечно грамотный как мы) мог указывать, что вот таким-то серверам можно доверять, а другим нельзя.

У вас вместо ужаса который сейчас должно получиться вот это:
Received-SPF: pass (google.com: domain of no-reply@wartur.ru designates 188.134.79.140 as permitted sender) client-ip=188.134.79.140;
Received-SPF: pass (mx64.mail.ru: domain of wartur.ru designates 188.134.79.140 as permitted sender) client-ip=188.134.79.140; envelope-from=no-reply@wartur.ru; helo=wartur.ru;


Мы уже на пути к истине. К слову, по умолчанию, почтовик все считает как v=spf1 ~all, что понижает уровень порога входа в блек лист, и а так же можно пользоваться вашим доменом для отправки спама, и вас сами того не знали пометят как плохиша на будущие времена.

Идем в ДНС и создаем TXT запись в вашем домене, в моем случае wartur.ru
v=spf1 +mx +a:wartur.ru +a:k-wartur.wartur.ru +include:gmail.com -all

v=spf1
это означает, что версия алгоритма spf1

+mx
Можно доверять почте если она отправлена с серверов mx, например если mx.wartur.ru это сервер приема, то если этот сервер будет отправлять, то все будет хорошо.

+a:wartur.ru
Можно доверять серверу, обслуживающий домен wartur.ru

так же добавлю, например на моем почтовом сервере разместился pupkin.ru.
Я дал Пупкину погонять мой почтовый сервер исходящей почты k-wartur.wartur.ru (обычная ситуация виртуального хостинга, он всегда стоит локально, как бд, и все все все). Тогда он у себя должен настроить +a:k-wartur.wartur.ru

+include:gmail.com
Импортируем все правила gmail.com, у них тоже есть такая запись TXT для своих серверов. (я использую сервисы google для домена)

-all
Указываем, что админ считает другие места не своими, и это может быть ближайший бордель в подворотне рассылающий спам от моего имени
(+all а это означает, что весь мир мои друзья)

Матчасть для самообучения
http://ru.wikipedia.org/wiki/Sender_Policy_Framework

— Разборки с почтовыми сервисами, настройка обратной PTR
Почтовики еще спрашивают обратные доменные зоны PTR для дополнительной галочки, думаю эта галочка одна из самых жирных, так как она 100% определяет сервер, и если он ведет себя правильно, то ему очень сильно доверяют и любое письмо наверняка дойдет до адресата.
X-Mru-PTR: wartur.ru, он же есть в google наврное это Received: from wartur.ru (wartur.ru. [188.134.79.140])

Заметка:
В виртуальном хостинге вам это сделать не дадут, у них на этот адрес замапин свой сервер, какой-нибудь servername.badhosting.ru, на котором вы и размещаетесь, да и вообще только на собственном серваке с собственным IP это возможно провернуть.

Интересно: Если вы живете дома, а у меня один из серверов стоит дома, в частности wartur.ru. Что делать? вроде IP выделенный, а обратный адрес, не настроить. Я позвонил выше (к провайдеру) сказал мол так и так хочу PTR зону. Мне её сделали, очень доволен.

Еще немного слов о заголовках (все вперемешку)


X-Mru-BL: 0:0:0:0 упаси вас иметь что-нибудь кроме нолей, это блеклисты.
X-Mru-OF: интерфейс с которого посылается, я так и не понял от чего это зависит.
X-PHP-Originating-Script: — я бы советовал добавлять, хотя если вы очень печетесь о безопасности и неразглашении, то можно и запретить. Делается это неподалеку от той настройки PHP которой мы делали. По умолчанию включено.

Еще можно и интересно посмотреть что пишет Яндекс при приеме, очень интересно.

Дополнительно


Там еще какие-то цифровые подписи есть.
определяется заголовком, DKIM-Signature
С виду у меня уже было все в порядке, а этот заголовок не очень нужен. Он нужен обычно сервисом очень крупного масштаба вроде facebook или google где рассылка уведомлений и почты идет в гигатонном масштабе. Если ваш сервис не обладает миллионами пользователей, то не думайте об этом, хотя если вы изыскатель — напишите как об этом здесь и мы свяжем статьи — что бы все казалось полностью законченным, только я прошу намного проще написать, так как уже где-то видел статьи про это все. От себя добавлю что мне было лень устанавливать еще один пакет, разбираться и еще что-нить.



Материала к сожалению нет, так как по крупицам отовсюду собирал 4 месяца назад, потом меня не было времени, а теперь я написал по памяти.

Удачной грамотной настройки вашего сервера. Я попробовал объяснить хотя бы один из нескольких аспектов настройки.

UPD:
Найден интересный пруф по теме: http://forum.ixbt.com/topic.cgi?id=7:26978

Так же интересно прочитать:
http://habrahabr.ru/blogs/sysadm/114852/

UPD2: 2012.08.02
Классная статья как раз по теме!
http://habrahabr.ru/post/141534/

UPD3: 2013.04.04
Понадеявшийся на сознательность/внимательность людей, я поставил труадреса, для того, то вы Вы увидели реальную картину и их сменили. Мне не однократно приходили на почту сообщения с бессмысленным содержанием, поэтому я изменил адрес на YOURMAIL@DOMAIN.DOM
Кривцов Артур @wartur
карма
1,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Администрирование

Комментарии (73)

  • +20
    Какая-то жуткая каша. Я понимаю, что программисты не сисадмины, но по вопросам настройки почтовых серверов столько написано, что это читать очень странно (всё в кучу, без объяснения куда к чему и т.д.).

    И уж при чём тут bind9 совсем не понятно.
    • +1
      Старался как мог.

      Вообще идея была в том, что бы собрать все в одно. Просто вот такого полного описания нет, приходилось собирать отовсюду по каждому проблемному заголовку.
      • +2
        Просто неправильный подход. Правильно поставленная задача звучит так:
        Нужно, чтобы почта проходила нормально -> нужен нормальный почтовый сервер -> google
        • –3
          Предлагаете от функции mail() отказаться вообще и всё посылать через бот-аккаунт по SMTP, переписав все возможные скрипты?
          Это не всегда выход.
          • +1
            Посмотрите куда ссылка ведёт.
            • +2
              На самом деле «обычному программисту» нужно ещё осознать тот факт, что реальная работоспособность его программы зависит от внешних условий, причём большей частью не от хоть как-то контролируемых на хосте типа mysql или memcache, а от настроек сервисов «третьих лиц» и одного соблюдения RFC821/822 не достаточно, чтобы письма успешно доходили до получателя. Я вот настроил на VDS postfix — письма уходят с него и приходят на мой gmail ящик, правда в спам попадают.

              Относил на то, что предыдущий «владелец» IP спамом занимался и попал в чёрные списки, или вся подсеть даже. А о том, что это из-за несоответствия результатов реверс-резолвинга IP и резолвинга полей типа Return-Path и From даже мысль в голову не приходила. Ну не занимался я никогда настройкой или, тем более, разработкой систем защиты от спама и способами их преодолеть. А по мотивам поста настроил реверс (хотя не мало гуглить пришлось) и теперь письма в спам не уходят. Ещё нужно с spf разобраться, потому что у знакомого таки-уходят, видимо потому что он не жал 100500 раз на письма с моего хоста «Не спам».
              • –1
                Вообще gmail в основном относит к спаму письма без DKIM, попробуйте подписывать письма.

                По мне это ключевой момент с Gmail.
                • +4
                  Чушь. У меня куча почтовых доменов — и ни один из них не имеет DKIM. И всё отлично работает.

                  А вот если у письма message-id нет (и оно генерируется релеем гугля) — то это прямой путь в каталог спама.
                  • +1
                    Тем не менне вес проверки по DKIM у него выше, чем SPF и проверки по reverse DNS. Так что я бы советовал его всегда использовать.
        • 0
          Забыли в заголовке темы написать для какого почтового сервера, по статье уже стало понятно что для postfix, но тем не менее, надо знать какой сервер тут описывается до прочтения статьи
          • 0
            Идея правильная, я дописал во вступлении одно предложение для удобства.
  • +2
    dkim настраивается за 15 минут человеком без опыта администрирования линукс систем, по мануалам, доступным в гугле. там всего лишь надо добавить одну запись в днс и одно правило в конфиг сервера (у меня эксим), ну и сгенерировать ключи.
    • 0
      Зря минусуете. Для экзима это действительноиочень просто. Сам недавно через этот процесс прошел.
  • +1
    Ох уж эти названия статей. У статей с подобным названием лучше сразу в комментарии заглядывать, по ним видно, соответствует содержание названию или нет.
    • –4
      Я так и делаю:
      Читаю комментарии -> читаю статью ->переобдумываю комментарии -> (возможно) отвечаю
  • +4
    Вступление (до ката) заинтриговало (тем более задача такая стоит где-то в тудузах), преамбула понравилась, а вот дальше, начиная с «Каких целей в заголовках нам требуется достичь?» включительно…

    Может настройка и грамотная, но ни капли не понятная. Со второго прочтения понял, что цель основная это формирование заголовков, благодаря которым письмо пропустят спам-фильтры. С третьего понял, что это в основном заголовки не исходящие, а те, с которыми письмо попадёт в ящик пользователя (или не попадёт). В общем даже «Дано» (например, отправка письма из PHP-скрипта по адресу wartur.ru/index.php с помощью mail() ) и «Требуется» (например, письмо не должно попасть под спам-фильтры) не сформулированы толком. С k-wartur.wartur.ru вообще не понятно что такое.

    По-моему для администраторов статья тривиальная и сумбурная, а вот для простых программистов волею, начальства случая вынужденных администрировать (V)DS, в лучшем случае возможность понять «куда рыть». По-моему стоило бы больше внимания уделить теории прохождения письма от скрипта до попадения в ящик пользователя или, хотя бы, дать ссылку на такой материал.
    • +1
      Согласен.
      Я собственно и есть такой программист и мне вот не было понятно как оно работает и толкового описания нигде не нашел. Если господа администраторы дадут пруфлинк, нашедший который любой новичок вроде меня осознает что делать, то будет круто, я дам ссыль в статье.

      Еще раз, для меня не очевидно было почему раз, два и мои письма попадали в спам. И если будут идеи как по другому назвать статью, то тоже в студию, потому что я наверняка не прав, просто я так представляю эту проблему именно с точки входа функции main(), кончая пришедшим письмом на ящик пользователя с наименьший вероятностью попадания в спам.
      • +2
        Мен ваш пост инициировал на гугление и нашёл, в частности, forum.ixbt.com/topic.cgi?id=7:26978 — не то, что как работает механизм фильтрации, а что должно получиться, чтоб его проходить без потерь. Основная цель-то в этом, а не в том, какие заголовки должны быть.

        В любом случае, спасибо, что помогли осознать проблему.

  • –10
    Жуть какая то.

    У меня почему то вся настройка укладывается в
    apt-get install sendmail
    

    Этого вполне достаточно, чтобы отправлять сообщения о заказах и прочих мелочей. Sendmail Запускается на 127.0.0.1:25, с безопасностью проблем нет.

    А у MODX Revolution, с которым я работаю, вообще прямо в админке прописываются настройки smtp сервера для отправки всей почты сайта. Все скрипты используют эти настройки — даже sendmail не нужен.

    В общем, спасибо, конечно за статью, но жаль ваше время.

    • +2
      Не забываем про spf, ptr, helo, return-path и dkim, эти вещи я главным образом и опысывал, а сам я MTA на прием и спам фильтры устанавливать не умею, ибо я сам пользуюсь службами google. Я всю статью привязывал к тому моменту, что все это будет юзаться скриптами и только на отправки с сервера, а прием будет осуществляться на что-нибудь более современное.

      > Все скрипты используют эти настройки — даже sendmail не нужен.
      ну я же написал, что лучше пользоваться встроенным, чем внешними либами, которые самостоятельно через ботов могут соединяться, такой подход не подходит если у вас сервис более менее загружен и вы отправляете по письму в секунду, а не раз в день, или даже раз в минуту. Не говоря о том, что это все тормозит если вы эту либо не через крон прослойку запускаете.

      Надеюсь немного пояснил.
      • –8
        Да зачем spf, ptr, helo, return-path и dkim для тупой отправки писем с сервера??? Для отправки не нужно ничего кроме МТА. Письмо же отправляет он?

        Эти плюшки нужны для доверия к отправленным письмам со стороны других серверов.

        Но если сайт отправляет письма от имени и ip реального домена, и с обратной зоной все окей — доверие и так будет. Не нужны такие сложности для отправки забытого пароля или информации о заказе.
        • 0
          >Да зачем ...ptr… для тупой отправки писем с сервера???

          >и с обратной зоной все окей — доверие и так будет

          Так надо или не надо? Зря я по прочтению статьи настроил обратную зону или нет?
          • 0
            PTR — крайне желательно, если ваш хостер позволяет.

            Ну и статья то называется «Грамотная настройка сервера отправки почты для скриптов». Вот я и недоумеваю, почему у меня вся настройка сервера сводится к установке sendmail?
            • 0
              Позволяет и уже резолвится, просто не думал, что это важно.

              Ну да, название неудачное.
              • 0
                При приеме почты чужой сервер смотрит, от какого домена она идет. А потом проверяет для этого домена ip и сверяет с вашим. Если совпадает — то это черный спам (коего 95% среди писем).

                Если не совпадает — сразу подозрение. Зачем отправитель представляется чужим доменом?

                И тут уже все зависит от политики сервера. Кто то дает отлуп, кто-то помечает как спам, а кто-то вообще не проверяет PTR.
              • +3
                Это очень важно. Я вот на своих серверах обязательно это проверяю. И тут причина банальная. Огромное количество хостов в сети заражено. Это просто тачки юзеров и сами юзера не знают, что с их машин идет поток спама. Идти-то он идет, но PTR-ов у этих хостов на доменное имя с которого идет рассылка понятное дело нет. И все, можно от такого хоста не то, что письмо принимать, можно его соединение с ним сразу сбрасывать и не занимать ресурсы сервера на получение письма. Поскольку это происходит на фазе установления соединения, все отрабатывается очень быстро особенно если еще обзавестись локальным кэширующим DNS.
          • +2
            PTR — это одна из основных вещей. Некоторые сервера вообще отказываются принимать почту (не то что в спам фолдер) если PTR нет.
            • 0
              Вот статья дала мне повод его настроить. Уже автор время не зря потратил.
            • 0
              Mail.ru, например :)
    • +1
      Проблема не в том, чтобы их отправлять, а в том, чтобы они попадали в ящик адресата и, желательно, не в «спам», а во «входящие». Основное решение проблемы лежит в области настройки DNS, а не MTA. Если, конечно, вы хотите отправлять почту от своего имени и минимизировать вероятность того, что ваши пользователи воспримут серьезно, письма отправленные от вашего имени, которые вы не отправляли.
  • 0
    Массовая почтовая рассылка через Exim или как не попасть в спам.

    И от себя немного — почему просто так желательно не отправлять

    $result = mail('yourmail@domain.ru', 'subject', 'message');


    Например, если будет всё русскими буквами, то некоторые почтовые сервера не поймут какая кодировка. Для тела письма — в заголовках можно передать utf-8, а для сабжекта и to нужно добавить в само поле обозначение кодировки.

    Вобщем, у меня приблизительно так выглядит это:

    mail("=?utf-8?B?".base64_encode($to_name)."?= <$to_mail>",
    "=?utf-8?B?".base64_encode($topic)."?=",
    chunk_split(base64_encode($message)),
    "From: =?utf-8?B?".base64_encode($from_name)."?= <$from_mail>\n
    Content-Type: text/html; charset=utf-8\n
    Content-Transfer-Encoding: base64\n
    Content-Disposition: inline\nMIME-Version: 1.0");


    Думаю, что phpmailer всё это учитывает.
    • 0
      Что верно то верно, здесь автор рекомендует использовать mail(), когда все же лучше использовать phpmailer в качестве оболочки над mail(), передав ей весь головняк с заголовками. Да и такой вопрос, как например, приаттачить файлик перестанет быть вопросом.
  • 0
    Хозяйке на заметку:

    Есть распространенная проблема при использовании почты для доменов Яндекс или Google.

    Если сайт расположен по адресу domain.com и отправляет письмо для admin@domain.com, но при этом MX запись сервера указывает на smtp.yandex.ru — то письмо наверняка не дойдет.

    Это оттого, что МТА посмотрит на имя домена, увидит, что это он сам и попытается доставить письмо локально. А юзера такого в системе наверняка не будет, а если и будет — то за почтой он ходит на реальный сервер (в нашем случае — на mail.domain.com, который обслуживает yandex)

    То есть, МТА обычно не узнает МХ запись для локального домена и такое письмо не доставит. При этом, письма на другие домены уйдут без проблем.

    Решение для Sendmail:
    nano /etc/mail/sendmail.mc
    

    В конце дописываем (example.com меняем на свой домен, на котором висит сайт):
    define(`MAIL_HUB', `example.com.')dnl
    define(`LOCAL_RELAY', `example.com.')dnl
    

    Сохраняем и запускаем команды:
    sendmailconfig
    service sendmail restart
    


    Проблем а должна исчежнуть. Для других МТА придется погуглить самостоятельно.
    • 0
      Протестить вот так:
      echo -e "To: user\nSubject: Test\nTest\n" | sendmail -bm -t -v
      


      Вы должны увидеть что-то типа того:
      >>> MAIL From:<bezumkin@domain.com> SIZE=30 AUTH=bezumkin@domain.com
      250 2.1.0 <bezumkin@domain.com>... Sender ok
      >>> RCPT To:<admin@domain.com>
      >>> DATA
      250 2.1.5 <admin@domain.com>... Recipient ok
      354 Enter mail, end with "." on a line by itself
      >>> .
      050 <admin@domain.com>... Connecting to mx.yandex.ru. via relay...
      050 220 mxfront31.mail.yandex.net (Want to use Yandex.Mail for your domain? Visit http://pdd.yandex.ru)
      .......
      
    • +1
      Это оттого, что МТА посмотрит на имя домена, увидит, что это он сам и попытается доставить письмо локально. А юзера такого в системе наверняка не будет, а если и будет — то за почтой он ходит на реальный сервер (в нашем случае — на mail.domain.com, который обслуживает yandex)
      То есть, МТА обычно не узнает МХ запись для локального домена и такое письмо не доставит. При этом, письма на другие домены уйдут без проблем.

      Вообще, неработающая локальная доставка — это самая первостепенная проблема любого кривонастроенного почтового сервера. :)) К какому-либо конкретному MTA это отношения не имеет.
      • +1
        Локальная доставка — работает.
        Доставка на чужие домены — работает.

        Проблема возникает если почта вынесена на mail.domain.com, а отправить письмо пытается сайт с domain.com. Он не проверяет для себя самого МХ запись и сам себе доставляет письмо. Но реальная-то почта на другом сервере.

        Это дефолтный конфиг, а не кривая настройка. Не уверен, что вообще существуют МТА, из коробки резолвящие МХ запись для самого себя.
        • 0
          Он не проверяет для себя самого МХ запись и сам себе доставляет письмо. Но реальная-то почта на другом сервере.

          Вы похоже путаете домены и хостнеймы («A» запись в DNS) с адресом почтового сервера («MX» запись в DNS).
          Если какой-то домен/субдомен прописан как локальный (по сути MTA всегда сначала смотрит в список локальных доменов, прежде чем пытаться резолвить MX запись через DNS), то, естественно, почта никуда за пределы сервера не уйдёт, что совершенно логично. Допустим, если ваш веб-сервер имеет системный хостнейм example.com, при том он же прописан в локальных доменах у MTA (работающем только на локальную доставку и отправку вовне) на этом же сервере, то наивно надеяться, что доставка почты будет работать корректно.
          • 0
            Решение же заключается в том, чтобы не использовать example.com в качестве хостнейма (как системного, так и в MTA, хотя, полагаю, можно ограничиться и только MTA), если приём почты для домена example.com обслуживает другой сервер.
            • 0
              Отличное решение!

              И что же тогда использовать? Приведите примеры, какие имена нужно использовать для сайта и почтовых ящиков? Я так понимаю, разные?
              • 0
                Почтовые ящики тут не при чём вообще. А хостнейм можете поставить например www.example.com или какой угодно другой субдомен (pupkin.example.com), лишь бы он был.
                • 0
                  >> Почтовые ящики тут не при чём вообще

                  Вот так открытие!!!

                  А как, по вашему мнению, почтовый сервер решает, на какой домен доставлять почту?
                  Уж не по домену ли после символа @?

                  В любом случае, меня не устраивает, что сайт открывается с www, а без www — не открывается. Вот это точно — криворукая настройка.
                  • 0
                    почтовый ящик = пользователь, имя которого следует в адресе до @
                    никакого отношения имя пользователя к доставке на тот или иной сервер и домен не имеет
                  • 0
                    В любом случае, меня не устраивает, что сайт открывается с www, а без www — не открывается.

                    у вас видимо нет соответствующей записи в DNS
                    • 0
                      хотя если веб-сервер всё же отвечает, но выдаёт что-то левое — то копайте в сторону хостнеймов у виртуального хоста вашего веб-сервера
                      • 0
                        Мужчина, перечитайте еще раз исходное сообщение.

                        Нет у меня проблем.
                        • 0
                          не похоже что-то :))
                          В любом случае, меня не устраивает, что сайт открывается с www, а без www — не открывается.
            • 0
              Для postfix достаточно подредактировать mydestination — убрать из него $myhostname.
              • 0
                Я наоборот включаю. Не думаю, что найдётся так много случаев, когда домены для локальной доставки отличаются от хостнейма.
          • –1
            Еще раз.

            Домен bezumkin.ru
            Сайт bezumkin.ru, без www. Любой несуществующий поддомен открывает основной сайт.
            Ящик ya@bezumkin.ru
            Почту обслуживает Яндекс — МХ запись — mx.yandex.ru

            С сайта от имени no_reply@bezumkin.ru отправляется письмо на ya@bezumkin.ru

            По умолчанию, МТА на сервере bezumkin.ru просто переложит почту в директорию mail юзера ya на сервере bezumkin.ru (если он там есть).

            МТА не спросит, какой сервер отвечает за почту домена bezumkin.ru (а это — yandex).

            Понятно или нет? Повторяю еще раз, это дефолтное поведение почтовиков, считать свой домен локальным.

            Варианты открывать сайт по имени www.bezumkin.ru или bezumkin2.ru меня не устраивают. Ящики с именами @mail.bezumkin.ru тоже не нужны.
            • 0
              По умолчанию, МТА на сервере bezumkin.ru просто переложит почту в директорию mail юзера ya на сервере bezumkin.ru (если он там есть).

              И кто мешает настроить наконец как надо? Список локальных доменов, который предшествует резолвингу любого MX, опять же… Естественно, ни в одном MTA по умолчанию это не предусматривается.
              • 0
                Ну так я и описал проблему и решение.

                Это вы выступили с разоблачением:
                >> Вообще, неработающая локальная доставка — это самая первостепенная проблема любого кривонастроенного почтового сервера. :))

                Хотя речь шла о проблеме доставки нелокальной как раз.
                • 0
                  Я вроде бы уже объяснил достаточно подробно про любую доставку. Убираете example.com из списка локальных доменов на сервере отправителя — почта для домена example.com будет отправляться вовне.
  • +1
    В порядке убывания важности, настройки аутентичности почтового сервера выглядеть должны примерно так:
    — SPF запись
    — обратная запись
    — DKIM-подпись контента

    Акцент на PTR делается у криворуких, наподобие мейлру, не учитывающих, что далеко не всегда эту запись можно поменять.
    • 0
      Согласен. Но еще добавлю что From и Return-Path тоже хотелось бы видеть осмысленным, а не что-нибудь вроде этого: your_hosting_account@hosting_domine.domine
      • 0
        >domine
        Секунд 30 пытался понять, что это «domain». :\
        • 0
          Упс.
  • +1
    Автору рекомендую почитать подборку топиков: habrahabr.ru/users/alekciy/favorites/tag/postfix/ (это к вопросу, что де «нет ни чего толкового»).

  • –1
    Артемий Лебедев умывается кровавыми слезами, глядя на креативную картинку из этого поста.
    • 0
      Его душевные страдания в этом посте не интересуют никого. Не кружок дизайнеров собрался.
      • +1
        Вы правда думаете что я призываю его пожалеть?
        Просто мне кажется, что чем бы человек не занимался, будь то оформление поста на хабре, или скажем написание софта под андроид, он либо старается сделать хорошо, либо получается говно. Хорошие посты обычно хорошо оформлены.
        • +2
          «Не кружок дизайнеров собрался.» — Это были ключевые слова.
          Оформлена статья нормально, а на то, как сделана картинка, уверен, что большинству плевать.
          • 0
            И что, даже comic sans не заметили бы?)
    • 0
      Мое имя — не Артемий.
      Но когда я вижу 100-килобайтную картинку такого размера — глаза увлажняются, и комок к горлу подступает.
  • 0
    Я тоже как то писал по этой теме статью. Возможно, кому-то поможет точнее разобраться: Отправка почты через localhost (настройка Exim4 в Debian)
  • +1
    mydestination — если я не ошибаюсь, это задает те домены с которых MTA будет принимать почту на обработку, если у вас виртуальный хостинг (что я устроил на сервере дома), то без _ALL_ у вас будут проблемы с отправкой почты с других доменов кроме указанных.

    Неверно. Вы доки по Postfix хоть раз читали или всё изучали исключительно наугад?
    Открываем Postfix configuration paramters — mydestination, читаем:
    The list of domains that are delivered via the $local_transport mail delivery transport. By default this is the Postfix local(8) delivery agent which looks up all recipients in /etc/passwd and /etc/aliases. The SMTP server validates recipient addresses with $local_recipient_maps and rejects non-existent recipients.

    Т.е. если резюмировать по-русски: mydestination задаёт домены/хостнеймы для которых доставка почты будет выполняться исключительно локально (в пределах текущего сервера), это строго необходимо, если вам не всё равно будет ли правильно работать доставка всевозможных системных оповещений. При этом получатели должны существовать в виде системных пользователей или системных алиасов. Обычно в этот параметр пишется имя хоста (то же, что и в /etc/hostname прописано) + localhost.
    В случае же с почтовым сервером, обслуживающих много различных доменов/ящиков/алиасов, процедура настройки будет крайне отличаться, в зависимости от выбранной модели почтовых ящиков. Писать _ALL_ сюда в любом случае не стоит. Советую сперва прочитать про local_recipient_maps и virtual_mailbox_maps + virtual_mailbox_domains.
    • 0
      Круто, буду знать. Спасибо.
      Я же сказал могу ошибаться, читал все броско и давно, а решал задачу исключительно отправки через скрипты PHP, все остальное меня в меньшей степени интересовало, так как остальное за меня решают умные парни из google и yandex.
  • 0
    А есть какая-нибудь статья по настройке sendmail на win системах с использованием gmail как основного сервера отправки? Сейчас у меня настроено, но как то криво, не знаю в чем проблема, но при отправке письма через mail() оно дублируется адресату и отправителю…
    Почему задаю вопрос здесь, потому что в sendmaile не предусмотрена изначально работа с защищенными SMTP серверами…
  • –1
    КАК вы просмотрели заголовки, целиком, в GMAIL? КАК?
  • 0
    Действительно сложно воспринимается.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.