用curl命令通过smtp协议发送邮件
为啥我要用curl来发邮件呢?主要是服务器不是邮件服务器,也没有装sendmail、postfix这类邮件服务,有时写一些脚本会用邮件提醒,这时候用curl就非常方便了。
要说Linux下有什么神级的命令,curl一定是其中之一。curl几乎支持你能想到的所有web相关的协议,来看看 curl官网支持的协议:
Supports...
DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, Telnet and TFTP. curl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, HTTP/2, HTTP/3, cookies, user+password authentication (Basic, Plain, Digest, CRAM-MD5, NTLM, Negotiate and Kerberos), file transfer resume, proxy tunneling and more.
支持邮件相关的协议:IMAP、IMAPS、POP3、POP3S、SMTP、SMTPS,所以用curl来发送邮件是可以的,先看一下help有哪些邮件相关的的参数:
curl --help
--ssl Try SSL/TLS (FTP, IMAP, POP3, SMTP)
--ssl-reqd Require SSL/TLS (FTP, IMAP, POP3, SMTP)
--mail-from FROM Mail from this address
--mail-rcpt TO Mail to this receiver(s)
--mail-auth AUTH Originator address of the original email
官网给了一个例子:
curl smtp://mail.example.com --mail-from myself@example.com --mail-rcpt
receiver@example.com --upload-file email.txt
根据 RFC 5322规范,发送邮件需要指定发件人、收件人、主题和内容等信息,官网的例子将这些信息写到email.txt,用--upload-file参数(实际上是PUT请求)发送,email.txt内容:
From: John Smith <john@example.com>
To: Joe Smith <smith@example.com>
Subject: an example.com example email
Date: Mon, 7 Nov 2016 08:45:16
Dear Joe,
Welcome to this example email. What a lovely day.
curl也支持smtps,使用smtps调用gmail的例子:
curl --ssl-reqd \
--url 'smtps://smtp.gmail.com:465' \
--user 'username@gmail.com:password' \
--mail-from 'username@gmail.com' \
--mail-rcpt 'will@nixops.me' \
--upload-file mail.txt
这种方法基本满足需要,但是需要新建一个mail.txt,在脚本中调用最好一行命令能实现,不额外新建文件。这时使用输入重定向,下面以outlook邮箱为例:
curl --ssl-reqd --url 'smtp://smtp.office365.com:587' --user 'sender@nixops.me:password' --mail-from 'sender@nixops.me' --mail-rcpt 'will@nixops.me' -T <(echo -e 'From: sender@nixops.me\nTo: will@nixops.me\nSubject: 备份成功\n\n nixops.me已全部备份完成,请检查');
-T和--upload-file是一样的。通过这种方法,就可以一条命令实现通过smtp发送邮件。
这种方法也有缺点:
- 邮箱密码写在脚本里,不够安全
- outlook和gmail邮箱,需要指定app专用密码,或者启用低安全性应用访问权限
- smtps需curl编译时有ssl,版本不能太低,如果不是古董系统,我相信你不会遇到问题
顺便说一下pop3收邮件:
curl --ssl-reqd --url 'pop3://outlook.office365.com' --user 'sender@nixops.me:password'
执行后会返回邮件编号和大小,继续请求指定编号就可以了,如下载第一个,在--url中指定编号:
curl --ssl-reqd --url 'pop3://outlook.office365.com/1' --user 'sender@nixops.me:password'
有问题可以用-vvvv看一下curl的调用过程排查,IMAP协议使用也类似,但要复杂一些,就不说了