Назад | Перейти на главную страницу

Exim переписывается с пользователя по умолчанию

Я использую сервер 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. SMTP-диалог между почтовыми серверами, который устанавливает отправителя и получателя (-ов), часто называемый настройками конверта.

Ваш код устанавливает заголовки, которые касаются только элемента №1. Проблема вашего кода в том, что «отправитель конверта», который является частью пункта № 2, явно не установлен, поэтому exim использует значение по умолчанию, равное $ USER @ $ HOSTNAME. Google по запросу "пример SMTP-разговора"понять почему и когда эти вещи важны.

Обычно при использовании php почта () команду, сложно и неочевидно, как получить желаемые значения параметров конверта. Вместо этого используйте что-то с большей возможностью настройки, которое может установить фактическое соединение SMTP (вместо прямого вызова / usr / sbin / sendmail). Да, даже лучше, когда SMTP-сервер находится на локальном хосте, применяются те же принципы. Когда вы можете указать все в конверте для фактического SMTP-соединения, например PHPMailer класс, все эти проблемы, с которыми вы боретесь, исчезнут.

Также стоит отметить, что приведенный ниже ответ показывает, как использовать ini_set () для решения проблемы с почта () команда, но я по-прежнему предпочитаю использовать PHPMailer.