Как корректно отправлять почту?

Автор ogogon, 21 марта 2017, 02:25:08

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

ogogon

Коллеги, подскажите пожалуйста!

Вопрос у меня элементарный и вполне закономерный, но ответа я на него не нашел.

Как мне настроить корректную отправку форумом электронной почты, без чего его работа крайне затруднительна?

При этом мне нужно выполнить ряд условий, но все они стопроцентно обусловлены требованиями виртуального хостинга, протокола SMTP и норм безопасности:
  • Нужно задать определенный виртуальный адрес отправителя в виде user@do.ma.in, а то почта отправляется от пользователя www с реальным доменом web-сервера.
  • Нужно задать параметры "моего" почтового релея в виде domain:port, а то он отдает почту локальному агенту на хостинговой машине.
  • Нужно задать параметры учетной записи на релее - login, passwd, а то без авторизации в наше время как-то не уютно.
  • Нужно включить защищенный протокол передачи почты - или SSL или STARTTLS по тем-же сображениям.

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

Увы, я не нашел описания того, как это настроить. Пожалуйста, подскажите.

Ogogon.
Властитель слабый и лукавый, Плешивый щеголь, враг труда,
Нечаянно пригретый славой, Над нами царствовал тогда.


ogogon

Цитата: digger® от 21 марта 2017, 02:49:04Админка - Очередь сообщений - Настройки почты.
Для  SSL адрес сервера указать так ssl://адрес_сервера_smtp
Благодарю. Но, что-то тут не так, поскольку это приводит к почти нужным, однако странным результатам.

Я задал следующие настройки:
ЦитироватьТип почтового сервера: SMTP
Сервер SMTP: ssl://relay.mymail.net
Порт SMTP: 465
Имя пользователя SMTP: myforum
Пароль SMTP: ***********

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

