使用 Ubuntu 作为 Gmail 的 SMTP 服务器

使用 Ubuntu 作为 Gmail 的 SMTP 服务器

有人能给我提供一份使用 Postfix(或类似程序)作为 Gmail 的 SMTP 服务器发送电子邮件的指南吗?我搜索了很久,但一无所获。

我有多个域名,所有电子邮件都终止于 Gmail,但 Google 不久前改变了他们的政策,不再允许用户从多个域名发送电子邮件 - 现在他们坚持要求您拥有自己的 SMTP 服务器。我有一个用于网络托管的 Ubuntu VPS,有什么原因不能将其用作 Gmail 的 SMTP 服务器吗?

答案1

注意:此答案是为 16.04 服务器编写的,但如有必要,可以适用于 14.04(systemctl ...用适当的service命令替换命令。)

这是一个非常复杂的任务设置。有一个虽然这其中有几个重要的独立部分,但这里的设置有四个主要组成部分,而且也是“安全的”:

  1. 所用系统的 ISP(住宅 IP 通常不适合;您需要在数据中心使用 VPS 或 AWS 云 EC2 实例或类似的东西)

    基本上,做不是为此,请使用您自己的网络。在其他地方设置您的 SMTP 服务器,例如 Amazon EC2。

    但是,我强烈建议从某个地方获取单独的 VPS,您可以在其中设置 IP 地址的 rDNS,以匹配您必须设置的正向 DNS。我们稍后会讨论 DNS。

  2. 系统本身(锁定的 SSH、防火墙等)

    我们需要对系统进行基本配置,以禁止在端口 25 上进行连接,并且不使用 SSL。我们还需要锁定系统。在确保其余工作正常后,我们将最后执行此步骤。

  3. Postfix MTA

    这提供了 SMTP。我们最终不需要它递送邮件,所以我们不需要将其作为您网站 DNS 中的 MX 记录,但我们需要设置一些东西;我们需要一个主机名的 A 记录,并且我们需要一个反向 DNS 记录来匹配(因此建议使用实际的 VPS 而不是 EC2 实例)。

  4. 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_ADDRESSSMTP_USERNAMESMTP_PASSWORDSMTP_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 设置。

GMail 设置按钮

进入设置后,转到“帐户和导入”选项卡。

您需要在“以...身份发送邮件”部分中“删除”迄今为止设置的任何别名,然后点击“添加另一个电子邮件地址”。

在此处输入图片描述

在弹出的窗口中输入您的姓名和其他域的另一个电子邮件地址。

在此处输入图片描述

点击“下一步”后,您将看到如下页面。请确保正确输入服务器的 IP 地址,并将用户名和密码设置为我们之前创建的用户名和密码。还要确保选择“使用 SSL 的安全连接”选项。这将强制在发送邮件之前进行 SSL 连接。它应该看起来像这样,只是空白处有服务器的 IP 地址:

在此处输入图片描述

使用“添加帐户”保存设置。您将收到一封电子邮件,表明您需要验证是否希望 GMail 向该地址发送邮件;它将向您发送一个可点击的链接,其中包含验证码。您只需在电子邮件到达后在此过程中打开的最后一个窗口中输入验证码即可。

完成后,使用 GMail 将电子邮件发送到某个地方,并选择另一个“发件人”地址,它应该通过我们刚刚设置的 SMTP 服务器发送!:)

相关内容