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

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

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

Я использую свой 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а также) на мое основное полное доменное имя. Я сделал это, потому что использовал include:foo.com в моих записях SPF.

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

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

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

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

Метод 1: псевдоним домена

Источники: LinuxВопросы и 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 и Переполнение стека

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

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

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

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

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

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

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