有人能给我提供一份使用 Postfix(或类似程序)作为 Gmail 的 SMTP 服务器发送电子邮件的指南吗?我搜索了很久,但一无所获。
我有多个域名,所有电子邮件都终止于 Gmail,但 Google 不久前改变了他们的政策,不再允许用户从多个域名发送电子邮件 - 现在他们坚持要求您拥有自己的 SMTP 服务器。我有一个用于网络托管的 Ubuntu VPS,有什么原因不能将其用作 Gmail 的 SMTP 服务器吗?
答案1
注意:此答案是为 16.04 服务器编写的,但如有必要,可以适用于 14.04(
systemctl ...
用适当的service
命令替换命令。)
这是一个非常复杂的任务设置。有一个吨虽然这其中有几个重要的独立部分,但这里的设置有四个主要组成部分,而且也是“安全的”:
所用系统的 ISP(住宅 IP 通常不适合;您需要在数据中心使用 VPS 或 AWS 云 EC2 实例或类似的东西)
基本上,做不是为此,请使用您自己的网络。在其他地方设置您的 SMTP 服务器,例如 Amazon EC2。
但是,我强烈建议从某个地方获取单独的 VPS,您可以在其中设置 IP 地址的 rDNS,以匹配您必须设置的正向 DNS。我们稍后会讨论 DNS。
系统本身(锁定的 SSH、防火墙等)
我们需要对系统进行基本配置,以禁止在端口 25 上进行连接,并且不使用 SSL。我们还需要锁定系统。在确保其余工作正常后,我们将最后执行此步骤。
Postfix MTA
这提供了 SMTP。我们最终不需要它递送邮件,所以我们不需要将其作为您网站 DNS 中的 MX 记录,但我们做需要设置一些东西;我们需要一个主机名的 A 记录,并且我们需要一个反向 DNS 记录来匹配(因此建议使用实际的 VPS 而不是 EC2 实例)。
Dovecot 核心
通常情况下我们认为 DoveCot 是 POP3 或 IMAP 服务的提供商,但
dovecot-core
它本身也可用于提供 SASL 后端,该后端运行起来没有太多问题,并且与系统用户交互。这就是我们使用 Dovecot 的全部目的,但我们需要调整一些配置。
我不会触及第 1 点,因为我无法控制这一点。我能不过,我会为您提供有关如何设置的指导。我们将按照与上述列表不同的顺序进行设置,但我们仍将完成所有设置。
Dovecot 核心
dovecot-core
将用于 SASL 后端。稍后我们需要处理一些事情才能“安全”地发送邮件,但我们可以开始设置 Dovecot 后端。
首先,安装dovecot-core
:
sudo apt-get install dovecot-core
接下来我们需要对 进行一些修改/etc/dovecot/conf.d/10-auth.conf
。
让我们禁用纯文本身份验证,并要求使用 SSL 来获取凭证。从 postfix 到 dovecot 最终都无关紧要,但这是值得做的一步。
寻找:
#disable_plaintext_auth = yes
用。。。来代替:
disable_plaintext_auth = yes
接下来,我们需要启用“登录”验证机制。
寻找:
auth_mechanisms = plain
用。。。来代替:
auth_mechanisms = plain login
然后,我们需要编辑该/etc/dovecot/conf.d/10-master.conf
文件。
寻找:
# Postfix smtp-auth #unix_listener /var/spool/postfix/private/auth { # mode = 0666 #}
修改为:
# Postfix smtp-auth unix_listener /var/spool/postfix/private/auth { mode = 0660 user = postfix group = postfix }
这将启用 Dovecot 中 SASL 的 Postfix 身份验证后端。
最后,对于 Dovecot,我们需要编辑/etc/dovecot/conf.d/auth-system.conf.ext
:
寻找:
passdb { driver = pam # [session=yes] [setcred=yes] [failure_show_msg=yes] [max_requests=<n>] # [cache_key=<key>] [<service name>] #args = dovecot }
修改为:
passdb { args = %s driver = pam # [session=yes] [setcred=yes] [failure_show_msg=yes] # [max_requests=> <n>] # [cache_key=<key>] [<service name>] #args = dovecot }
完成后,我们可以重新启动 Dovecot 进程:
sudo systemctl restart dovecot
后缀
现在,开始实际的 SMTP 操作。配置起来并不像 Dovecot 那么困难。
首先,安装 Postfix 和ssl-cert
软件包,它将创建一个基本的自签名证书,只是足以与 SMTP 客户端的 SSL 安全 SASL 身份验证配合使用:
sudo apt-get install postfix ssl-cert
当提示 Postfix 站点类型时,只需选择“Internet 站点”。
完成后,我们需要对 Postfix 文件进行一些修改。
找到这一行:
smtp inet n - y - - smtpd
在这些行下方添加,使该行看起来像这样,并且在其下方有两行:
smtp inet n - y - - smtpd
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
还有一个很大的部分以 开头,submission
被注释掉了。取出整个部分,取消注释该部分,使其看起来像这样:
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_wrappermode=yes
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
# -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination,check_policy_service unix:private/policy-spf,reject
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o smtpd_reject_unlisted_recipient=yes
-o milter_macro_daemon_name=ORIGINATING
-o smtpd_sasl_type=dovecot
-o smtpd_sasl_path=private/auth
现在配置完毕,我们现在需要通过编辑来编辑核心设置/etc/postfix/main.cf
。
首先,/etc/postfix/main.cf
转到/etc/postfix/main.cf.dist
:
sudo mv /etc/postfix/main.cf /etc/postfix/main.cf.dist
接下来,将以下内容放入新文件中。确保至少更新域名和主机名一您的域名:
# See /usr/share/postfix/main.cf.dist for a commented, more complete version
# Debian specific: Specifying a file name will cause the first
# line of that file to be used as the name. The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
# appending .domain is the MUA's job.
append_dot_mydomain = no
# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h
readme_directory = no
# TLS parameters
smtpd_use_tls=yes
smtpd_tls_security_level=may
smtpd_tls_auth_only=no
smtp_tls_note_starttls_offer=yes
# Use an actual certificate.
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
# Use an actual key.
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
#smtpd_tls_session_cache_database=btree:${data_directory}/smtpd_scache
smtpd_tls_mandatory_protocols = !SSLv2,!SSLv3
smtpd_tls_protocols = !SSLv2,!SSLv3
smtpd_tls_mandatory_ciphers = medium
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
tls_random_source = dev:/dev/urandom
#tls_medium_cipherlist = AES128+EECDH:AES128+EDH
smtpd_client_connection_rate_limit = 50
anvil_rate_time_unit = 120s
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, check_policy_service unix:private/policy-spf
# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
myhostname = mail.somedomain
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = $myhostname somedomain mail.somedomain localhost.somedomain localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
local_recipient_maps = proxy:unix:passwd.byname $alias_maps
milter_protocol = 2
milter_default_action = accept
queue_directory = /var/spool/postfix
请注意,这里的大部分配置选项都用于主要具有 Dovecot 后端的完整 SMTP/IMAP 设置。您仍然可以使用此配置,因为它是从实际邮件服务器中提取的(一些数据被混淆了,哈哈),作为设置它的基础,以便仅使用其中的 SMTP 部分来处理您的事务。所以最终,不要担心其他任何事情。
请注意,我建议您仅为邮件服务器获取 SSL 证书,或者如果您的某个域有通配符证书,请使用该证书并将邮件名称设置为该证书中的域。这样,您就不会在连接上使用自签名 SSL 证书进行 SSL/TLS 加密。仅供参考,如果您所做的只是从 SMTP 客户端(如 Google 的“以身份发送邮件”功能)提交电子邮件,那么您仍然可以将自签名证书用于大多数事情。
完成此处操作后,我们需要停止然后启动 Postfix 进程:
sudo systemctl stop postfix
sudo systemctl start postfix
现在我们应该可以使用 Postfix 和 Dovecot SASL了。
但是我们需要一个用户来验证。
我们没有创建用户,您只有几个选项。在本例中,我们将创建一个投入的用户进行 SMTP 身份验证。
我们将使用以下内容创建用户:
sudo useradd --create-home --user-group --shell /usr/sbin/nologin authsmtpuser
然后我们需要设置密码。您可以使用以下命令执行此操作,并相应地输入密码。(不幸的是,提示时不会显示字符,也不会显示占位符)
sudo passwd authsmtpuser
如果您不这样做,并且在您想要进行身份验证的框上有另一个用户名(不是root),请在下面的脚本中使用该用户名。
现在我们可以测试一下了。
让我们测试一下。 这是一个非常简单的 Python 3 脚本,您可以使用它来“测试”一切是否按我们预期的方式工作。 请确保更新、、、DESTINATION_ADDRESS
和此处以确保该脚本能正常工作。SOURCE_ADDRESS
SMTP_USERNAME
SMTP_PASSWORD
SMTP_SERVER_ADDR
将其保存在test_smtp_server_tls.py
某个地方,并记住我们保存它的位置。(您可以根据/tmp/
需要创建它,以便它在重启后不会保留在您的计算机上)
#!/usr/bin/env python3
import email.utils as emailutils
import smtplib
from email.mime.text import MIMEText
DESTINATION_ADDRESS = '[email protected]'
SOURCE_ADDRESS = '[email protected]'
SMTP_USERNAME = 'authsmtpuser'
SMTP_PASSWORD = 'your password'
SMTP_SERVER_ADDR = 'ip.add.re.ss'
SMTP_SERVER_PORT = 587 # Don't change this.
# Construct a test message.
msg = MIMEText("This is a test message from your custom SMTP server!")
msg['To'] = DESTINATION_ADDRESS
msg['From'] = SOURCE_ADDRESS
msg['Date'] = emailutils.formatdate(localtime=True)
msg['Message-ID'] = emailutils.make_msgid()
msg['Subject'] = "SMTP Server Mail Testing"
try:
print ("Establishing SMTP connection with SSL...")
conn = smtplib.SMTP_SSL(SMTP_SERVER_ADDR, SMTP_SERVER_PORT)
print ("Established connection.")
except Exception as e:
print ("Could not establish SMTP connection. Error was:\n%s" % str(e))
exit(1)
try:
print ("Attempting to authenticate...")
(_, response) = conn.login(SMTP_USERNAME, SMTP_PASSWORD)
if 'Authentication successful' in response.decode('utf-8'):
print ("Authenticated with SMTP server successfully.")
else:
print ("Could not authenticate with server, response was: %s" % response.decode('utf-8'))
exit(2)
except Exception as e:
print ("Could not authenticate with SMTP. Error was:\n%s" % str(e))
try:
print ("Sending test message to [%s] from [%s] with subject [%s]..." % (DESTINATION_ADDRESS, SOURCE_ADDRESS, msg['Subject']))
conn.sendmail(SOURCE_ADDRESS, DESTINATION_ADDRESS, msg.as_string())
print ("Message queued for sending, please check your destination email inbox and junk folders for the message.")
except Exception as e:
print ("Could not send email. Error was:\n%s" % str(e))
exit(3)
exit(0)
使用 执行此脚本python3 /tmp/test_smtp_server_tls.py
(假设您将其保存在/tmp/
;如果您将其保存在其他地方,请更改路径)。
检查目标电子邮件地址收件箱等。如果一切正常,您将很快收到来自服务器和自定义域的电子邮件。它可能会进入您的垃圾邮件箱,因此如果您最初没有收到邮件,请检查那里。
系统——封锁时间到了!
当然,这是假设上述所有步骤均有效。
是时候设置防火墙以禁止未经授权的访问了。请注意,我讨厌ufw
,它对于我的需求来说不够复杂,所以我用 - 写了这个答案iptables
,您可以sudo ufw disable
关闭 UFW 并使用直接iptables
操作。我还假设您的系统上有 IPv4。
如果您已经设置了防火墙规则,则只需添加一条规则即可接受端口 587 上的新连接。
如果您没有启用防火墙,请执行以下命令(在执行该行之前,添加其他iptables -A INPUT -p tcp --dport 123 -m conntrack --ctstate NEW -j ACCEPT
行,将其替换123
为系统上您需要接受连接的任何其他服务的实际端口号,例如 HTTPS 和 HTTP 的 tcp/443 和 tcp/80 -j DROP
):
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m comment --comment "Allow SSH access remotely." -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 587 -m conntrack --ctstate NEW -m comment --comment "Allow TLS-protected SMTP connections, for sending mail." -j ACCEPT
sudo iptables -A INPUT -j DROP
完成所有设置后,运行以下命令:sudo apt-get install iptables-persistent
。当系统要求保存当前规则集时,请对每个规则集点击“是”。
在关闭 SSH 连接或与服务器的连接之前,请确保上述测试脚本和 SSH 访问仍然有效!如果一切正常,那么最后一步是设置 Google 别名并告诉它使用不同的服务器从该域发送 SMTP。
Google 配置
如果你的 GMail 是在 Google Apps 系统下,而你没有使用允许你使用外部 SMTP 服务器发送邮件的 Google Apps 套餐,那么你无法完成这一部分。这是 Google 强加的限制,我无法帮助您。
在 GMail 页面,我们需要进行一些配置。首先,进入您的 GMail 设置。
进入设置后,转到“帐户和导入”选项卡。
您需要在“以...身份发送邮件”部分中“删除”迄今为止设置的任何别名,然后点击“添加另一个电子邮件地址”。
在弹出的窗口中输入您的姓名和其他域的另一个电子邮件地址。
点击“下一步”后,您将看到如下页面。请确保正确输入服务器的 IP 地址,并将用户名和密码设置为我们之前创建的用户名和密码。还要确保选择“使用 SSL 的安全连接”选项。这将强制在发送邮件之前进行 SSL 连接。它应该看起来像这样,只是空白处有服务器的 IP 地址:
使用“添加帐户”保存设置。您将收到一封电子邮件,表明您需要验证是否希望 GMail 向该地址发送邮件;它将向您发送一个可点击的链接,其中包含验证码。您只需在电子邮件到达后在此过程中打开的最后一个窗口中输入验证码即可。
完成后,使用 GMail 将电子邮件发送到某个地方,并选择另一个“发件人”地址,它应该通过我们刚刚设置的 SMTP 服务器发送!:)