ЦитироватьMar 22 10:23:37 mymail sm-mta[38583]: STARTTLS=server, relay=relay.mymail.net [a.b.c.d], version=TLSv1.2, verify=NO, cipher=ECDHE-RSA-AES128-GCM-SHA256, bits=128/128
Mar 22 10:23:37 mymail sm-mta[38583]: STARTTLS=server, cert-subject=, cert-issuer=, verifymsg=ok
Mar 22 10:23:37 mymail sm-mta[38583]: AUTH: available mech=SCRAM-SHA-1 DIGEST-MD5 OTP CRAM-MD5 NTLM LOGIN PLAIN, allowed mech=LOGIN PLAIN SSAPI KERBEROS_V4 DIGEST-MD5 CRAM-MD5
Mar 22 10:23:37 mymail sm-mta[38583]: v2M7NaOB038583: --- 220 relay.mymail.net ESMTP server ready at Wed, 22 Mar 2017 10:23:36 +0300 (MSK)
Mar 22 10:23:37 mymail sm-mta[38583]: STARTTLS=read, info: fds=6/4, err=2
Mar 22 10:23:37 mymail sm-mta[38583]: v2M7NaOB038583: <-- EHLO ssl://relay.mymail.net
Mar 22 10:23:37 mymail sm-mta[38583]: v2M7NaOB038583: --- 501 5.0.0 Invalid domain name
Mar 22 10:23:37 mymail sm-mta[38583]: v2M7NaOB038583: invalid domain name (ssl://relay.mymail.net) from myweb.ogogon.net [a.b.c.e]
Mar 22 10:23:37 mymail sm-mta[38583]: STARTTLS=read, info: fds=6/4, err=2
Mar 22 10:23:37 mymail sm-mta[38583]: v2M7NaOB038583: <-- HELO ssl://relay.mymail.net
Mar 22 10:23:37 mymail sm-mta[38583]: v2M7NaOB038583: --- 501 5.0.0 Invalid domain name
Mar 22 10:23:37 mymail sm-mta[38583]: v2M7NaOB038583: invalid domain name (ssl://relay.mymail.net) from myweb.ogogon.net [a.b.c.e]
Mar 22 10:23:37 mymail sm-mta[38583]: STARTTLS=read, info: fds=6/4, err=2
Mar 22 10:23:37 mymail sm-mta[38583]: v2M7NaOB038583: --- 421 4.4.1 mail.rop.ru Lost input channel from myweb.ogogon.net [a.b.c.e]
Mar 22 10:23:37 mymail sm-mta[38583]: v2M7NaOB038583: myweb.ogogon.net [a.b.c.e] did not issue MAIL/EXPN/VRFY/ETRN during connection to MTA-SSL

Как видно из приведенного листинга, форум, соединившись с почтовым сервером, начинает ESMTP диалог, но в качестве аргумента команды EHLO указывает не свой адрес, как это предписывает протокол, а адрес сервера, причем в нотиции настроек форума. Для любой системы блокировки СПАМ'а, это все равно, что красная тряпка для быка.

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

Позвольте задать резонный вопрос: почему SMTP/ESMTP клиент форума ведет себя так странно - пишет в поле команды HELO/EHLO адрес сервера и как его от этого отучить?

Ogogon.
Властитель слабый и лукавый, Плешивый щеголь, враг труда,
Нечаянно пригретый славой, Над нами царствовал тогда.

ogogon

Цитата: digger® от 21 марта 2017, 02:49:04Админка - Настройки сервера email - вебмастера
Админка - Очередь сообщений - Настройки почты.
Благодарю.

То есть, он будет рассылать всякие уведомления от имени вебмастера?
А как сделать отдельный адрес для рассылки уведомлений? Что-нибудь типа no-reply@myforum.net или infobot@myforum.net?
Все же адрес web-мастера придуман не совсем для того... Скорее, для переписки с web-мастером.

Ogogon.
Властитель слабый и лукавый, Плешивый щеголь, враг труда,
Нечаянно пригретый славой, Над нами царствовал тогда.

Yarik

Создайте себе на хостинге ящик вида no-reply@myforum.net и укажите в настройках сервера. С этого ящика и будет идти вся рассылка.
Себе в профиле можете поставить какой угодно.

ogogon

#5
Цитата: S.T.A.L.K.E.R. от 22 марта 2017, 13:37:47Создайте себе на хостинге ящик вида no-reply@myforum.net и укажите в настройках сервера. С этого ящика и будет идти вся рассылка.
Себе в профиле можете поставить какой угодно.
Благодарю. Но, к сожалению, я не совсем понял технический смысл Вашего совета.

По моему скромному мнению, на хостинге создают не ящики, а сайты. Почтовые ящики создают на почтовом сервере.
Не затруднит ли Вас подробнее пояснить Ваш совет, чтобы я лучше понял, что нужно сделать.
В моем конкретном случае у меня на одной машине web-сервер nginx с поддержкой domain-name-based виртуального хостинга и на другой - почтовый сервер sendmail в всей своей красе, т.е. ESMTPS с авторизацией и это не обсуждается.

Ogogon.
Властитель слабый и лукавый, Плешивый щеголь, враг труда,
Нечаянно пригретый славой, Над нами царствовал тогда.

digger®

Цитата: ogogon от 22 марта 2017, 13:13:18Благодарю.

То есть, он будет рассылать всякие уведомления от имени вебмастера?
А как сделать отдельный адрес для рассылки уведомлений? Что-нибудь типа no-reply@myforum.net или infobot@myforum.net?
Все же адрес web-мастера придуман не совсем для того... Скорее, для переписки с web-мастером.
Ogogon.
То, что вы впишете в это поле и будет использоваться как исходящий адрес для рассылки. Больше это поле ни для чего не используется.

Цитата: ogogon от 22 марта 2017, 11:03:03Позвольте задать резонный вопрос: почему SMTP/ESMTP клиент форума ведет себя так странно
С серверами Яндекса и Гугла все работает.

Yarik

Цитата: ogogon от 22 марта 2017, 16:31:24По моему скромному мнению, на хостинге создают не ящики, а сайты. Почтовые ящики создают на почтовом сервере.
Не затруднит ли Вас подробнее пояснить Ваш совет, чтобы я лучше понял, что нужно сделать.
В моем конкретном случае у меня на одной машине web-сервер nginx с поддержкой domain-name-based виртуального хостинга и на другой - почтовый сервер sendmail в всей своей красе, т.е. ESMTPS с авторизацией и это не обсуждается.

Ogogon.
Ну у меня всё на одной машиной крутится...nginx+апач+exim+dovecot+iptables+fail2ban+cfs+mysql
На почтовом сервере создайте себе почтовый ящик который будет использоваться для форумной рассылки,настройте его чтобы письма не попадали в спам.

ogogon

#8
Цитата: digger® от 22 марта 2017, 18:25:02С серверами Яндекса и Гугла все работает.
Ну вот, наконец-то приехали... А начиналось все так хорошо!

Таки за Яндекс и Гугл я ничего не скажу - это пропиетарные сервисы и им закон не писан. (Вы бы еще Microsoft Exchange в качестве примера привели...)

А протокол SMTP описан в документе, который называется RFC-5321.
В нем сказано, что SMTP-клиент, представляясь командой HELO/EHLO, указывает свое полное доменное имя (п. 4.1.1.1), или если его невозможно установить - цифровой ip-адрес в квадратных скобках (п. 4.1.3). Про Яндекс и Гугл, там, как ни странно - ни слова...

"Грустно, девицы, - ледяным голосом сказал Остап..."
Не хочу никого обидеть, но вот что бывает, когда коммуникационные протоколы начинают реализовывать программисты, в основном пишущие проекты на PHP и другую документацию читать особо не рвущиеся.

Ogogon.
Властитель слабый и лукавый, Плешивый щеголь, враг труда,
Нечаянно пригретый славой, Над нами царствовал тогда.

ogogon

Цитата: S.T.A.L.K.E.R.Ну у меня всё на одной машиной крутится...nginx+апач+exim+dovecot+iptables+fail2ban+cfs+mysql
Эк Вы, батенька, ни в чем себе не отказываете!

Цитата: S.T.A.L.K.E.R.На почтовом сервере создайте себе почтовый ящик который будет использоваться для форумной рассылки,настройте его чтобы письма не попадали в спам.
А как вы выкручивали руки Эксиму, чтобы он ESMTP-сессию с откровенно липовым EHLO соглашался продолжать?

Ogogon.
Властитель слабый и лукавый, Плешивый щеголь, враг труда,
Нечаянно пригретый славой, Над нами царствовал тогда.

digger®

Цитата: ogogon от 22 марта 2017, 22:53:34Ну вот, наконец-то приехали... А начиналось все так хорошо!

Таки за Яндекс и Гугл я ничего не скажу - это пропиетарные сервисы и им закон не писан. (Вы бы еще Microsoft Exchange в качестве примера привели...)

А протокол SMTP описан в документе, который называется RFC-5321.
В нем сказано, что SMTP-клиент, представляясь командой HELO/EHLO, указывает свое полное доменное имя (п. 4.1.1.1), или если его невозможно установить - цифровой ip-адрес в квадратных скобках (п. 4.1.3). Про Яндекс и Гугл, там, как ни странно - ни слова...

"Грустно, девицы, - ледяным голосом сказал Остап..."
Не хочу никого обидеть, но вот что бывает, когда коммуникационные протоколы начинают реализовывать программисты, в основном пишущие проекты на PHP и другую документацию читать особо не рвущиеся.

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


ogogon

Цитата: digger® от 22 марта 2017, 23:28:14Посмотрел код форума на тему HELO/EHLO, В Спортлото написал сам  :facepalm:
http://www.simplemachines.org/community/index.php?topic=552893.0
Ну вот видите, честолюбие - хорошая мотивация!

Я поправил этот код и все заработало. Мне не нравится, как я это сделал, надо бы более корректно. (Но целая куча виндовых почтовых клиентов всегда кричат 'EHLO localhost'.)

Цитироватьif ($modSettings['mail_type'] == 1 && $modSettings['smtp_username'] != '' && $modSettings['smtp_password'] != '')
       {
               // !!! These should send the CURRENT server's name, not the mail server's!

               // EHLO could be understood to mean encrypted hello...
               if (server_parse('EHLO locahlost', $socket, null) == '250')
               {
                       if (!server_parse('AUTH LOGIN', $socket, '334'))
                               return false;
                       // Send the username and password, encoded.
                       if (!server_parse(base64_encode($modSettings['smtp_username']), $socket, '334'))
                               return false;
                       // The password is already encoded ;)
                       if (!server_parse($modSettings['smtp_password'], $socket, '235'))
                               return false;
               }
               elseif (!server_parse('HELO localhost', $socket, '250'))
                       return false;
       }
       else
       {
               // Just say "helo".
               if (!server_parse('HELO localhost', $socket, '250'))
                       return false;
       }


"localhost" - на любой правильно настроенной машине заведомо корректен.

Хотя это и не верно методически.
Надо бы посмотреть, как в этой лабуде называются переменные содержащие FQDN и IP-адрес физического хоста, смотрящий на дефолтный шлюз и вписывать их именно с таким приоритетом.
Если нету (что запросто) - сделать. Уж доводить до ума - так до конца.

Ogogon.
Властитель слабый и лукавый, Плешивый щеголь, враг труда,
Нечаянно пригретый славой, Над нами царствовал тогда.

Yarik

Цитата: ogogon от 22 марта 2017, 22:59:31А как вы выкручивали руки Эксиму, чтобы он ESMTP-сессию с откровенно липовым EHLO соглашался продолжать?

Ogogon.
А для каких целей мне это делать?
Просто честно,не могу понять.

ogogon

Цитата: S.T.A.L.K.E.R. от 23 марта 2017, 06:49:57А для каких целей мне это делать?
Просто честно,не могу понять.
Извините, если я Вас чем-то обидел.
Т.е. почту Вы, очевидно, отдаете Эксиму не по SMTP а по старому, локальному интерфейсу? (Который rmail...)

Кстати, cfs - это Crypto File System?

Ogogon.
Властитель слабый и лукавый, Плешивый щеголь, враг труда,
Нечаянно пригретый славой, Над нами царствовал тогда.

digger®

Цитата: ogogon от 23 марта 2017, 00:20:42Я поправил этот код и все заработало. Мне не нравится, как я это сделал, надо бы более корректно. (Но целая куча виндовых почтовых клиентов всегда кричат 'EHLO localhost'.)

Как-то так будет правильней
if (function_exists('gethostname') && gethostname() !== false)
$helo = gethostname();
elseif (function_exists('php_uname'))
$helo = php_uname('n');
elseif (array_key_exists('SERVER_NAME', $_SERVER) && !empty($_SERVER['SERVER_NAME']))
$helo = $_SERVER['SERVER_NAME'];

if (empty($helo))
$helo = 'localhost';

if ($modSettings['mail_type'] == 1 && $modSettings['smtp_username'] != '' && $modSettings['smtp_password'] != '')
{
// !!! These should send the CURRENT server's name, not the mail server's!

// EHLO could be understood to mean encrypted hello...
if (server_parse('EHLO ' . $helo, $socket, null) == '250')
{
if (!server_parse('AUTH LOGIN', $socket, '334'))
return false;
// Send the username and password, encoded.
if (!server_parse(base64_encode($modSettings['smtp_username']), $socket, '334'))
return false;
// The password is already encoded ;)
if (!server_parse($modSettings['smtp_password'], $socket, '235'))
return false;
}
elseif (!server_parse('HELO ' . $helo, $socket, '250'))
return false;
}
else
{
// Just say "helo".
if (!server_parse('HELO ' . $helo, $socket, '250'))
return false;
}

Yarik

Цитата: ogogon от 23 марта 2017, 15:18:41Извините, если я Вас чем-то обидел.
Т.е. почту Вы, очевидно, отдаете Эксиму не по SMTP а по старому, локальному интерфейсу? (Который rmail...)
Кстати, cfs - это Crypto File System?
Да,где-то так.
Это ConfigServer Security & Firewall (csf) а то у меня некоторые личности любили порты сканировать.Это враз отбило охоту это делать.