尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

curl 邮件协议实战指南:SMTP 发信、POP3 收信、IMAP 管箱,一次讲透

curl 邮件协议实战指南:SMTP 发信、POP3 收信、IMAP 管箱,一次讲透 curl 邮件协议实战指南SMTP 发信、POP3 收信、IMAP 管箱一次讲透【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curlcurl 不只是下载文件的工具。它原生支持 SMTP、POP3、IMAP 三类邮件协议一条命令行就能发信、查箱、取信、标记已读。这篇 curl 邮件协议实战指南不讲教科书只讲你真正会用到的命令和翻车现场。快速上手两条命令先看到结果先别关心原理跑通这两条再往下读。假设你的邮箱账号是userexample.com密码在环境变量MAILPW里别把密码写在 shell history 里# 看一眼 POP3 邮箱里有多少封邮件、总共多大 curl -s --user userexample.com:$MAILPW \ --request STATUS pop3s://pop.example.com:995 # 给同事发一封测试邮件明文 25 端口仅内网测试环境用 curl -s --user userexample.com:$MAILPW \ --mail-from userexample.com --mail-rcpt bossexample.com \ -T test.eml smtp://smtp.example.com:25第一条返回类似OK 3 messages (1234 octets)说明邮箱里躺了 3 封、共 1234 字节。第二条执行完没报错收信人就该收到邮件了。能跑通说明你的 curl 编译时带上了对应协议发行版默认都带。跑不通也没关系后文 FAQ 按现象对症。场景 A把一封邮件发出去何时用监控脚本告警、CI 流水线通知、定时任务提醒——凡是你不想装邮件客户端、只想「把正文甩给服务器」的场景。一行命令发出第一封邮件SMTP 是三个协议里 curl 支持最完整的--mail-from、--mail-rcpt都是专用选项不用拼原始命令curl --user userexample.com:$MAILPW \ --mail-from userexample.com \ --mail-rcpt bossexample.com \ --mail-rcpt hrexample.com \ --mail-rcpt-allowfails \ -T email.eml smtp://smtp.example.com:25几个值得注意的点都是踩过的坑正文文件自己带全头部。email.eml里必须包含To:、Subject:、空行、正文——curl 只负责传输不负责拼信。最小可运行的文件长这样To: bossexample.com From: userexample.com Subject: 部署完成 构建 #1234 已通过服务已重启。多人收件用重复的--mail-rcpt不是逗号拼接。默认任何一个收件人被拒整封就中止加--mail-rcpt-allowfails可以跳过坏地址继续发。端口选 25 还是 58725 端口是传统提交端口现在大多公网封了587 是专用提交端口配合--ssl-reqd走 STARTTLS。发信时把 TLS 锁死明文 SMTP 的密码是裸奔的。给提交端口加上 TLS 要求curl --user userexample.com:$MAILPW --ssl-reqd \ --mail-from userexample.com --mail-rcpt bossexample.com \ -T email.eml smtps://smtp.example.com:465这条命令背后发生了什么curl 连上 25 端口后依次发出EHLO要能力列表、AUTH认证、MAIL FROM、RCPT TO、DATA然后才是你-T指定的正文最后QUIT。--ssl-reqd或smtps://让 curl 在 EHLO 之前/之中先完成 TLS 升级升级不成功直接断连不会退化成明文传密码。如果你在 C 代码里做同样的事对应的选项是CURLOPT_MAIL_FROM、CURLOPT_MAIL_RCPT传 slist、CURLOPT_UPLOAD完整用法见 docs/libcurl/ 和 examples/smtp-mail.c 这个官方示例。场景 B把邮件取回来读何时用定时脚本拉新邮件、解析附件做入库、测试环境验证「收信人到底收到了什么」。POP3 和 IMAP 都能收区别一句话POP3 是「搬回家」默认留在服务器可用-X DELE n删IMAP 是「去服务器上读」状态多设备同步。先拿 POP3 感受基本操作。用 curl 检查 POP3 邮箱状态并取回第 1 封邮件# 看邮箱里有几封邮件 curl -s --user userexample.com:$MAILPW \ --request STATUS pop3s://pop.example.com:995 # 取回第 1 封整封落盘成 .eml curl -s --user userexample.com:$MAILPW \ pop3s://pop.example.com:995/1 -o msg1.eml # 只取第 2 封的前 20 行先看个大概别整封拉下来 curl -s --user userexample.com:$MAILPW \ --request TOP 2 20 pop3s://pop.example.com:995URL 里的/1就是邮件序号不带序号 NOBODY语义的行为因版本而异所以查状态、查清单时建议像上面这样用--request显式指定命令最不容易踩版本差异。用 curl IMAP 收取邮件按 UID 取信更稳IMAP 的 URL 长这样imaps://host/邮箱名邮箱名用 IMAP 的层级语法特殊字符要 URL 编码比如带;或空格。取信时别用序号用 UID——序号会随删信漂移UID 不会# 搜出所有未读邮件的 UID 列表 curl -s --user userexample.com:$MAILPW \ --request SEARCH UNSEEN imaps://imap.example.com:993/INBOX # 按 UID 取第 108 封的完整内容 curl -s --user userexample.com:$MAILPW \ --request UID FETCH 108 (BODY.PEEK[]) \ imaps://imap.example.com:993/INBOX -o msg.emlBODY.PEEK[]里的 PEEK 很关键它让服务器「只读不标记」普通BODY[]会把邮件标成已读批量拉取时千万别用错。这条命令背后发生了什么IMAP 会话是选「选箱 → 发命令」两步走curl 先对/INBOX发SELECT然后你的--request命令才在该箱上下文中执行成功后 curl 自动LOGOUT。这也是为什么同一个--request SEARCH ...对 POP3 和 IMAP 能写同一个名字但 URL 必须带上对应的路径。场景 C管理邮箱——列目录、搜未读、批量标记何时用运维脚本巡检邮箱配额、清理归档、把一周的邮件批量打标。这些动作 POP3 做不了是 IMAP 的主场。列出所有邮箱目录curl -s --user userexample.com:$MAILPW \ --request LIST * imaps://imap.example.com:993输出形如(Lsub) / INBOX、(HasNoChildren) / Archive/2024。注意是引用根目录的 IMAP 语法shell 里要把它保护成双引号传进去否则会被吃成空参数。搜未读、看摘要、批量标记已读# 搜出某文件夹里未读邮件的 UID curl -s --user userexample.com:$MAILPW \ --request SEARCH UNSEEN imaps://imap.example.com:993/INBOX # 看前 5 封的邮件头摘要比整封取回来省带宽 curl -s --user userexample.com:$MAILPW \ --request FETCH 1:5 (FLAGS INTERNALDATE RFC822.SIZE) \ imaps://imap.example.com:993/INBOX # 把 100-200 号 UID 批量标为已读 curl -s --user userexample.com:$MAILPW \ --request UID STORE 100:200 FLAGS (\\Seen) \ imaps://imap.example.com:993/INBOXFETCH的RFC822.SIZE让你不下载正文就知道每封多大配合脚本判断「超过 10MB 的转附件处理」这类逻辑很实用。STORE FLAGS是追加标志位-FLAGS是移除FLAGS是整组覆盖别搞混方向。这条命令背后发生了什么这些管理命令全是 IMAP 标准动词LIST、SEARCH、FETCH、STOREcurl 通过-X原样透传给服务器所以curl 版本不影响你能用哪些命令服务器支持什么你才能用什么。官方示例目录里有一整组 IMAP 示例可以参考imap-list.c、imap-search.c、imap-store.c、imap-copy.c、imap-delete.c。选型速查30 秒选定你要用的协议别背 RFC看这张表就够了维度SMTPPOP3IMAP典型用途把邮件「推」给服务器把邮件「拉」到本地脚本里在服务器上直接操作邮件默认端口 / TLS 端口25 / 587(STARTTLS) / 465(隐式TLS)110 / 995143 / 993邮件是否留在服务器——只发不收留可DELE删留状态跨设备同步能搜索/标记/管理吗能验证地址VRFY仅此而已不能只能按序号 RETR/DELE全部可以什么情况选它告警、通知类发信一次性收全、归档到本地需要多条件检索、批量打标、多端一致判断顺序只发 → SMTP收了就完、不关心服务器状态 → POP3 最省事要「搜、标、移、同步」→ IMAP。踩坑 FAQ现象 → 原因 → 一句话解法现象 1curl: (7) Failed to connect原因端口被防火墙挡了25 端口公网最常见或你连的其实是 587。 解法换端口或先用nc -vz host 端口确认端口通不通。现象 2curl: (67) Login denied原因密码错、服务器要求应用专用密码Google/Microsoft 这类都强制或域名写错。 解法确认用的是当前生效的应用专用密码--user里的域名和账号注册域名完全一致。现象 3TLS 握手失败curl: (35)原因服务器证书链不完整、客户端缺根证书或端口用错了拿 995 端口当 STARTTLS 用。 解法隐式 TLS 用pop3s:///imaps:///smtps://或 995/993/465 端口显式 STARTTLS 用--ssl-reqd缺证书时给--cacert /path/to/ca.pem指定 CA 文件。现象 4连上了但命令被拒、卡住不动原因-X里敲的是 POP3/IMAP 不支持的命令或服务器对长连接有空闲超时。 解法只用LIST/SEARCH/FETCH/STORE/RETR/TOP/STATUS这些标准动词长任务给--connect-timeout 10兜底别让脚本无限等。现象 5发信报curl: (56)或收件人说没收到原因.eml里缺头部或正文为空curl 照常发出去但邮件被拒/被扔进垃圾箱。 解法先用curl -v看 DATA 之后实际传了什么本地用邮件客户端先发一封确认格式。现象 6同一脚本跑几遍后面开始报认证或会话错误原因IMAP/POP3 会话状态残留或服务器限制了并发会话数。 解法curl 每次运行都是全新会话问题通常在脚本层——删掉对~/.netrc之外缓存的依赖串行跑或给服务器留会话冷却时间。生产环境速查清单TLS 选型能用隐式 TLS995/993/465、*s://scheme就用走明文端口时必须加--ssl-reqd升级失败就断绝不退回明文传密码证书校验默认就开着别关内网自签 CA 用--cacert指定而不是--insecure密码不进命令行历史用~/.netrc或环境变量展开脚本里curl --netrc代替硬编码超时--connect-timeout 10控制握手整体再给个--max-time 60别让邮件服务器抽风拖垮你的流水线连接复用curl 命令行是单连接工具「复用」发生在你的脚本层——把多次-X操作合并进同一次调用-K配置文件支持多条 URL 依次跑减少重复认证握手幂等批量STORE、DELE类操作前先STATUS一次确认目标集合脚本可重跑不出乱收尾 延伸阅读三个协议、一张选型表、一套-X透传玩法邮件场景里 curl 够用的部分基本就是这些。剩下的细节——搜索条件全集、SASL 认证方式、C 库里的选项对应关系——别靠这篇记靠下面的仓库内文档查docs/cmdline-opts/mail-from.md、docs/cmdline-opts/mail-rcpt.mdSMTP 专用选项说明docs/libcurl/C 库 API 文档目录CURLOPT_MAIL_FROM等都在里面docs/examples/smtp-mail.c、pop3-retr.c、imap-search.c等官方最小示例照抄改参数即可docs/cmdline-opts/ssl-reqd.md--ssl-reqd在各协议下的行为差异【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表