在Debian下使用mailx+exim4发送邮件和一种发送免费提醒短信的方法


前言

本文主要描述在GNU/Debian 10中配置使用mailx+exim4实现命令行发送126邮件。在文章末尾附带提供了Python3编程发送邮件的代码,还介绍了一种利用某些邮箱服务免费发提醒短信的方法。

本文中的方法在其它版本的Debian、Ubuntu,在其它邮箱服务中或许也可行。对于苦于云提供商限制TCP 25端口收发邮件的也可以作为参考(因为本人也遇到这个问题但发送成功了)。另外,如果有参照官方给出的Debian自动安全更新方法对自己的主机进行自动更新的话,也需要用到mailx发送更新结果[1]Debian Foundation. UnattendedUpgrades (last modified 2020-11-29 12:37:43). Debian Wiki. https://wiki.debian.org/UnattendedUpgrades[2]Eric. Debian & Ubuntu 自动检查安装更新. Web Page. Wed Mar 10 2021 13:50:56 GMT+0000 (Coordinated Universal Time). https://www.hostarr.com/automatic-updates-on-debian-and-ubuntu/

mailx是一个命令行收发邮件客户端,专业点说叫邮件用户代理(Message User Agent, MUA)。exim4是Debian默认的邮件传输代理(Message Transfer Agent, MTA)。Debian方面对这些术语的解释如下(推荐需要设置邮件服务器的朋友,看一看官方的这个文档):

邮件系统涉及到运行在多个主机上的许多服务器程序和客户端程序。从功能来说,有3种类型的邮件代理程序:

* 邮件传输代理(MTA,参见 第 6.3 节 “邮件传输代理 (MTA)”),是不同主机之间传送邮件的程序。

* 邮件投递代理(MDA,参见 第 6.6 节 “带有过滤器的邮件投递代理 (MDA)”),是传递信息到一台主机内的用户邮箱的程序。

* 邮件用户代理(MUA,也被称为电子邮件客户端,参见 第 6.4 节 “邮件用户代理 (MUA)”),是生成信息和访问传递的信息的程序。

Debian 参考手册 – 第 6 章 网络应用 – 6.2. 邮件系统[3]Debian 参考手册, 第 6 章 网络应用, 6.2. 邮件系统. Thu Mar 11 2021 05:54:20 GMT+0000 (Coordinated Universal Time). … Continue reading

本文的配置即是使用mailx生成邮件信息通过exim4(本地MTA)发送出去(smarthost 投递和本地投递)。网上有看到说把exim4、sendmail这类本地MTA服务关掉直接使用mailx发邮件,我认为这种说法或方法可能有点问题(我没试过,或者说没成功过)[4]mouyu230. debian通过mailx发送邮件. CSDN. 2014-12-16 15:48:36. Thu Mar 11 2021 04:37:44 GMT+0000 (Coordinated Universal Time). https://blog.csdn.net/mouyu230/article/details/41961307

配置方法:

0. 需要登录网易邮箱帐号,添加客户端授权码(自行摸索)。授权码的官方解释:

授权密码管理:

授权码是用于登录第三方邮件客户端的专用密码。

适用于登录以下服务: 您开启的服务(例如POP3/IMAP/SMTP)、Exchange/CardDAV/CalDAV服务。

126网易免费邮

1. 安装mailx。在Debian 10会自动一起安装exim4(主要是“exim4-base”、“exim4-config”、“exim4-daemon-light”这三个包):

# apt install mailutils

如果没有一起安装exim4,则手动安装exim4的元包:

# apt install exim4

2. root身份下执行“dpkg-reconfigure exim4-config”命令。在出现的交互界面中会要求依次要求选择不同的选项,或者填写不同的内容:

  • “General type of mail configuration”选择“mail sent by smarthost; received via SMTP or fetchmail
  • 在“IP address or host name of the outgoing smarthost”询问填写框中填入126邮箱的SMTP Server:
smtp.126.com::465

填入以上内容,意味着将使用SMTPS协议发送邮件,这是加密协议,是在SSL上的SMTP,目前已经被认为过时了(能用就行)。也可以使用明文SMTP协议。SMTP协议默认使用25端口。但是像阿里云这样的云服务提供商会对TCP 25端口作出限制[5]阿里云. TCP 25端口解封申请. Web Page. Thu Mar 11 2021 05:34:22 GMT+0000 (Coordinated Universal Time). https://help.aliyun.com/document_detail/56130.html,导致发邮件时出现“Connection timeout”(Vultr也疑似限制,主要目的是为了减少垃圾邮件)。可以通过telnet smtp.126.com 25命令测试自己的云服务提供商是否限制了TCP 25端口的通信[6]一天不进步,就是退步!. 如何判断服务器之间的服务是否可用?ping 还是 telnet?. 博客园. posted on 2019-07-03 10:57. Thu Mar 11 2021 02:51:28 GMT+0000 (Coordinated … Continue reading[7]Tolsadus. How to get rid of “defer (-52): Retry time not yet reached” exim4 logs?. Server Fault. Thu Mar 11 2021 02:33:12 GMT+0000 (Coordinated Universal Time). … Continue reading。明文SMTP协议的填写方式如下:

