前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用curl命令通过smtp协议发送邮件

用curl命令通过smtp协议发送邮件

作者头像
用户2323866
修改2021-06-23 18:04:51
4.5K0
修改2021-06-23 18:04:51
举报
文章被收录于专栏:技术派

为啥我要用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有哪些邮件相关的的参数:

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

官网给了一个例子:

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

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

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

代码语言:javascript
复制
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发送邮件。

这种方法也有缺点:

  1. 邮箱密码写在脚本里,不够安全
  2. outlook和gmail邮箱,需要指定app专用密码,或者启用低安全性应用访问权限
  3. smtps需curl编译时有ssl,版本不能太低,如果不是古董系统,我相信你不会遇到问题

顺便说一下pop3收邮件:

代码语言:javascript
复制
curl --ssl-reqd   --url 'pop3://outlook.office365.com'   --user 'sender@nixops.me:password'

执行后会返回邮件编号和大小,继续请求指定编号就可以了,如下载第一个,在--url中指定编号:

代码语言:javascript
复制
curl --ssl-reqd   --url 'pop3://outlook.office365.com/1'   --user 'sender@nixops.me:password'

有问题可以用-vvvv看一下curl的调用过程排查,IMAP协议使用也类似,但要复杂一些,就不说了

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
命令行工具
腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档