php mail() + exim

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

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
GFox
проходил мимо
Сообщения: 5
Зарегистрирован: 2010-01-22 14:48:32

php mail() + exim

Непрочитанное сообщение GFox » 2010-05-17 13:37:50

Столкнулся со странной проблемой и не могу понять с чего начать исследование:
Есть сервер (apache + php + mysql + exim + dovecot) на котором крутятся 2 сайта (d1.ru и d2.ru). У каждого домена есть свой ящик (mail@d1.ru и mail@d2.ru). Если послать письма на них с яндекса - все доходит. Если послать письмо с mail@d1.ru на mail@d2.ru или наоборот - все доходит.
Пару дней назад на d2.ru добавили скрипт регистрации пользователей с кодом:

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

<? mail("mail@d2.ru","Зарегистрировался новый пользователь",$msg); ?>
Проблема в том, что этот код посылает письма на mail@d1.ru. Посмотрел логи exim и вижу, что он сразу хочет послать письмо на mail@d1.ru. Тогда я сделал тест - сделал ящик mail2@d2.ru и попытался на него отправить через mail(); и exim пытается доставить письмо по адресу mail2@d1.ru, видит, что такого ящика нет и пишет ошибку в лог.

Почему exim (или php?) меняет домен с d2.ru на d1.ru?

P.S. exim настроен по http://www.lissyara.su/articles/freebsd ... rier-imap/

Хостинговая компания 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/

Аватара пользователя
hizel
дядя поня
Сообщения: 9032
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: php mail() + exim

Непрочитанное сообщение hizel » 2010-05-17 13:48:50

логи покажите
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

GFox
проходил мимо
Сообщения: 5
Зарегистрирован: 2010-01-22 14:48:32

Re: php mail() + exim

Непрочитанное сообщение GFox » 2010-05-17 14:14:09

Вот что пишется в лог когда шлю на mail@d2.ru:

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

2010-05-17 09:40:09 ignoring AUTH=apache@d1.ru from H=localhost.localdomain (d1.ru) [127.0.0.1] I=[127.0.0.1]:25 (client not authenticated)
2010-05-17 09:40:10 1ODt3i-0000WY-4I <= apache@d1.ru H=localhost.localdomain (d1.ru) [127.0.0.1] I=[127.0.0.1]:25 P=esmtps X=TLSv1:AES256-SHA:256 S=561 id=201005170540.o4H5e98f002017@d1.ru from <apache@d1.ru> for mail@d1.ru
2010-05-17 09:40:10 1ODt3i-0000WY-4I => mail <mail@d1.ru> R=mysqluser T=mysql_delivery
2010-05-17 09:40:10 1ODt3i-0000WY-4I Completed 

BlitzKrieg
ст. прапорщик
Сообщения: 538
Зарегистрирован: 2008-03-13 12:02:59

Re: php mail() + exim

Непрочитанное сообщение BlitzKrieg » 2010-05-17 22:42:01

Попробуйте ini_set(sendmail_from) синтаксис на php.net при отсылке с одного домена использовать один адрес при отсылке с другого другой.


Сам столкнулся с тем что smtp переменные как-то smtp=localhost и smtp_port жестко пофиксены в php и изменение их ни на что не влияет, только для win32 они работают.

Второй вариант чуть посложнее, чо нить типа так:

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

<?php

function sock_mail($to,$subj,$message,$headers)
{
$connect = fsockopen('localhost',25);
$log .= fgets($connect); // Читаем ответ
fputs($connect, "HELO localhost\n");
$log .= fgets($connect); // Читаем ответ
fputs($connect, "MAIL FROM:<apache@d1.ru>\r\n"); // Определяем пользователя
$log .= fgets($connect); // Читаем ответ
fputs($connect,"RCPT TO:<$to>\r\n"); // Определяем получателя
$log .= fgets($connect); // Читаем ответ
fputs($connect, "DATA\r\n"); // Приветствие окончено, теперь приступим к делу
$log .= fgets($connect); // Читаем ответ
fputs($connect, "From: <apache@d1.ru>\r\n");
fputs($connect, "To:<$to>\r\n");
fputs($connect, "Subject: $subj\r\n"); // Тема
fputs($connect, $headers);
fputs($connect, "\r\n");
fputs($connect, $message."\r\n");
fputs($connect, "\n.\n");
fputs($connect, "QUIT\n");
fclose($connect); // Закрываем сокет
return $log;
}
Подправить ее и просто вместо mail вызывать sock_mail

GFox
проходил мимо
Сообщения: 5
Зарегистрирован: 2010-01-22 14:48:32

Re: php mail() + exim

Непрочитанное сообщение GFox » 2010-05-18 11:10:05

@BlitzKrieg спасибо за "ini_set(sendmail_from)", чуть позже попробую и напишу результаты.

Слать через SMTP - это жутко :) Я не могу предоставить такое решение программерам. На хостингах, ведь, такой проблемы со сменой домена отправителя нет... Интересно какие у них php и exim конфиги.

BlitzKrieg
ст. прапорщик
Сообщения: 538
Зарегистрирован: 2008-03-13 12:02:59

Re: php mail() + exim

Непрочитанное сообщение BlitzKrieg » 2010-05-18 12:38:03

Ну а мэйл чем занимается :-) Наверное также и шлет. Просто функция чот убогинькая, я просто предлагаю написать ее аналог. То что ниже сам проверял, вроде все ок.
По какому принципу php берет домен от которого отправлять честно говоря не знаю, сам пробовал отправлять письмо от отправителя с алиасным доменом, так апач все равно шлет от домена. Вощем самое здравое решение использовать чо нить кроме mail на самом деле вроде такого полно в энторнетах.

BlitzKrieg
ст. прапорщик
Сообщения: 538
Зарегистрирован: 2008-03-13 12:02:59

Re: php mail() + exim

Непрочитанное сообщение BlitzKrieg » 2010-05-18 12:45:18

Да. кстати это головная боль программеров, ибо php mail такой mail

GFox
проходил мимо
Сообщения: 5
Зарегистрирован: 2010-01-22 14:48:32

Re: php mail() + exim

Непрочитанное сообщение GFox » 2010-05-18 16:12:07

Разбираюсь с логгерами php mail и exim. Надо выяснить кто именно портит "To:"
mail(), судя по докам, вызывает "/usr/sbin/sendmail -t -i" для отправки почты:
Note: The Windows implementation of mail() differs in many ways from the Unix implementation. First, it doesn't use a local binary for composing messages but only operates on direct sockets which means a MTA is needed listening on a network socket (which can either on the localhost or a remote machine).

BlitzKrieg
ст. прапорщик
Сообщения: 538
Зарегистрирован: 2008-03-13 12:02:59

Re: php mail() + exim

Непрочитанное сообщение BlitzKrieg » 2010-05-18 20:46:46

я для своих нужд заюзал енто :-) http://www.dokuwiki.org/tips:mailconfig
оно и правда покошернее чем через сокет.