smtp.126.com::25

其余选项可以保持默认,或者自行决择(后果自负)。

3. 如果选择使用SMTPS协议,则需要多出如下配置[11]dantalion. Configure exim4 smtp relay to use tls on connect (smtps). Blog. Thu Mar 11 2021 06:33:29 GMT+0000 (Coordinated Universal Time). … Continue reading

打开“/etc/exim4/exim4.conf.template”文件,找到如下位置:

remote_smtp_smarthost:
  debug_print = "T: remote_smtp_smarthost for $local_part@$domain"
  driver = smtp
  multi_domain

添加加粗的内容:

remote_smtp_smarthost:
  debug_print = "T: remote_smtp_smarthost for $local_part@$domain"
  driver = smtp
  hosts_require_tls=smtp.126.com
  protocol=smtps
  multi_domain

4. 打开“/etc/exim4/passwd.client”,插入一行:

*.126.com:emailuser@126.com:password

“emailuser”为自己邮箱地址的前半部分,即用户名;“password”为邮箱对应的密码。

5. 打开“/etc/email-addresses”文件,添加如下内容:

root: emailuser@126.com
root@debian: emailuser@126.com   # "debian"为hostname
root@localhost: emailuser@126.com

这表示当以“root”、“root@debian”或“root@localhost”身份发送邮件时,使用”emailname@126.com”作为邮箱账户,即Mail From=emailname@126.com。具体内容可以自行调整。如果这一步没有配置,或者配置有错,以root身份发送邮件时日志中可能会出现以下错误记录:

** emailname@126.com R=smarthost T=remote_smtp_smarthost H=smtp.126.com [220.181.15.112] X=TLS1.2:RSA_AES_256_GCM_SHA384:256 CV=yes DN="C=CN,ST=Zhejiang,L=Hangzhou,O=NetEase (Hangzhou) Network Co.\, Ltd,OU=IT Dept.,CN=*.126.com": SMTP error from remote mail server after pipelined MAIL FROM:<root@debian>: 553 Mail from must equal authorized user

另一种可能导致如上错误记录的情况是:”hostname”太长,比如”root@dsjfi7wejfLSJiodflsd4lIhHHlsd“。可编辑“/etc/hostname”文件将其改短,重启生效[12]正在加载丶. 临时和永久修改linux的hostname主机名. CSDN. 2017-08-24 18:59:05. Thu Mar 11 2021 08:47:05 GMT+0000 (Coordinated Universal Time). … Continue reading

除了以上错误,还有可能会出现“554 DT:SPM”错误,即被网易以垃圾邮件名义拒绝发送。更多详情见官网。[13]163网易免费邮. 企业退信的常见问题?. Web Page. Wed Mar 10 2021 14:33:47 GMT+0000 (Coordinated Universal Time). https://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html

6. 配置完以上内容后,执行如下命令重启exim4服务使配置生效:

# systemctl restart exim4

7. 测试是配置成功:尝试命令发送邮件给“haar@example.com”:

echo "这是内容部分" | mailx -s "邮件标题" haar@example.com

或者:

root@debian:~# mailx haar@example.com
Cc: 
Subject: 邮件标题
这是内容部分
“按回车键后Ctrl+D结束内容”

8. 以上测试没有直接输出结果,如果接收方没有收到邮件,可以打开“/var/log/exim4/mainlog”查看详细日志。

其它

自己写Python代码发邮件

如果试过所有配置方法都不能正常发送邮件,那就试试编程吧!自己写一个名为“mailx”的可执行文件放到“usr/bin/”或者“usr/local/bin”目录下,或许可行呢。Python3编程发送邮件的主要代码如下:

#!/usr/bin/python3
 
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email import encoders 
from email.utils import parseaddr 
from email.utils import formataddr 
 
def format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, "utf-8").encode(), addr))
 
def sendEmail(content,to_email,subject='test'):
    from_email = '源邮箱地址'
    from_email_pwd = '源邮箱密码'
    smtp_server = "smtp.126.com"
 
    msg = MIMEText(content, "plain", "utf-8")
    msg["From"] = format_addr("%s" %(from_email))
    msg["To"] = format_addr("%s" %(to_email))
    msg["Subject"] = Header(subject, "utf-8").encode()
 
    try:
        server = smtplib.SMTP_SSL(smtp_server)
        server.connect(smtp_server, 465)
        #server = smtplib.SMTP(smtp_server, 25)
        #server.starttls()
        server.set_debuglevel(1)
        server.login(from_email, from_email_pwd)
        server.sendmail(from_email, [to_email], msg.as_string())
        server.quit()
    except smtplib.SMTPException:
        print ("Error: 无法发送邮件")

