curl 邮件协议实战:3 条指令跑通 SMTP 发信到 IMAP 归档 📅 发布时间:2026/8/31 7:53:15 👁 浏览次数: curl 邮件协议实战3 条指令跑通 SMTP 发信到 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/curl用 curl 操作邮件协议其实只绕开三个参数--mail-from、--mail-rcpt、协议前缀。读完这篇你能独立跑通「SMTP 发一封信 → POP3 拉回整个收件箱 → IMAP 筛选标记做轻量归档」的完整链路连不上服务器时也知道先查哪里。 命令行一条指令把信发出去SMTP发信的关键是三件套URL 指向 SMTP 服务器、--mail-from指定发件人、--mail-rcpt指定收件人正文用-T从文件上传。参数含义见 --mail-from 和 --mail-rcpt。下面这条指令解决「把本地邮件文件发给一个收件人」的问题curl smtp://smtp.example.com \ --mail-from meexample.com \ --mail-rcpt youexample.com \ --user 账号:密码 \ --upload-file email.txt收件人可以写多个--mail-rcpt想抄送就再追加一个。这里要注意邮件文件本身要带完整头From:、To:、Subject:和一个空行分隔正文curl 不会替你生成。如果项目里要嵌在 C 代码里核心调用不到 15 行完整版可以看 docs/examples/smtp-mail.cCURL *curl curl_easy_init(); curl_easy_setopt(curl, CURLOPT_URL, smtp://smtp.example.com); curl_easy_setopt(curl, CURLOPT_MAIL_FROM, meexample.com); curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); struct curl_slist *rcpt curl_slist_append(NULL, youexample.com); curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, rcpt); curl_easy_setopt(curl, CURLOPT_USERNAME, 账号); curl_easy_setopt(curl, CURLOPT_PASSWORD, 密码); CURLcode res curl_easy_perform(curl);库里对应的选项是CURLOPT_MAIL_FROM/CURLOPT_MAIL_RCPT文档在 CURLOPT_MAIL_RCPT。信发出去之后下一步是看看收件箱里有什么。 把收件箱整体搬回本地POP3POP3 的设计就是「下载即搬走」按序号取信、取完标记删除、QUIT 时真正删掉。curl 里 URL 写到服务器是操作整个邮箱带/N就是取第 N 封。把整个收件箱拉到本地 mbox 文件一条指令curl pop3s://pop.example.com --user 账号:密码 -o inbox.mbox只想看邮箱里有几封信、多大不拉内容就加-I发个 HEAD 请求curl pop3s://pop.example.com --user 账号:密码 -I返回头里会带X-BIMAP-STAT: 邮件数 总字节数顺手就能拿到统计。单封邮件想存成 .emlcurl pop3s://pop.example.com/7 --user 账号:密码 -o mail7.eml这里要注意 POP3 取信是破坏性的-o拿到的第 7 封在下次 QUIT 后从服务器上消失。要保留原件的场合请走下一节的 IMAP。 IMAP 不删信筛选和标记怎么弄IMAP 把邮箱留在服务器你只发命令LIST列目录、SEARCH筛选、STORE打标、UIDxx精确定位。curl 通过-X透传原始 IMAP 命令等于自带一个终端。列出服务器上所有邮箱curl imaps://imap.example.com --user 账号:密码 -X LIST *按 UID 抓某一封注意;UID要放在 URL 路径里并整体加引号curl imaps://imap.example.com/INBOX;UID42 --user 账号:密码 -o mail42.eml轻量归档的典型套路是「先搜再标」搜未读把命中结果打上归档标记不删也不移动# 第一步找出未读邮件的 UID curl imaps://imap.example.com/INBOX --user 账号:密码 -X SEARCH UNSEEN # 第二步把 42 这封标记为归档不删除 curl imaps://imap.example.com/INBOX --user 账号:密码 -X STORE 42 FLAGS (\Archive)对应 C 库写法在 docs/examples/imap-search.c 和 docs/examples/imap-store.c逻辑和上面的命令一一对应。发、收、筛都通了最后把这些命令能稳定跑起来的连接层一次性配齐。端口、加密、认证字段一次配齐邮件协议最常见的返工就是端口和加密方式配错。规则很简单s结尾的 schemesmtps/pop3s/imaps是隐式 TLS连上去就加密不带s的是明文起步要加密就补--sslSTARTTLS或--ssl-reqd强制不升级就断开详见 --ssl-reqd。协议明文端口隐式 TLS 端口推荐 scheme认证字段SMTP25 / 587465smtp://--ssl-reqd或smtps://--user 账号:密码POP3110995pop3s://--user 账号:密码IMAP143993imaps://--user 账号:密码认证字段统一都是--user库调用里是CURLOPT_USERNAME/CURLOPT_PASSWORDcurl 会按服务器通告的顺序尝试 AUTH 机制PLAIN、LOGIN 等你不用手动挑。证书验证默认开着内网自签证书才需要--cacert /path/to/ca.pem指一下不建议直接--insecure绕过。连不上、登不上时先查这几处排错顺序从外向内先确认端口通不通再看 TLS 握手最后查账号。下面这张表覆盖 90% 的报错场景。症状大概率原因怎么验证Could not connect端口错了25 常被防火墙拦nc -vz smtp.example.com 465先测连通连上立刻SSL connect error明文端口上强行用了--ssl-reqd但服务器不支持 STARTTLS换smtps://或去掉--ssl-reqdLogin denied(CURLE_LOGIN_DENIED)密码错误或服务商要求「客户端专用密码」而非登录密码换专用密码重试多数服务商在账户页可生成Authentication mechanism unsupportedcurl 编译时没带 SASL/CYRUS-SASL 库curl -V看 Supported protocols 附近有没有 SASL 相关字样发信被拒550 5.7.1发件地址和登录账号不一致服务器认为你在伪造--mail-from改成与--user相同的地址IMAP 命令没反应-X里的引号被 shell 吃掉用单引号包住-X LIST *还看不出问题时加-v看完整请求响应流水加--trace-ascii file.log落盘一份慢慢翻比猜快得多。速查对照表场景端口加密方式认证字段一条最短命令SMTP 发信465隐式 TLS--usercurl smtps://smtp.example.com --mail-from ax --mail-rcpt by --user u:p -T mail.txtSMTP STARTTLS587显式 TLS--usercurl smtp://smtp.example.com --ssl-reqd --mail-from ax --mail-rcpt by --user u:p -T mail.txtPOP3 拉全箱995隐式 TLS--usercurl pop3s://pop.example.com --user u:p -o inbox.mboxPOP3 取单封995隐式 TLS--usercurl pop3s://pop.example.com/7 --user u:p -o 7.emlIMAP 搜未读993隐式 TLS--usercurl imaps://imap.example.com/INBOX --user u:p -X SEARCH UNSEENIMAP 标记归档993隐式 TLS--usercurl imaps://imap.example.com/INBOX --user u:p -X STORE 42 FLAGS (\Archive)【免费下载链接】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),仅供参考