我有一个GCP实例运行whm/cpanel和mailgun设置使用Eximfor多个帐户使用多个域。
当前设置适用于所有域,但它只对主域进行验证。Mailgun支持具有多个凭据的多个域。
当从“c*********t.com”以外的域发送电子邮件时,由于header.from不匹配,所以gmail中有VIA。
dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=c*****s.com部分:8月
mailgun_login:
driver = plaintext
public_name = LOGIN
hide client_send = : postmaster@c*********t.com :
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx部分: ROUTERSTART
mailgun:
driver = manualroute
domains = ! +local_domains
transport = mailgun_transport
route_list = "* smtp.mailgun.org::2525 byname"
host_find_failed = defer
no_more科: TRANSPORTSTART
mailgun_transport:
driver = smtp
hosts = smtp.mailgun.org
hosts_require_auth = smtp.mailgun.org
hosts_require_tls = smtp.mailgun.org如有任何建议或替代办法,将不胜感激。谢谢。
<#>根据下面提供的答案更新日志中的当前错误:
LOG: MAIN
cwd=/usr/local/cpanel/whostmgr/docroot 4 args: /usr/sbin/exim -v -M
1gPYIq-0001cc-UL
delivering 1gPYIq-0001cc-UL
Transport port=25 replaced by host-specific port=2525
Connecting to smtp.mailgun.org [**.**.**.***]:2525 ... connected
SMTP<< 220 ak47 ESMTP ready
SMTP>> EHLO instance-1
SMTP<< 250-ak47
250-AUTH PLAIN LOGIN
250-SIZE 52428800
250-8BITMIME
250-ENHANCEDSTATUSCODES
250-SMTPUTF8
250 STARTTLS
SMTP>> STARTTLS
SMTP<< 220 2.0.0 Start TLS
SMTP>> EHLO instance-1
SMTP<< 250-ak47
250-AUTH PLAIN LOGIN
250-SIZE 52428800
250-8BITMIME
250-ENHANCEDSTATUSCODES
250 SMTPUTF8
SMTP>> AUTH LOGIN
SMTP<< 334 VXNlcm5hbWU6
SMTP>> *
SMTP<< 500 5.5.1 Invalid command
SMTP>> QUIT
SMTP(close)>>
Transport port=25 replaced by host-specific port=2525
Connecting to smtp.mailgun.org [**.**.**.***]:2525 ... connected
SMTP<< 220 ak47 ESMTP ready
SMTP>> EHLO instance-1
SMTP<< 250-ak47
250-AUTH PLAIN LOGIN
250-SIZE 52428800
250-8BITMIME
250-ENHANCEDSTATUSCODES
250-SMTPUTF8
250 STARTTLS
SMTP>> STARTTLS
SMTP<< 220 2.0.0 Start TLS
SMTP>> EHLO instance-1
SMTP<< 250-ak47
250-AUTH PLAIN LOGIN
250-SIZE 52428800
250-8BITMIME
250-ENHANCEDSTATUSCODES
250 SMTPUTF8
SMTP>> AUTH LOGIN
SMTP<< 334 VXNlcm5hbWU6
SMTP>> *
SMTP<< 500 5.5.1 Invalid command
SMTP>> QUIT
SMTP(close)>>
Transport port=25 replaced by host-specific port=2525
Connecting to smtp.mailgun.org [**.**.**.***]:2525 ... connected
SMTP<< 220 ak47 ESMTP ready
SMTP>> EHLO instance-1
SMTP<< 250-ak47
250-AUTH PLAIN LOGIN
250-SIZE 52428800
250-8BITMIME
250-ENHANCEDSTATUSCODES
250-SMTPUTF8
250 STARTTLS
SMTP>> STARTTLS
SMTP<< 220 2.0.0 Start TLS
SMTP>> EHLO instance-1
SMTP<< 250-ak47
250-AUTH PLAIN LOGIN
250-SIZE 52428800
250-8BITMIME
250-ENHANCEDSTATUSCODES
250 SMTPUTF8
SMTP>> AUTH LOGIN
SMTP<< 334 VXNlcm5hbWU6
SMTP>> *
SMTP<< 500 5.5.1 Invalid command
SMTP>> QUIT
SMTP(close)>>
LOG: MAIN
== *********@gmail.com R=mailgun T=mailgun_transport defer (-42): authentication required but authentication attempt(s) failed发布于 2018-11-22 22:48:22
通过研究加拉科斯的答案(我试过了,但没有成功),我找到了这个论坛帖子,并且修改了邮箱的细节,它的工作就像一种魅力。我也喜欢这个解决方案,因为如果需要的话,它可以扩展到其他邮件中继服务。https://forums.cpanel.net/threads/how-to-send-email-from-different-domains-using-different-smarthosts.641949/
我将只概述我为Mailgun使用的设置,但要获得更详细的解释、图片和其他示例,如Sendgrid、Mailjet和Sendpulse,请参阅链接。
部分:8月
#Smart Host Sending
sendbysmarthosts:
driver = plaintext
public_name = LOGIN
hide client_send = : ${extract{user}
{${lookup{$sender_address_domain}lsearch{/etc/exim_smarthosts}}}}: ${extract{pass}{${lookup{$sender_address_domain}lsearch{/etc/exim_smarthosts}}}}部分: PREROUTERS
#Smart Host Sending
sendbysmarthostsrouter:
driver = manualroute
domains = ! +local_domains
condition = "${if eq{${lookup{$sender_address_domain}partial-
lsearch{/etc/exim_smarthosts}{$value}}}{}{false}{true}}"
ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
headers_add = "${perl{mailtrapheaders}}"
transport = sendbysmarthoststransport
route_list = * ${extract{smtp} {${lookup{$sender_address_domain}lsearch{/etc/exim_smarthosts}}}}科: TRANSPORTSTART
#Smart Host Sending
sendbysmarthoststransport:
driver = smtp
port = ${extract{port}
{${lookup{$sender_address_domain}lsearch{/etc/exim_smarthosts}}}}
hosts_require_auth = $host_address
hosts_require_tls = $host_address滚动到页面底部,保存Exim配置并确保Exim重新启动。
这是一些示例数据,更改域、用户和传递。
#Sending by Mailgun
domain1.com: domain=domain1.com user=postmaster@mg.domain1.com pass=MAILGUN_password smtp=smtp.mailgun.org port=587
domain2.com: domain=domain2.com user=postmaster@mg.domain2.com pass=MAILGUN_password smtp=smtp.mailgun.org port=587
domain3.com: domain=domain3.com user=postmaster@mg.domain2.com pass=MAILGUN_password smtp=smtp.mailgun.org port=587第三个示例为domain3.com使用domain2.com凭据,这将有效,但电子邮件将包含一个via mg.domain2.com。
现在,从cPanel在其各自域中创建的电子邮件帐户发送的电子邮件将由exim (允许连接到外部SMTP服务器)发送到intercepted,如果/etc/exim_smarthosts中的凭据正确且DNS设置正确,则通过Mailgun中继。然而,WHM的安全设置仍然限制所有cPanel帐户连接到任何外部SMTP服务,因此我们需要再做一步,以利用上述设置的应用程序电子邮件。
FYI:这个设置应该是<#>kept on限制外部SMTP连接WHM >>微调设置>>邮件>>限制传出SMTP到根、进出口和邮递员
现在,您的CMS,插件和应用程序只是连接到内部SMTP帐户,但当该帐户发送出去,它是中继通过外部SMTP设置在第一步。
BIG感谢cPanel论坛上的DigitalComunic,它的辛勤工作和故障排除为我们提供了一个强有力的解决办法,在今后的几年里应该是有用的!!
发布于 2018-11-05 13:02:59
我有同样的设置(VPS + WHM/cPanel + Exim + Mailgun),在做了一些在线调查之后,我找到了一些关于这个主题的有用网站,并设法得到了正确的配置。下面是我目前在VPS上使用的解决方案,希望它也能帮助您。它应该解决您的“通过”问题,并可能解决间歇性的"550 5.7.1中继拒绝“错误的邮件,以及:
转到WHM中的"Exim配置编辑器“。选择“高级编辑器”并插入以下配置:
部分:8月
mailgun_login:
driver = plaintext
public_name = LOGIN
hide client_send = ": ${extract{login}{${lookup{$sender_address_domain}lsearch{/etc/exim_mailgun}{$value}fail}}} : ${extract{password}{${lookup{$sender_address_domain}lsearch{/etc/exim_mailgun}{$value}fail}}}"部分: ROUTERSTART
mailgun:
driver = manualroute
domains = ! +local_domains
transport = mailgun_transport
route_list = "* smtp.mailgun.org::587 byname"
host_find_failed = defer
no_more科: TRANSPORTSTART
mailgun_transport:
driver = smtp
hosts = smtp.mailgun.org
hosts_require_auth = smtp.mailgun.org
hosts_require_tls = smtp.mailgun.org然后创建一个名为/etc/exim_mailgun的文件,并插入与下面的结构类似的内容(用您的Mailgun的域登录凭据进行了验证):
domain1.com: username=postmaster@mg.domain1.com password=abcdefghi
domain2.com: username=postmaster@mg.domain2.com password=jklmnopqrUPDATE:正如@Supamic评论的那样,我有时会遇到他提到的错误,当邮件由邮件传递系统(Mailer@hostname.youserver.com)发送到我的外部电子邮件帐户(Gmail)时:
authentication required but authentication attempt(s) failed我的猜测可能是由于Mailer“发件人标识”部分,因为Exim无法从我的/etc/exim_mailgun获取登录凭据,因为没有发件人的域:
“Sender identification U=mailnull D=-system- S=mailnull”为了解决这个问题,cPanel技术支持建议我将邮件从Mailer转发到服务器上的本地电子邮件地址,然后使用转发器功能将电子邮件传递到我的Gmail帐户。
至于断断续续的"550 5.7.1中继拒绝“错误,在联系cPanel技术支持后,他们给我的建议是通过在/etc/主机中设置静态IP来强制smtp.mailgun.org到单个IP,而不是允许Exim将smtp.mailgun.org解析为多个IP。
当Exim将smtp.mailgun.org解析为多个IP时,身份验证错误将开始发生。cPanel技术支持无法指出造成此"550 5.7.1中继拒绝“错误的确切原因。也许有些东西不适合Mailgun在冗余SMTP基础架构上维护他们的身份验证。
您可以使用以下命令之一解析Mailgun的SMTP服务器IP:
nslookup smtp.mailgun.org
dig +short smtp.mailgun.org @resolver1.opendns.com使用结果中的一个IP并将其放入/etc/host文件中:
xxx.xxx.xxx.xxx smtp.mailgun.org我想要回显@Supamic的BIG,感谢感谢cPanel技术支持团队。他们在故障排除方面的奉献是值得赞扬的。
发布于 2022-12-02 11:05:28
有用!
我用这个作为我的配置的灵感。(虽然我没有使用cpanel,但基本上是一样的)我需要一些域的邮件通过提供者的服务器传递,而不是使用我自己的服务器,因为SPF检查会失败,因为我的服务器不会被列为允许发送。在上面的配置示例中,我遇到了一些问题,特别是当使用IPv6地址时。
这是我想出的,只是为了改进上面的一点:
# Smarthost auth - comment out to disable:
SMARTHOST_AUTH = /etc/exim4/exim_smarthostsROUTER_DNSLOOKUP_IGNORE_TARGET_HOSTS似乎是基于Debian的默认设置,因此在我的配置中其他地方也使用它,所以最好是一致的,并将其用于此路由器。这是在我的配置中的路由器之前,但它也可以在顶部,在主/宏的conf。
# ignore private rfc1918, loopback, APIPA/link-local, local broadcast, unspecified, unique local, linked-scoped unicast and discard-Only:
.ifndef ROUTER_DNSLOOKUP_IGNORE_TARGET_HOSTS
ROUTER_DNSLOOKUP_IGNORE_TARGET_HOSTS = <; 0.0.0.0 ; 127.0.0.0/8 ; 192.168.0.0/16 ; 172.16.0.0/12 ; 10.0.0.0/8 ; 169.254.0.0/16 ; 255.255.255.255 ; ::/128 ; ::1/128 ; fc00::/7 ; fe80::/10 ; 100::/64
.endifNow路由器本身
更好地利用进出口公司的手工路线功能。允许使用不同的端口等指定多个服务器。使用address_data在一次命中中从文件中获取所有数据,而不是多个文件查找:
.ifdef SMARTHOST_AUTH
# Route some senders to use different outgoing smarthost instead
# of direct sending. Lookup from SMARTHOST_AUTH file:
r_sendbysmarthost:
debug_print = "R: $router_name for $local_part@$domain"
driver = manualroute
domains = ! +local_domains
condition = ${lookup{$sender_address_domain}partial-lsearch{SMARTHOST_AUTH}{true}{false}}
address_data = ${lookup{$sender_address_domain}partial-lsearch{SMARTHOST_AUTH}}
ignore_target_hosts = ROUTER_DNSLOOKUP_IGNORE_TARGET_HOSTS
transport = t_sendbysmarthost
route_data = <,${extract{smtp}{$address_data}}
host_find_failed = ignore
host_all_ignored = defer
hosts_randomize = true
# remove previous Received headers for privacy if needed:
headers_remove = Received
# cPanel requirement:
# headers_add = "${perl{mailtrapheaders}}"
more = no
.endif我已经简化了这一点,所以它只是设置smtp端口和auth需求。端口是默认的587,但是如果需要的话,exim路由器允许在每个服务器上覆盖它。
hosts_require_auth和hosts_require_tls是主机列表,在使用$host_address和冒号时IPv6地址有问题。(IPv6地址包含冒号,这会破坏冒号分隔的主机列表。我们可以修复这个问题,但是由于路由器已经决定使用这个传输,所以我们可以在这里指定"*“。
t_sendbysmarthost:
debug_print = "T: $transport_name for $local_part@$domain"
driver = smtp
port = 587
connect_timeout = 30s
hosts_require_auth = *
hosts_require_tls = *添加条件,以防止exim使用错误的身份验证器,如果配置了多个登录名。使用$address_data (由路由器设置)而不是更多的文件查找。
.ifdef SMARTHOST_AUTH
auth_smarthost:
driver = plaintext
public_name = LOGIN
client_condition = "${extract{smtp}{$address_data}{true}{false}}"
hide client_send = ": ${extract{user}{$address_data}}:${extract{pass}{$address_data}}"
.endif由SMARTHOST_AUTH定义的文件(例如/etc/exim4/exim_smarthosts)
示例:
# Simple - Select a single server:
domain1.com: user=username@domain1.com pass=PASSWORD_HERE smtp=smtp.domain1.com
# List of servers to try (separated with ",")
domain2.com: user=username@domain2.com pass=PASSWORD_HERE smtp=server1.domain2.com,server2.domain2.com
# Subdomain, give a list of servers, specify non-standard port (overrides transport)
*.domain3.com: user=username@domain3.com pass=PASSWORD_HERE smtp=weirdserver1.domain3.com:444,weirdserver3.domain3.com:587
# List of servers, grouped primary, secondary MX-like behaviour.
# Separate groups with "+".
domain4.com: user=username@domain4.com pass=PASSWORD_HERE smtp=smtp1.domain4.com,smtp2.domain4.com,smtp3.domain4.com+backup1.domain4.com,backup2.domain4.com编辑:如果任何一个值包含空格,它们必须用双引号括起来,而任何用双引号括起来的值都会被转义处理。
不要在分隔符(例如“、”或"+“)周围放置空格。
https://serverfault.com/questions/910752
复制相似问题