Как правильно настроить полное доменное имя для sendmail для работы с почтой PHP ()?

Я уверен, что были заданы варианты этого вопроса, и я прошу прощения, если это дубликат, но я просто не могу найти то, что работает в моей ситуации, не ломая что-то еще.

Я использую свой VPS в качестве веб-сервера, и мне нужны контактные формы на веб-сайтах для отправки почты через сервер. Я установил sendmail и, в основном, он работает. Тем не менее, почта не прошла много тестов SPF. Я добавил записи SPF в каждый домен, но когда я проверял заголовки почты, я заметил много:

ARC-Authentication-Results: i=1; mx.google.com;
   spf=neutral (google.com: 123.45.67.89 is neither permitted nor denied by best guess record for domain of user@foo.localdomain) smtp.mailfrom=user@foo.localdomain

Return-Path: <user@foo.localdomain>

Сначала я просто изменил имя хоста коробки (и добавил записи в /etc/hostsа также) к моему основному FQDN. Я сделал это, потому что я использовал include:foo.com в моих записях SPF.

У этого были некоторые побочные эффекты, поэтому я отменил изменения и вернулся к локальному имени коробки.

Я прочитал и внес изменения в этот вопрос путем редактирования sendmail.mc добавить define(`confDOMAIN_NAME', `foo.com')dnl

Затем я попытался отправить контактную форму со своего собственного веб-сайта (расположенного в том же основном домене) и получил сообщение об ошибке из контактной формы 7. Я попробовал клиентский сайт (тот же сервер, другое FQDN), и это сработало. Поэтому я удалил эту пользовательскую запись и перестроил файл sendmail.mc.

Как правильно, чтобы sendmail создавал почтовые заголовки из полного доменного имени, не нарушая что-либо еще? Должен ли я просто попробовать снова sendmail.mc, но создал mail.foo.com поддомен?

Я очень сбит с толку - я просто хочу, чтобы мои почтовые заголовки перестали иметь локальные домены в них, чтобы SPF не приходилось догадываться и будет передавать почту как действительную там, где у меня есть записи SPF, которые специально позволяют отправка IP и домена (как я уже делаю).

РЕДАКТИРОВАТЬ: вот мой /etc/hosts файл прямо сейчас:

127.0.0.1 localhost localhost.localdomain
127.0.0.1 example.com mail.example.com
127.0.1.1 myboxname.localdomain myboxname

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

И выход sendmail -bt -d0.1 root является:

Version 8.15.2
 Compiled with: DNSMAP IPV6_FULL LDAPMAP LDAP_REFERRALS LOG MAP_REGEX
                MATCHGECOS MILTER MIME7TO8 MIME8TO7 NAMED_BIND NETINET NETINET6
                NETUNIX NEWDB NIS NISPLUS PIPELINING SASLv2 SCANF STARTTLS
                TCPWRAPPERS USERDB USE_LDAP_INIT XDEBUG

============ SYSTEM IDENTITY (after readcf) ============
      (short domain name) $w = myboxname
  (canonical domain name) $j = mail.example.com
         (subdomain name) $m = localdomain
              (node name) $k = myboxname
========================================================

1 ответ

У меня были те же проблемы - наше реле отклонило ctladdr, confDOMAIN_NAME не работало, и изменение имени хоста затронуло бы другие программы. Я использую CentOS 6.x, но я верю, что они будут работать и с Ubuntu. Я нашел два решения, которые работали с mail() и sendmail. Нашим конечным решением было использование класса электронной почты CodeIgniter, потому что он лучше соответствовал нашей настройке программного обеспечения.

Способ № 1: псевдоним домена

Источники: LinuxQuestions и ServerFault

До настройки псевдонима мое имя хоста выглядело так

[root@devbox ~]# hostname --fqdn
devbox.ourlocalnetwork.lan

[root@devbox ~]# sendmail -bt -d0.1 </dev/null

...

============ SYSTEM IDENTITY (after readcf) ============
      (short domain name) $w = devbox
  (canonical domain name) $j = devbox.ourlocalnetwork.lan
         (subdomain name) $m = ourlocalnetwork.lan
              (node name) $k = devbox
========================================================

Я добавил эту строку в /etc/hosts и перезапустил сеть

127.0.0.1   devbox.ourlocalnetwork.lan mail.myrealdomain.com

Sendmail вытащил псевдоним и будет отправлять электронные письма, используя этот домен

[root@devbox ~]# hostname --fqdn
devbox.ourlocalnetwork.lan

[root@devbox ~]# sendmail -bt -d0.1 </dev/null

...

============ SYSTEM IDENTITY (after readcf) ============
      (short domain name) $w = mail
  (canonical domain name) $j = mail.myrealdomain.com
         (subdomain name) $m = myrealdomain.com
              (node name) $k = devbox
========================================================

Я отправил электронное письмо с веб-формой, и результаты были видны в /var/log/maillog, ctladdr теперь был настроен правильно

Feb  6 17:03:45 devbox sendmail[6854]: w16M3irS006852: to=<support@whatever.com>, ctladdr=<apache@mail.myrealdomain.com> (48/48), delay=00:00:01, xdelay=00:00:01, mailer=esmtp, pri=120567, relay=mx1.ourrelayprivder.com. [relay_ip_redacted], dsn=2.0.0, stat=Sent (Ok: queued as 2445F140071)

Способ № 2: mail() дополнительные_параметры

Источники: руководство по PHP и StackOverflow

mail($to, $subject, $message, $headers, "-f ".$email)

Используйте дополнительные_параметры, чтобы изменить поля От и Ответ. Этот метод проще, но вы должны уделять больше внимания дезинфекции пользовательского ввода, как отмечено в комментариях на этой странице.

Это также выдает предупреждение в файле журнала

Authentication-Warning: devbox.ourlocalnetwork.lan: apache set sender to test@test.com using -f

Мне не понравился "запах" этого кода, поэтому мы пошли со следующим методом

Способ № 3: использовать другую библиотеку электронной почты / рамки

Это было наше реальное решение. Мы использовали mail() в устаревшем коде. Мой коллега переписал этот кусок кода, используя CodeIgniter, пока я дурачился с sendmail. Это было самое чистое решение с настройкой нашего сайта, поэтому мы использовали его.

Другие вопросы по тегам