curl 邮件协议实战:SMTP、POP3、IMAP 几分钟完整上手

📅 2026/8/24 3:56:49
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/curl不用装邮件客户端。curl 邮件协议支持让你直接在命令行或 C 代码里发、收、管理邮件——你平时下载文件用的那个 curl换一行参数就是邮件工具。2 分钟跑通用 curl 命令行邮件发出第一封先写个带完整头部的消息文件message.txtTo: friendexample.com From: senderexample.com Subject: Hello from curl 这封邮件由 curl 发出。然后一条命令curl smtp://smtp.example.com:25 \ --mail-from senderexample.com \ --mail-rcpt friendexample.com \ --upload-file message.txt预期结果没有任何输出echo $?是 0就说明邮件已经在路上了。加-v能看到353握手和250 2.0.0 OK应答。✉️ 两分钟第一封邮件发出去了。一张表选对协议SMTP、POP3、IMAP协议默认端口安全端口用途一句话选型SMTP25587STARTTLS/ 465隐式只负责发只需发信 → SMTPPOP3110995拉下来、服务端可删一次性归档、老邮件箱清空 → POP3IMAP143993服务器端管理、多端同步要文件夹/已读状态跨设备同步 → IMAP拿不准时按这个走分场景实战场景 A用 curl SMTP 命令行发邮件目标从 587 端口走 STARTTLS带认证发一封正式邮件。命令curl smtp://smtp.example.com:587 --ssl \ --user senderexample.com:pass \ --mail-from senderexample.com \ --mail-rcpt friendexample.com \ --upload-file message.txt结果250 2.0.0 OK: queued之后退出码 0。message.txt必须自带 To/From/Subject 头部和空行因为 curl 原样上传不做任何包装。易踩坑正文行结尾必须是\r\nLinux 上写个纯\n的文件会被不少服务器拒收--mail-from建议与认证账号一致避免触发反垃圾的 553 拒信。在 C 代码里做同样的事核心就 10 行完整版本见 docs/examples/smtp-mail.cCURL *curl curl_easy_init(); if (curl) { struct curl_slist *rcpt curl_slist_append(NULL, friendexample.com); curl_easy_setopt(curl, CURLOPT_URL, smtp://smtp.example.com:587); curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_TRY); curl_easy_setopt(curl, CURLOPT_MAIL_FROM, senderexample.com); curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, rcpt); curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); FILE *fh fopen(message.txt, rb); curl_easy_setopt(curl, CURLOPT_READDATA, fh); curl_easy_setopt(curl, CURLOPT_USERNAME, senderexample.com); curl_easy_setopt(curl, CURLOPT_PASSWORD, getenv(SMTP_PASS)); CURLcode res curl_easy_perform(curl); if (res ! CURLE_OK) fprintf(stderr, %s\n, curl_easy_strerror(res)); curl_slist_free_all(rcpt); curl_easy_cleanup(curl); fclose(fh); }场景 B用 curl POP3 拉取整个邮箱目标把整个 POP3 邮箱一次性搬到本地归档。命令curl pop3s://pop.example.com:995 \ --user youexample.com:pass \ -o inbox.mbox结果所有邮件按编号依次 RETR拼接写入inbox.mbox。想先确认数量加-I触发 STAT会看到类似OK 42 messages 112772 octets的统计行只取第 1 封则把 URL 写成pop3s://pop.example.com/1。易踩坑POP3 是无状态的一次性买卖——RETR 之后很多服务器按配置自动 DELE拉完就没了没有文件夹、没有已读标志。这也是它和 IMAP 的本质差异IMAP 把邮箱留在服务器上随时可查POP3 是把邮件从服务器上取走。批量归档前先在测试账号上验证服务器行为。场景 C用 curl IMAP 管理多端同步邮箱目标不写代码用-X直接发原始 IMAP 命令lib/imap.c 里 custom request 原样透传完成 LIST / SEARCH / FETCH 三件事。命令# 1. 列出所有邮箱 curl imaps://imap.example.com:993 \ --user youexample.com:pass -X LIST * # 2. 在 INBOX 里搜索未读邮件 curl imaps://imap.example.com:993/INBOX \ --user youexample.com:pass -X SEARCH UNSEEN # 3. 抓取第 3 封邮件的头部 curl imaps://imap.example.com:993/INBOX \ --user youexample.com:pass -X FETCH 3 (BODY[HEADER])结果LIST 返回每行一个邮箱名及标志位\HasNoChildren之类SEARCH 返回未读邮件的序列号列表如* SEARCH 3 7 12FETCH 直接吐出 RFC822 头部。易踩坑curl 每次执行都是一个独立会话前一条命令 SELECT 的邮箱不会带到下一条——所以把邮箱写进 URL/INBOX让 curl 每次自动 SELECTFETCH 的参数含括号和方括号务必整体加引号否则 shell 先把它吃掉。排坑手册6 个最常见的报错现象报错/退出码原因一句话解决535 Authentication failed密码错或服务器要求应用专用密码换应用专用密码别用主密码退出码 6CURLE_COULDNT_RESOLVE_HOST主机名写错或 DNS 不通先用ping确认主机名解析正常退出码 7连 25 端口超时运营商普遍封禁 25 端口改用 587 --ssl或 465 隐式 TLS553 5.7.1MAIL FROM 被拒--mail-from与认证账号不符--mail-from填认证账号本身退出码 60CURLE_SSL_CERTPROBLEM缺失 CA 或服务器用自签证书--cacert /path/ca.pem指定 CA 包POP3 下载出空文件、IMAP 无数据邮箱为空或 IMAP URL 没带/INBOX先-I看 STAT 数量IMAP 把邮箱写进 URL安全加固TLS 三种连接方式怎么选连接方式URL 写法curl 参数说明明文smtp://host:25无账号密码裸奔仅限可信内网STARTTLSsmtp://host:587--ssl先明文握手再升级为 TLS现代主流隐式 TLSsmtps://host:465、pop3s://、imaps://由 scheme 决定第一个字节起就是 TLS最稳加固 ✅ 清单✅ 加--ssl-reqdTLS 协商失败就报错退出而不是静默降级明文✅ 保持证书校验默认开启CA 不完整时用--cacert指定而不是关校验✅--connect-timeout 10 --max-time 3010 秒连不上、30 秒总超时防止脚本挂死✅ 密码走环境变量--user youexample.com:$MAIL_PASS别硬编码进脚本✅-k跳过证书校验只在排障时用用完即删收尾curl 邮件协议本质就是终端里说 RFC 5321、1939、3501 的瑞士军刀。上面三条命令跑通日常收发和运维场景就覆盖了九成。想继续深挖翻一遍 docs/examples/ 里imap-*.c、pop3-*.c、smtp-*.c的官方示例源码docs/cmdline-opts/mail-from.md 等选项文档也值得一读。⚡ 进阶技巧连接复用libcurl 下curl_easy_perform()返回后先别cleanup改完MAIL_FROM/MAIL_RCPT再次 perform 即可复用同一条连接QUIT只在 cleanup 时发出见 docs/examples/smtp-mail.c 尾部注释——连续发 100 封比每次重连快一个量级。并发批量拉 IMAP 时for i in $(seq 1 50); do curl imaps://imap.example.com/INBOX -X FETCH $i (RFC822) -o msg_$i.eml done; wait或用xargs -P 8开 8 路并发几十秒拉完全箱。【免费下载链接】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),仅供参考