资讯动态

curl 邮件协议实战手册:SMTP 发信、POP3/IMAP 收信从 0 到 1

发布时间:2026/8/31 7:55:39 来源:尧图企业网站定制
curl 邮件协议实战手册SMTP 发信、POP3/IMAP 收信从 0 到 1【免费下载链接】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 是一个支持 HTTP、FTP、SMTP、POP3、IMAP 等 20 多种协议的命令行工具和库本文带你用 curl 的邮件协议能力完成三个真实任务发出一封 SMTP 邮件、用 POP3 把邮件下载到本地、用 IMAP 在服务器上管理邮件最后补齐 TLS 加密、排错和 libcurl 编程要点。1. 先选路线三个协议各管什么在敲第一条命令前先记住这张表。你可以这样想SMTP 是寄件窗口POP3 是取件后清空柜台IMAP 是远程管理储物柜。协议作用普通端口加密端口URL 前缀SMTP发送邮件25465 / 587smtp:///smtps://POP3下载邮件到本地通常下载后服务器侧删除110995pop3:///pop3s://IMAP服务器端管理邮件列表、搜索、标记、取指定件143993imap:///imaps://选择建议很直接发信用 SMTP只做拉下来存档用 POP3要跨设备同步、搜索、改状态用 IMAP。三个协议都支持认证curl 统一用--user 账号:密码走 SASL 机制服务器支持时通常优先 PLAIN/LOGIN/CRAM-MD5 等curl 会自动协商你一般不用手动指定机制。2. 任务一curl SMTP 发邮件一行命令先确认能连上发邮件前先用最便宜的命令验证服务器通不通curl -v smtp://服务器地址:587预期输出你会看到一段 TLS 握手日志然后出现220开头的服务器欢迎语。如果卡在 TCP 层报Could not resolve host或Connection timed out那是网络问题不用继续往下调参数。发送第一封 TLS 加密邮件把邮件内容写进一个文件含完整头部和正文然后用--mail-from指定发件人、--mail-rcpt指定收件人、-T上传文件内容。这两个选项是 curl 专为 SMTP 设计的mail-from 文档 和 mail-rcpt 文档 各占一行没有更多玄机。curl smtp://服务器地址:587 \ --user 你的账号:你的密码 \ --ssl \ --mail-from 发件地址 \ --mail-rcpt 收件地址 \ -T email.txt \ -v参数逐个说--ssl表示明文连上后发 STARTTLS 升级加密587 端口常用如果服务器只开 465 隐式 TLS把 URL 改成smtps://服务器地址:465并去掉--ssl即可-v打开调试日志。跑成功后-v日志里会依次出现250发件人 OK和250收件人 OK最终221表示会话正常结束。⚠️ 最容易踩的坑--mail-rcpt可以重复多次以指定多个收件人邮件正文文件里头部与正文之间必须有一个空行分隔RFC 5322漏了空行会导致收件人看到的正文串成一片。3. 任务二curl POP3 下载邮件POP3 的思路是按编号取件。邮件在服务器上从 1 开始编号URL 里写/编号就是取那封。先看箱子里有多少封curl -I pop3s://服务器地址:995 --user 你的账号:你的密码-I对应只做查询不取数据协议层是 STAT 命令。预期输出类似OK 25 messages (32930 octets)看到这一行就说明认证通过了箱子里有 25 封邮件。下载单封或全部# 下载第 1 封到文件 curl pop3s://服务器地址:995/1 --user 你的账号:你的密码 -o msg1.eml # 下载全部URL 不带编号即 RETR 全部 curl pop3s://服务器地址:995 --user 你的账号:你的密码 -o inbox.mboxpop3s://前缀本身就走 995 隐式 TLS不用再写--ssl。要删除某封用--request发原始 POP3 命令curl pop3s://服务器地址:995/1 --user 你的账号:你的密码 --request DELE注意 DELE 只是打标QUIT 时才真正删除而且 curl 在curl_easy_cleanup命令行即进程退出时才发 QUIT所以执行完这条命令后第 1 封才会真正消失。4. 任务三curl IMAP 收邮件与服务器端管理IMAP 比 POP3 多一个目录概念imap://host不带路径 列出所有邮箱LIST带/INBOX 选中该邮箱SELECT。# 列出所有邮箱 curl imaps://服务器地址:993 --user 你的账号:你的密码 -s # 选中 INBOX 后搜索未读邮件 curl imaps://服务器地址:993/INBOX \ --user 你的账号:你的密码 \ --request SEARCH UNSEEN # 按 UID 取第 1 封 curl imaps://服务器地址:993/INBOX/;UID1 \ --user 你的账号:你的密码 -o msg1.eml--request也可写成-X会替换 curl 的默认动作为任意 IMAP 命令比如STATUS INBOX (MESSAGES)、STORE 1 FLAGS (\Seen)、FETCH 1 BODY[HEADER]。跑起来后你应该看到* SEARCH 3 7这样的搜索结果3 号和 7 号邮件未读或邮件的原始 EML 内容。URL 里;UID1表示按 UID 而非序号取第 1 封UID 在邮件删除后不会重排批量脚本里比序号稳。5. 连接链路一条 curl 请求是怎么走完的先记住这一个点所有协议都是连接 → 认证 → 加密 → 操作四步加密插在认证之前还是之后决定了安全等级。三种姿势对比方式写法说明明文smtp://host:25不加密仅限可信内网密码明文传输别用STARTTLSsmtp://host:587--ssl先明文后升级587/110/143 常用--ssl-reqd可强制必须升级否则失败隐式 TLSsmtps:///pop3s:///imaps://连接一开始就是加密的465/995/993推荐⚠️ 证书校验默认开启且应保持开启。只有自签证书的测试环境才考虑--insecure生产环境关验证等于裸奔。6. 排错错误码速查 调试开关卡住时先开-v看协议交互到哪一步断了再对照下表定位错误编号常见原因处理方向CURLE_COULDNT_CONNECT7DNS/端口不通、防火墙先curl -v测 TCP 连通性CURLE_OPERATION_TIMEDOUT28网络慢、服务器无响应加大--connect-timeout/--max-timeCURLE_SSL_CONNECT_ERROR58端口是隐式 TLS 却用了明文前缀或反之检查s前缀与端口是否匹配CURLE_LOGIN_DENIED67账号密码错、服务器禁用了该 SASL 机制换--user有些邮件服务商要求应用专用密码CURLE_REMOTE_ACCESS_DENIED52命令参数错如收件人格式、命令不被服务器接受看-v里服务器返回的5xx原文调试时-v会打印*开头的握手信息和/的收发报文比看错误码快得多。证书问题可配合--cacert 证书路径指向自签 CA。7. libcurl 编程把命令行搬进你的 C 程序命令行够用之后用 libcurl 写代码时核心就三件事CURLOPT_URL定协议和服务器、CURLOPT_USERNAME/PASSWORD定身份、CURLOPT_CUSTOMREQUEST发自定义命令。仓库里的 smtp-mail.c 示例 是发信的完整模板。C 语言发送一封 SMTP 邮件下面这段代码用回调函数逐块读取邮件正文注意每一处setopt都对应前面命令行里的一个参数#include stdio.h #include string.h #include curl/curl.h static const char *payload_text To: 收件地址\r\n From: 发件地址\r\n Subject: 来自 curl 的测试\r\n \r\n 正文内容。\r\n; struct upload_status { size_t bytes_read; }; /* curl 每次回调要多少数据就从这里喂多少 */ static size_t read_cb(char *ptr, size_t size, size_t nmemb, void *userp) { struct upload_status *ctx (struct upload_status *)userp; size_t room size * nmemb; const char *data payload_text[ctx-bytes_read]; size_t len strlen(data); if(room len) len room; memcpy(ptr, data, len); ctx-bytes_read len; return len; } int main(void) { CURL *curl curl_easy_init(); if(curl) { struct upload_status ctx { 0 }; curl_easy_setopt(curl, CURLOPT_URL, smtp://服务器地址:587); curl_easy_setopt(curl, CURLOPT_MAIL_FROM, 发件地址); /* MAIL FROM */ curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, curl_slist_append(NULL, 收件地址)); /* RCPT TO */ curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_cb); /* 正文来源 */ curl_easy_setopt(curl, CURLOPT_READDATA, ctx); curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); /* 开启上传 */ curl_easy_setopt(curl, CURLOPT_USE_SSL, (long)CURLUSESSL_TRY); /* STARTTLS */ curl_easy_setopt(curl, CURLOPT_USERNAME, 你的账号); curl_easy_setopt(curl, CURLOPT_PASSWORD, 你的密码); CURLcode res curl_easy_perform(curl); if(res ! CURLE_OK) fprintf(stderr, 发送失败: %s\n, curl_easy_strerror(res)); curl_easy_cleanup(curl); } return 0; }跑起来后终端没有输出即成功服务器回了 250失败会打印curl_easy_strerror的错误描述含义和前面命令行错误码一致。连接复用与批量操作这里有个省事的事实curl_easy_cleanup之前不会发 QUIT/LOGOUT所以同一个 handle 连续perform多次连接是复用的。发 10 封邮件时循环里只需重设CURLOPT_MAIL_FROM/CURLOPT_MAIL_RCPT再 perform不用反复建连和 TLS 握手。批量取邮件同理命令行里可以写 for 循环但更好的做法是复用连接。比如用 IMAP 批量取前 10 封把imap://host/INBOX/;UID1的 UID 换成1..10循环 perform 即可握手只发生一次/* 复用同一 handle 做 SEARCH */ curl_easy_setopt(curl, CURLOPT_URL, imaps://服务器地址/INBOX); curl_easy_setopt(curl, CURLOPT_USERNAME, 你的账号); curl_easy_setopt(curl, CURLOPT_PASSWORD, 你的密码); curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, SEARCH UNSEEN); /* 发 SEARCH 命令 */ res curl_easy_perform(curl); /* 再 perform 一次 SELECT 其他邮箱连接仍然复用 */⚠️ 连接复用有上限服务器一般几分钟就断开空闲会话日志里表现为突然的连接重置长驻进程里要捕获重连、重建 handle。下一步你可以试的 3 件事用你的真实邮箱服务商跑一遍第 2 节的 SMTP 命令故意把--ssl去掉看 587 端口的警告直观感受 STARTTLS 的作用写一个 for 循环用--request FETCH n BODY[HEADER.FIELDS (SUBJECT DATE)]批量导出收件箱最近 20 封邮件的主题和日期把第 7 节的 C 代码编译运行加上CURLOPT_VERBOSE, 1L对照命令行-v的输出确认你已经能读懂完整的连接 → 认证 → 操作交互日志【免费下载链接】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),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价