Как правильно настроить полное доменное имя для 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. Это было самое чистое решение с настройкой нашего сайта, поэтому мы использовали его.