Страница 1 из 1

php mail() + exim

Добавлено: 2010-05-17 13:37:50
GFox
Столкнулся со странной проблемой и не могу понять с чего начать исследование:
Есть сервер (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/

Re: php mail() + exim

Добавлено: 2010-05-17 13:48:50
hizel
логи покажите

Re: php mail() + exim

Добавлено: 2010-05-17 14:14:09
GFox
Вот что пишется в лог когда шлю на 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 

Re: php mail() + exim

Добавлено: 2010-05-17 22:42:01
BlitzKrieg
Попробуйте 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

Re: php mail() + exim

Добавлено: 2010-05-18 11:10:05
GFox
@BlitzKrieg спасибо за "ini_set(sendmail_from)", чуть позже попробую и напишу результаты.

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

Re: php mail() + exim

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

Re: php mail() + exim

Добавлено: 2010-05-18 12:45:18
BlitzKrieg
Да. кстати это головная боль программеров, ибо php mail такой mail

Re: php mail() + exim

Добавлено: 2010-05-18 16:12:07
GFox
Разбираюсь с логгерами 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).

Re: php mail() + exim

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