Заменить return-path; envelop-from

EXIM, sendmail, postfix, Dovecot и прочие. Решение проблем связанных с работой электронной почты

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
orfan
рядовой
Сообщения: 37
Зарегистрирован: 2008-08-28 8:25:03

Заменить return-path; envelop-from

Непрочитанное сообщение orfan » 2012-05-16 8:28:36

Здравствуйте.
На сервер в качестве MTA используется exim, обслуживает несколько виртуальных доменов. PHP скрипт на одном из сайтов занимается отсылкой сообщений. При этом заголовки: Subject, From, To, Reply-To устанавливаются в скрипте. А вот заголовки return-path, envelop-from устанавливает сам MTA. Т.к. скрипт запускается веб-сервером, то в и загаловках return-path; envelop-from: www@domain.com. Для пользователя, мыло которого подставляется в заголовок from: <user@site.com> нет виртуального домена, который бы обслуживал exim. Вопрос в том как и где (на каком этапе) можно поменять заголовки return-path; envelop-from с www@domain.com на user@site.com. Подозреваю, что если менять заголвки при помощи ACL, то делать это следует про проверке DATA, а вот как это сделать не знаю =(.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

moury
сержант
Сообщения: 249
Зарегистрирован: 2009-02-06 23:02:40
Откуда: Москва
Контактная информация:

Re: Заменить return-path; envelop-from

Непрочитанное сообщение moury » 2012-05-17 7:13:48

1. Попробуйте переключить PHP на отправку почты по SMTP. Заодно и от спама от своего сайта подстрахуетесь.

2. Если отправка почты происходит с несуществующего адреса, Вы рискуете. Лучше настроить этот site.com. ИМХО в идеале д. б. так: http://moury.livejournal.com/74798.html
Сисадмин - вождь апачей

orfan
рядовой
Сообщения: 37
Зарегистрирован: 2008-08-28 8:25:03

Re: Заменить return-path; envelop-from

Непрочитанное сообщение orfan » 2012-05-17 13:45:21

Поступил следующим образом:

Код: Выделить всё

Begin rewirte
www@domain\.com "${if eq {${address:$h_from:}}{user@site.com}{user@site.com}fail}" sF

Nick_mad
сержант
Сообщения: 280
Зарегистрирован: 2008-05-30 12:16:02
Откуда: Киев
Контактная информация:

Заменить return-path; envelop-from

Непрочитанное сообщение Nick_mad » 2016-08-12 15:27:27

Здравствуйте.

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

И я до путя не пойму это мне пхп ковырять нужно или exim?

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Заменить return-path; envelop-from

Непрочитанное сообщение xM » 2016-08-12 18:38:01

Nick_mad писал(а): У меня веб интерфейс почты на roundcube естественно он шлет все письма от пользователя от которого работает пхп.
Что-то у вас неправильно настроено, значит.
Roundcube успешно отправляет от имени аутентифицированного пользователя.
IT voodoo blog https://kostikov.co

Nick_mad
сержант
Сообщения: 280
Зарегистрирован: 2008-05-30 12:16:02
Откуда: Киев
Контактная информация:

Заменить return-path; envelop-from

Непрочитанное сообщение Nick_mad » 2016-08-15 9:51:08

Вот и хотелось бы понять что именно, exim или php?

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Заменить return-path; envelop-from

Непрочитанное сообщение xM » 2016-08-15 10:24:26

Nick_mad писал(а): Вот и хотелось бы понять что именно, exim или php?
Roundcube
IT voodoo blog https://kostikov.co

Nick_mad
сержант
Сообщения: 280
Зарегистрирован: 2008-05-30 12:16:02
Откуда: Киев
Контактная информация:

Заменить return-path; envelop-from

Непрочитанное сообщение Nick_mad » 2016-08-15 10:58:26

Я думаю сам Roundcube не причем потому что вообще использование функции mail в php приводит к отправке письма с return-path и sender пользователя от которого работает php.

Например, есть сайт site.com php настроен в режиме fcgid и работает от пользователя в системе user.
Есть электронный адрес info@site.com. если отправить письмо функцией mail то оно уйдет от пользователя user@домен_который_прописан_в_exim_как_primary_hostname.

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Заменить return-path; envelop-from

Непрочитанное сообщение xM » 2016-08-15 16:27:39

Nick_mad писал(а): Я думаю сам Roundcube не причем потому что вообще использование функции mail в php приводит к отправке письма с return-path и sender пользователя от которого работает php.
Поразительно, но у меня ничего подобного не происходит. Письмо отправляется от имени отправителя, а все хедеры корректны.
ЧЯДНТ?
Потом, с чего вы решили, что Roundcube использует штатный mail ? Я вот, хотя и исходники в этой части не смотрел, думаю что там своя реализация клиентов SMTP и IMAP.
IT voodoo blog https://kostikov.co

Nick_mad
сержант
Сообщения: 280
Зарегистрирован: 2008-05-30 12:16:02
Откуда: Киев
Контактная информация:

Заменить return-path; envelop-from

Непрочитанное сообщение Nick_mad » 2016-08-15 17:14:53

Ну я просто наблюдаю идентичную картину при отправке функцией mail и Roundcube.

Беглый прогон по конфигурационному файлу подтвердил догадку (If left blank, the PHP mail() function is used).

// SMTP server host (for sending mails).
// To use SSL/TLS connection, enter hostname with prefix ssl:// or tls://
// If left blank, the PHP mail() function is used
// Supported replacement variables:
// %h - user's IMAP hostname
// %n - hostname ($_SERVER['SERVER_NAME'])
// %t - hostname without the first part
// %d - domain (http hostname $_SERVER['HTTP_HOST'] without the first part)
// %z - IMAP domain (IMAP hostname without the first part)
// For example %n = mail.domain.tld, %t = domain.tld
$config['smtp_server'] = '';

То есть если мне сильно захочется что бы Roundcube отправлял прилежно письма то нужно настроить через отправку smtp сервер.

Но мне даже больше хочется настроить корректную работу функции mail в php.
И я не могу понять как это сделать.

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Заменить return-path; envelop-from

Непрочитанное сообщение xM » 2016-08-15 19:04:08

Nick_mad писал(а): Беглый прогон по конфигурационному файлу подтвердил догадку (If left blank, the PHP mail() function is used).
Ну так вам там английским по-белому написано. Пропишите аутентификацию и серверы и будет всё отправляться от того, кого надо, а не от PHP mail().
Проблема решена.
IT voodoo blog https://kostikov.co

Nick_mad
сержант
Сообщения: 280
Зарегистрирован: 2008-05-30 12:16:02
Откуда: Киев
Контактная информация:

Заменить return-path; envelop-from

Непрочитанное сообщение Nick_mad » 2016-08-16 10:17:01

Ну, понятно с Roundcube разобрались.

Теперь попробуем разобраться почему PHP mail() некоректно работает??? Будут предположения??

Функция php mail() просто формирует строку следующего вида: $additional_headers To: $to Subject: $subject $message а затем передает ее на обработку стандартной UNIX'овой команде отправки почты, которая носит имя /usr/sbin/sendmail.
Запуская из консоли mail с параметром -f, например так mail -s subject user@site.net -ffrom_user@domain.com я получаю желаемый результат. Тоесть в return-path стоит from_user@domain.com. Но запуская в php mail с тем же параметром ничего не происходит.

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Заменить return-path; envelop-from

Непрочитанное сообщение xM » 2016-08-16 10:58:20

Nick_mad писал(а):попробуем разобраться почему PHP mail() некоректно работает
Это вам надо в другую часть форума, полагаю.
IT voodoo blog https://kostikov.co

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Заменить return-path; envelop-from

Непрочитанное сообщение Alex Keda » 2016-08-23 7:33:20

Шоп спам не рассылали, так сделано
Убей их всех! Бог потом рассортирует...

Nick_mad
сержант
Сообщения: 280
Зарегистрирован: 2008-05-30 12:16:02
Откуда: Киев
Контактная информация:

Заменить return-path; envelop-from

Непрочитанное сообщение Nick_mad » 2016-08-23 9:10:15

Ну это, как минимум, неэффективный способ защиты. А с другой стороны как быть легитимным пользователям?

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Заменить return-path; envelop-from

Непрочитанное сообщение xM » 2016-08-23 11:19:25

Nick_mad писал(а): Ну это, как минимум, неэффективный способ защиты. А с другой стороны как быть легитимным пользователям?
Проблема (если вы считаете это проблемой) решается добавлением в заголовки PHP mail() корректно сформированных полей return-path и envelop-from. При их наличии перезаписи на дефолтные не будет.
IT voodoo blog https://kostikov.co

Nick_mad
сержант
Сообщения: 280
Зарегистрирован: 2008-05-30 12:16:02
Откуда: Киев
Контактная информация:

Заменить return-path; envelop-from

Непрочитанное сообщение Nick_mad » 2016-08-23 11:53:21

Давайте сосредоточимся на return-path, так как, на него приходят bounce и соответственно я не могу обрабатывать ошибки отправки почты.

Если Вы имеете ввиду, что я могу установить какие хотите заголовки четвертым параметром функции, PHP mail()
Например

Код: Выделить всё

$header .= "Return-Path: ".$_FROM."\r\n";
То, вероятно, Вы ошибаетесь, так как, Return-Path - это заголовок обработки, который совершенно реально генерирует сам sendmail (exim) при пересылке письма. При чем в отличие от Received: from **** он его не дописывает, а переписывает. Как раз во избежание подделки адреса отправителя.

Для формирования правильного return-path в PHP mail () используется 5 параметр который называется "установка дополнительного параметра командной строки" или другими словами позволяет задавать аргументы для вызова команды sendmail (exim), в том числе, ключ "-f".

Код: Выделить всё

mail("nobody@example.com", "the subject", $message, "From: webmaster@example.com", "-fwebmaster@example.com");
что равносильно

Код: Выделить всё

mail -s the subject nobody@example.com -fwebmaster@example.com
С командной строки у меня сервер прекрасно отправляет и подменяет на правильные return-path с php я перепробовал все возможные настройки в php.ini но не помогло.

Пока ищу дальше.

Nick_mad
сержант
Сообщения: 280
Зарегистрирован: 2008-05-30 12:16:02
Откуда: Киев
Контактная информация:

Заменить return-path; envelop-from

Непрочитанное сообщение Nick_mad » 2016-08-23 15:01:01

А вот и разгадка
# If this option is set, then any process that is running as one of the
# listed users may pass a message to Exim and specify the sender's
# address using the "-f" command line option, without Exim's adding a
# "Sender" header.
# trusted_users = mail
trusted_users = mail:root
а у меня в trusted_users не был указан пользователь от которого работал php.

После добавления пользователя от которого работает php в trusted_users все стало прекрасно работать.

Всем спасибо.

Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Заменить return-path; envelop-from

Непрочитанное сообщение xM » 2016-08-23 19:21:10

Источник цитаты То, вероятно, Вы ошибаетесь, так как, Return-Path - это заголовок обработки, который совершенно реально генерирует сам sendmail (exim) при пересылке письма.
Не ошибаюсь. Вот такая строка вполне себе работала:

Код: Выделить всё

mail($mail, $subj, $text, $headers, "-f");
В $headers дописываете нужные заголовки.
Впрочем, вы и сами ключ -f нашли.

UPD. Тонкий момент - поля хедеров надо не забывать разбивать через \r\n
IT voodoo blog https://kostikov.co