Я уверен, что были заданы варианты этого вопроса, и я прошу прощения, если это дубликат, но я просто не могу найти что-то, что работает в моей ситуации, не нарушая что-то еще.
Я использую свой 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, потому что он лучше соответствовал настройке нашего программного обеспечения.
Источники: 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)
Источники: Руководство по PHP и Переполнение стека
mail($to, $subject, $message, $headers, "-f ".$email)
Используйте дополнительные_параметры, чтобы изменить поля От и Ответить. Этот метод проще, но вы должны уделять больше внимания очистке пользовательского ввода, как указано в комментарии на этой странице.
Это также вызывает предупреждение в файле журнала.
Authentication-Warning: devbox.ourlocalnetwork.lan: apache set sender to test@test.com using -f
Мне не понравился "запах" этого кода, поэтому мы выбрали следующий метод
Это было нашим реальным решением. Мы использовали mail () в устаревшем коде. Мой коллега переписал этот фрагмент кода с помощью CodeIgniter, пока я баловался с sendmail. Это было самое чистое решение при настройке нашего веб-сайта, поэтому мы его использовали.