首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Exim多个域和凭据

问Exim多个域和凭据
EN

Server Fault用户
提问于 2018-05-04 14:29:08
回答 3查看 5.4K关注 0票数 3

我有一个GCP实例运行whm/cpanel和mailgun设置使用Eximfor多个帐户使用多个域。

当前设置适用于所有域,但它只对主域进行验证。Mailgun支持具有多个凭据的多个域。

当从“c*********t.com”以外的域发送电子邮件时,由于header.from不匹配,所以gmail中有VIA。

代码语言:javascript
复制
dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=c*****s.com

“通过”和“图片不显示”的屏幕截图

部分:8月

代码语言:javascript
复制
mailgun_login:
driver = plaintext
public_name = LOGIN
hide client_send = : postmaster@c*********t.com : 
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

部分: ROUTERSTART

代码语言:javascript
复制
mailgun:
driver = manualroute
domains = ! +local_domains
transport = mailgun_transport
route_list = "* smtp.mailgun.org::2525 byname"
host_find_failed = defer
no_more

科: TRANSPORTSTART

代码语言:javascript
复制
mailgun_transport:
driver = smtp
hosts = smtp.mailgun.org
hosts_require_auth = smtp.mailgun.org
hosts_require_tls = smtp.mailgun.org

如有任何建议或替代办法,将不胜感激。谢谢。

<#>根据下面提供的答案更新日志中的当前错误:

代码语言:javascript
复制
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
EN

回答 3

Server Fault用户

发布于 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,请参阅链接。

  1. 在WHM中,转到"Exim配置管理器“(Home >>)。之后,单击“高级编辑器”选项卡。(在进行这些更改之前,最好先做backup设置)

部分:8月

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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重新启动。

  1. 在"exim_smarthosts“目录中创建名为"/etc”的文件,其中包含Mailgun或其他智能参数。

这是一些示例数据,更改域、用户和传递。

代码语言:javascript
复制
#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到根、进出口和邮递员

要从Joomla、Wordpress或其他CMS或应用程序发送电子邮件,请按照下面的步骤

  1. ( a)在cPanel中创建一个电子邮件帐户,并获取安全的登录凭据。cPanel >>电子邮件帐户>> (新电子邮件) >> Connect >>设置电子邮件客户端b)在Joomla、WordPress或其他CMS/App/Plugin中使用此用户名、密码和传出服务器详细信息

现在,您的CMS,插件和应用程序只是连接到内部SMTP帐户,但当该帐户发送出去,它是中继通过外部SMTP设置在第一步。

BIG感谢cPanel论坛上的DigitalComunic,它的辛勤工作和故障排除为我们提供了一个强有力的解决办法,在今后的几年里应该是有用的!!

票数 2
EN

Server Fault用户

发布于 2018-11-05 13:02:59

我有同样的设置(VPS + WHM/cPanel + Exim + Mailgun),在做了一些在线调查之后,我找到了一些关于这个主题的有用网站,并设法得到了正确的配置。下面是我目前在VPS上使用的解决方案,希望它也能帮助您。它应该解决您的“通过”问题,并可能解决间歇性的"550 5.7.1中继拒绝“错误的邮件,以及:

转到WHM中的"Exim配置编辑器“。选择“高级编辑器”并插入以下配置:

部分:8月

代码语言:javascript
复制
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

代码语言:javascript
复制
mailgun:
driver = manualroute
domains = ! +local_domains
transport = mailgun_transport
route_list = "* smtp.mailgun.org::587 byname"
host_find_failed = defer
no_more

科: TRANSPORTSTART

代码语言:javascript
复制
mailgun_transport:
driver = smtp
hosts = smtp.mailgun.org
hosts_require_auth = smtp.mailgun.org
hosts_require_tls = smtp.mailgun.org

然后创建一个名为/etc/exim_mailgun的文件,并插入与下面的结构类似的内容(用您的Mailgun的域登录凭据进行了验证):

代码语言:javascript
复制
domain1.com:    username=postmaster@mg.domain1.com     password=abcdefghi
domain2.com:    username=postmaster@mg.domain2.com     password=jklmnopqr

UPDATE:正如@Supamic评论的那样,我有时会遇到他提到的错误,当邮件由邮件传递系统(Mailer@hostname.youserver.com)发送到我的外部电子邮件帐户(Gmail)时:

代码语言:javascript
复制
authentication required but authentication attempt(s) failed

我的猜测可能是由于Mailer“发件人标识”部分,因为Exim无法从我的/etc/exim_mailgun获取登录凭据,因为没有发件人的域:

代码语言:javascript
复制
“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:

代码语言:javascript
复制
nslookup smtp.mailgun.org

dig +short smtp.mailgun.org @resolver1.opendns.com

使用结果中的一个IP并将其放入/etc/host文件中:

代码语言:javascript
复制
xxx.xxx.xxx.xxx     smtp.mailgun.org

我想要回显@Supamic的BIG,感谢感谢cPanel技术支持团队。他们在故障排除方面的奉献是值得赞扬的。

票数 0
EN

Server Fault用户

发布于 2022-12-02 11:05:28

有用!

我用这个作为我的配置的灵感。(虽然我没有使用cpanel,但基本上是一样的)我需要一些域的邮件通过提供者的服务器传递,而不是使用我自己的服务器,因为SPF检查会失败,因为我的服务器不会被列为允许发送。在上面的配置示例中,我遇到了一些问题,特别是当使用IPv6地址时。

这是我想出的,只是为了改进上面的一点:

宏(文件/ main / debian 00_macros顶部):

代码语言:javascript
复制
# Smarthost auth - comment out to disable:
SMARTHOST_AUTH           = /etc/exim4/exim_smarthosts

路由器

ROUTER_DNSLOOKUP_IGNORE_TARGET_HOSTS似乎是基于Debian的默认设置,因此在我的配置中其他地方也使用它,所以最好是一致的,并将其用于此路由器。这是在我的配置中的路由器之前,但它也可以在顶部,在主/宏的conf。

代码语言:javascript
复制
# 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
.endif

Now路由器本身

更好地利用进出口公司的手工路线功能。允许使用不同的端口等指定多个服务器。使用address_data在一次命中中从文件中获取所有数据,而不是多个文件查找:

代码语言:javascript
复制
.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地址包含冒号,这会破坏冒号分隔的主机列表。我们可以修复这个问题,但是由于路由器已经决定使用这个传输,所以我们可以在这里指定"*“。

代码语言:javascript
复制
t_sendbysmarthost:
        debug_print = "T: $transport_name for $local_part@$domain"
        driver = smtp
        port = 587
        connect_timeout = 30s
        hosts_require_auth = *
        hosts_require_tls = *

Auth

添加条件,以防止exim使用错误的身份验证器,如果配置了多个登录名。使用$address_data (由路由器设置)而不是更多的文件查找。

代码语言:javascript
复制
.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)

示例:

代码语言:javascript
复制
# 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

编辑:如果任何一个值包含空格,它们必须用双引号括起来,而任何用双引号括起来的值都会被转义处理。

不要在分隔符(例如“、”或"+“)周围放置空格。

参考资料

  1. 进出口:字符串展开
  2. 进出口:文件和数据库查找
  3. 进出口:路由器的通用选项
  4. 进出口:人工路由路由器
  5. 进出口: smtp传输
票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/910752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档