Я использую сервер Centos 6.4 с установленными Directadmin и Exim. Мы используем исходящую фильтрацию вместе со Spamexperts.com. Каким-то образом, когда я отправляю электронное письмо с помощью PHP, отправитель конверта переписывается на пользователя Directadmin по умолчанию. Я не могу понять почему.
Скрипт PHP:
<?php
$to = 'me@mydomain.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: info@testdomain.com' . "\r\n" .
'Reply-To: info@testdomain.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
//mail($to, $subject, $message, $headers, "-finfo@testodmain.com");
mail($to, $subject, $message, $headers);
?>
При выполнении вышеуказанного PHP-кода Exim регистрирует следующее:
2014-03-19 10:32:29 1WQCrN-000511-4Z <= userX@testdomain.com U=userX P=local S=446 T="the subject" from <userX@testdomain.com> for me@mydomain.com
2014-03-19 10:32:29 1WQCrN-000511-4Z ** me@mydomain.com F=<userX@testdomain.com> R=spamexperts_smarthost_router T=spamexperts_smarthost_transport: SMTP error from remote mail server after MAIL FROM:<userX@testdomain.com> SIZE=1483: host smtp.antispamcloud.com [46.165.209.5]: 550-Verification failed for <userX@testdomain.com>\n550-Previous (cached) callout verification failure\n550 Invalid sender <userX@testdomain.com>
2014-03-19 10:32:29 1WQCrN-000516-I1 <= <> R=1WQCrN-000511-4Z U=mail P=local S=1544 T="Mail delivery failed: returning message to sender" from <> for userX@testdomain.com
2014-03-19 10:32:29 1WQCrN-000511-4Z Completed
2014-03-19 10:32:32 1WQCrN-000516-I1 => userX@testdomain.com F=<> R=spamexperts_smarthost_router T=spamexperts_smarthost_transport S=1586 H=smtp.antispamcloud.com [46.165.209.5] X=TLSv1:DHE-RSA-AES256-SHA:256 C="250 OK id=1WQCrW-00033I-Lu"
2014-03-19 10:32:32 1WQCrN-000516-I1 Completed
Критическая часть выделена жирным шрифтом:
2014-03-19 10:32:29 1WQCrN-000511-4Z <= userX@testdomain.com U = userX P = local S = 446 T = "тема" от <userX@testdomain.com> для me@mydomain.com
Когда я меняю сценарий PHP на:
<?php
$to = 'me@mydomain.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: info@testdomain.com' . "\r\n" .
'Reply-To: info@testdomain.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers, "-finfo@testodmain.com");
//mail($to, $subject, $message, $headers);
?>
Журнал eximʻa показывает следующее:
2014-03-19 10:48:09 1WQD6X-000569-IR <= info@testodmain.com U=userX P=local S=442 T="the subject" from <info@testodmain.com> for me@mydomain.com
2014-03-19 10:48:13 1WQD6X-000569-IR => me@mydomain.com F=<info@testodmain.com> R=spamexperts_smarthost_router T=spamexperts_smarthost_transport S=459 H=smtp.antispamcloud.com [198.7.58.154] X=TLSv1:DHE-RSA-AES256-SHA:256 C="250 OK id=1WQD6P-0002nu-00"
2014-03-19 10:48:13 1WQD6X-000569-IR Completed
Смотрите, чтобы критическая часть не переписывалась:
2014-03-19 10:48:09 1WQD6X-000569-IR <= info@testodmain.com U = userX P = local S = 442 T = "the subject" от <info@testodmain.com> для me@mydomain.com
Дополнительная информация:
разделенный exim.conf
[...]
syslog_duplication = false
local_from_check = false
local_sender_retain = false
untrusted_set_sender = *
[...]
# TRUSTED USERS
# OPTIONAL MODIFICATIONS:
# if you must add additional trusted users, do so here; continue the
# colon-delimited list
#trusted_users = mail:majordomo:apache:diradmin:${readfile{/etc/exim.users}}
trusted_users = mail:majordomo:apache:diradmin:userX:
trusted_groups = apache:userX
######################################################################
# REWRITE CONFIGURATION #
######################################################################
begin rewrite
#* info@testdomain.com F
# There are no rewriting specifications in this default configuration file.
######################################################################
# ROUTERS CONFIGURATION #
# Specifies how remote addresses are handled #
######################################################################
# ORDER DOES MATTER #
# A remote address is passed to each in turn until it is accepted. #
######################################################################
# Spamexperts
begin routers
spamexperts_smarthost_router:
driver = manualroute
domains = ! +local_domains
ignore_target_hosts = 127.0.0.0/8
condition = "${perl{check_limits}}"
transport = spamexperts_smarthost_transport
route_list = $domain smtp.antispamcloud.com::587
no_more
# Remote addresses are those with a domain that does not match any item
# in the "local_domains" setting above.
# This router routes to remote hosts over SMTP using a DNS lookup. Any domain
# that resolves to an IP address on the loopback interface (127.0.0.0/8) is
# treated as if it had no DNS entry.
#lookuphost:
# driver = dnslookup
# domains = ! +local_domains
# ignore_target_hosts = 127.0.0.0/8
# condition = "${perl{check_limits}}"
# transport = remote_smtp
# no_more
[...]
# Spamexperts
begin transports
spamexperts_smarthost_transport:
driver = smtp
hosts_require_tls = smtp.antispamcloud.com
# Spam Assassin
spamcheck:
driver = pipe
batch_max = 100
command = /usr/sbin/exim -oMr spam-scanned -bS
current_directory = "/tmp"
group = mail
home_directory = "/tmp"
log_output
message_prefix =
message_suffix =
return_fail_output
no_return_path_add
transport_filter = /usr/bin/spamc -u ${lookup{$domain}lsearch*{/etc/virtual/domainowners}{$value}}
use_bsmtp
user = mail
# must use a privileged user to set $received_protocol on the way back in!
[...]
* Дополнительные примечания:
Краткий ответ: IMHO лучше всего не использовать mail (), а вместо этого добавить в приложение хороший почтовый класс php, такой как PHPMailer.
Подробный ответ:
При отправке электронного письма вы должны учитывать две основные части:
Ваш код устанавливает заголовки, которые касаются только элемента №1. Проблема вашего кода в том, что «отправитель конверта», который является частью пункта № 2, явно не установлен, поэтому exim использует значение по умолчанию, равное $ USER @ $ HOSTNAME. Google по запросу "пример SMTP-разговора"понять почему и когда эти вещи важны.
Обычно при использовании php почта () команду, сложно и неочевидно, как получить желаемые значения параметров конверта. Вместо этого используйте что-то с большей возможностью настройки, которое может установить фактическое соединение SMTP (вместо прямого вызова / usr / sbin / sendmail). Да, даже лучше, когда SMTP-сервер находится на локальном хосте, применяются те же принципы. Когда вы можете указать все в конверте для фактического SMTP-соединения, например PHPMailer класс, все эти проблемы, с которыми вы боретесь, исчезнут.
Также стоит отметить, что приведенный ниже ответ показывает, как использовать ini_set () для решения проблемы с почта () команда, но я по-прежнему предпочитаю использовать PHPMailer.