利用运营商的邮箱发送免费提醒短信

从网上可以找到有些公司提供一种服务,用户可以这种服务发送短信或者打电话,但是往往收费或者有限免费。比如Twilio为新用户提供有限的免费短信发送额度和相应的API,长时间闲置账户后免费的额度又可能会消失,总之很让人不爽。下面讲述一种完全免费、间接发送短信的方法:

国内三大运营商会为每一个手机号附带一个邮箱,他们的邮箱服务往往带有免费的短信提醒功能,例如移动的139邮箱。我们可以通过本文描述的命令行发送邮件到自己手机运营商的邮箱中。发送成功后自己的手机就会收到邮件提醒短信,短信中往往会带有邮件标题和少量邮件内容。在需要对自己提供即时提醒服务的场景中,这种方法非常经济划算。

假想你正在守着一个无聊的、需要运行很长时间的程序,生怕中途运行出错不敢离开。那你就可以使用本文的方法写一个运行异常或运行结束提醒程序解放自己。

References

References
1 Debian Foundation. UnattendedUpgrades (last modified 2020-11-29 12:37:43). Debian Wiki. https://wiki.debian.org/UnattendedUpgrades
2 Eric. Debian & Ubuntu 自动检查安装更新. Web Page. Wed Mar 10 2021 13:50:56 GMT+0000 (Coordinated Universal Time). https://www.hostarr.com/automatic-updates-on-debian-and-ubuntu/
3 Debian 参考手册, 第 6 章 网络应用, 6.2. 邮件系统. Thu Mar 11 2021 05:54:20 GMT+0000 (Coordinated Universal Time). https://www.debian.org/doc/manuals/debian-reference/ch06.zh-cn.html#_the_mail_system
4 mouyu230. debian通过mailx发送邮件. CSDN. 2014-12-16 15:48:36. Thu Mar 11 2021 04:37:44 GMT+0000 (Coordinated Universal Time). https://blog.csdn.net/mouyu230/article/details/41961307
5 阿里云. TCP 25端口解封申请. Web Page. Thu Mar 11 2021 05:34:22 GMT+0000 (Coordinated Universal Time). https://help.aliyun.com/document_detail/56130.html
6 一天不进步,就是退步!. 如何判断服务器之间的服务是否可用?ping 还是 telnet?. 博客园. posted on 2019-07-03 10:57. Thu Mar 11 2021 02:51:28 GMT+0000 (Coordinated Universal Time). https://www.cnblogs.com/davidwang456/p/11125111.html
7 Tolsadus. How to get rid of “defer (-52): Retry time not yet reached” exim4 logs?. Server Fault. Thu Mar 11 2021 02:33:12 GMT+0000 (Coordinated Universal Time). https://serverfault.com/questions/821820/how-to-get-rid-of-defer-52-retry-time-not-yet-reached-exim4-logs
8 Debian Foundation. Exim4Gmail (last modified 2019-12-06 07:13:20). Debian Wiki. https://wiki.debian.org/Exim4Gmail
9 IGNORECHANGE. 「Linux」- 使用mail命令发送邮件. 更新日期:2019年07月10日. https://k4nz.com/05.Computer_Networks/Layer_7_-Application_Layer/Email_Protocols/x.Miscellanies(Email)/Using_%60mail%60_command_to_send_an_email.html
10 Eric. Exim4 配置外部 SMTP 服务器发邮件. Web Page. Wed Mar 10 2021 13:51:10 GMT+0000 (Coordinated Universal Time). https://www.hostarr.com/exim4-external-smtp/
11 dantalion. Configure exim4 smtp relay to use tls on connect (smtps). Blog. Thu Mar 11 2021 06:33:29 GMT+0000 (Coordinated Universal Time). https://dantalion.nl/en/configure-exim4-smtp-relay-to-use-tls-on-connect/#
12 正在加载丶. 临时和永久修改linux的hostname主机名. CSDN. 2017-08-24 18:59:05. Thu Mar 11 2021 08:47:05 GMT+0000 (Coordinated Universal Time). https://blog.csdn.net/qi49125/article/details/77539913
13 163网易免费邮. 企业退信的常见问题?. Web Page. Wed Mar 10 2021 14:33:47 GMT+0000 (Coordinated Universal Time). https://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html

Leave a comment

Your email address will not be published. Required fields are marked *