欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > curl 如何发送一个邮件 ?

curl 如何发送一个邮件 ?

2025/6/8 21:20:07 来源:https://blog.csdn.net/belldeep/article/details/148498995  浏览:    关键词:curl 如何发送一个邮件 ?

使用 curl 发送邮件通常需要借助支持 SMTP 协议的邮件服务器,并且需要构造符合 SMTP 格式的请求。以下是详细步骤和示例:

一、准备工作

  1. 确认邮件服务器的 SMTP 信息

    • 服务器地址(如:smtp.qq.comsmtp.gmail.com)。
    • 端口号(常见:587(TLS)、465(SSL)、25(非加密))。
    • 身份验证信息:邮箱账号和授权码(部分邮箱需使用授权码而非密码,如 Gmail、QQ 邮箱等)。
  2. 构造邮件内容
    邮件需包含 SMTP 命令MIME 格式的内容,例如:

    HELO example.com          # 标识客户端身份(可自定义为任意域名)
    AUTH LOGIN                # 声明使用登录认证
    [Base64编码的邮箱账号]     # 需手动将邮箱账号进行 Base64 编码
    [Base64编码的授权码/密码]   # 需手动将授权码/密码进行 Base64 编码
    MAIL FROM:<sender@example.com>  # 发件人地址
    RCPT TO:<recipient@example.com>  # 收件人地址
    DATA                        # 开始传输邮件内容
    Subject: Test Email         # 邮件主题
    From: Sender Name <sender@example.com>  # 发件人显示名称
    To: Recipient Name <recipient@example.com>  # 收件人显示名称Hello, this is a test email sent via curl!  # 邮件正文
    .                           # 以单独的句点(.)结束内容
    QUIT                        # 退出连接
    

二、使用 curl 发送邮件的示例

以下示例以 QQ 邮箱 为例(需先在 QQ 邮箱设置中开启 SMTP 服务并生成授权码)。

示例 1:发送纯文本邮件
curl --url "smtp://smtp.qq.com:587" \--user "sender@qq.com:授权码" \--mail-from "sender@qq.com" \--mail-rcpt "recipient@example.com" \--upload-file - <<EOF
Subject: 测试邮件
From: 发件人姓名 <sender@qq.com>
To: 收件人姓名 <recipient@example.com>这是通过 curl 发送的纯文本邮件。
EOF
  • 参数说明
    • --url:指定 SMTP 服务器地址和端口(smtp:// 协议)。
    • --user:格式为 邮箱账号:授权码(若使用密码需确保服务器支持明文传输)。
    • --mail-from:发件人邮箱地址。
    • --mail-rcpt:收件人邮箱地址(可多次指定多个收件人)。
    • --upload-file -:从标准输入读取邮件内容(EOF 内为邮件正文)。
示例 2:发送带附件的邮件(MIME 格式)
curl --url "smtp://smtp.qq.com:587" \--user "sender@qq.com:授权码" \--mail-from "sender@qq.com" \--mail-rcpt "recipient@example.com" \--upload-file - <<EOF
Subject: 带附件的邮件
From: 发件人姓名 <sender@qq.com>
To: 收件人姓名 <recipient@example.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="boundary-example"--boundary-example
Content-Type: text/plain; charset=utf-8这是邮件正文,包含附件。--boundary-example
Content-Type: application/pdf; name="report.pdf"
Content-Disposition: attachment; filename="report.pdf"
Content-Transfer-Encoding: base64[Base64编码的附件内容]  # 需手动将附件文件转为 Base64 编码
--boundary-example--
EOF
  • 关键点
    • 使用 multipart/mixed 类型分隔正文和附件,boundary 为自定义分隔符。
    • 附件需指定类型(如 application/pdf)、编码(base64)和文件名。
    • 附件内容需通过 base64 命令提前编码:
      base64 report.pdf > report.base64  # 生成 Base64 编码文件
      

三、常见问题与注意事项

  1. 授权码替代密码

    • 主流邮箱(如 Gmail、QQ 邮箱、163 邮箱)需使用 授权码 而非登录密码,需在邮箱设置中单独生成。
  2. 加密连接(TLS/SSL)

    • 若服务器支持 TLS/SSL,可将协议改为 smtps://(默认端口 465)或使用 --ssl 参数:
      curl --url "smtps://smtp.gmail.com:465" ...  # Gmail 的 SSL 端口
      
  3. Base64 编码问题

    • 手动编码时需确保无换行符,可使用以下命令生成单行编码:
      echo -n "邮箱账号" | base64  # Linux/macOS
      [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("邮箱账号"))  # PowerShell
      
  4. 错误排查

    • 若发送失败,可添加 --verbose 参数查看详细通信日志,检查 SMTP 命令是否正确。
    • 确保服务器允许第三方应用登录(部分邮箱需在设置中开启“允许 less secure apps”)。

四、替代方案:使用专用工具(推荐)

虽然 curl 可实现邮件发送,但更推荐使用专业工具(如 swaksmutt)或编程语言(Python 的 smtplib 库),代码更易读且支持复杂场景。例如:

# Python 发送邮件示例
import smtplib
from email.mime.text import MIMETextmsg = MIMEText("邮件正文", "plain", "utf-8")
msg["Subject"] = "测试邮件"
msg["From"] = "sender@example.com"
msg["To"] = "recipient@example.com"with smtplib.SMTP("smtp.example.com", 587) as server:server.starttls()server.login("邮箱账号", "授权码")server.send_message(msg)

通过以上步骤,可使用 curl 完成简单邮件发送,但需注意邮箱服务器的安全策略和格式要求。对于复杂需求,建议选择更专业的工具或编程方式。你可以借助 curl 命令搭配 SMTP 协议来发送邮件。下面为你介绍具体的操作步骤和示例:

基本命令格式

curl -s --url 'smtps://smtp.example.com:465' \--ssl-reqd \--mail-from 'sender@example.com' \--mail-rcpt 'recipient@example.com' \--user 'sender@example.com:password' \-T <(echo -e "From: sender@example.com\nTo: recipient@example.com\nSubject: Test Email\n\nThis is the body of the email.")

参数解析

  • --url 'smtps://smtp.example.com:465':用于指定 SMTP 服务器的地址以及端口。
  • --ssl-reqd:表明需要使用 SSL/TLS 进行加密连接。
  • --mail-from 'sender@example.com':设置发件人的邮箱地址。
  • --mail-rcpt 'recipient@example.com':指定收件人的邮箱地址。
  • --user 'sender@example.com:password':用于 SMTP 认证的用户名和密码。
  • -T:后面跟着邮件内容,可以是文件路径,也可以是像示例中那样的命令替换。

发送 HTML 格式邮件

curl -s --url 'smtps://smtp.example.com:465' \--ssl-reqd \--mail-from 'sender@example.com' \--mail-rcpt 'recipient@example.com' \--user 'sender@example.com:password' \-T <(echo -e "From: sender@example.com\nTo: recipient@example.com\nSubject: HTML Email\nContent-Type: text/html\n\n<html><body><h1>Hello</h1><p>This is an HTML email.</p></body></html>")

携带附件发送邮件

curl -s --url 'smtps://smtp.example.com:465' \--ssl-reqd \--mail-from 'sender@example.com' \--mail-rcpt 'recipient@example.com' \--user 'sender@example.com:password' \-F '='="From: sender@example.com\nTo: recipient@example.com\nSubject: Email with Attachment\n\nThis email contains an attachment." \-F '=myfile.txt'=@/path/to/file.txt

使用 Gmail 发送邮件的示例

curl -s --url 'smtps://smtp.gmail.com:465' \--ssl-reqd \--mail-from 'your_email@gmail.com' \--mail-rcpt 'recipient@example.com' \--user 'your_email@gmail.com:your_app_password' \-T <(echo -e "From: Your Name <your_email@gmail.com>\nTo: Recipient <recipient@example.com>\nSubject: Test from Gmail\n\nHello, this is a test email sent via Gmail SMTP.")

注意要点

  1. 要开启 SMTP 访问权限,不同的邮箱服务提供商开启方式不同。以 Gmail 为例,需要生成应用专用密码。
  2. 要留意 SMTP 服务器的地址和端口,比如 Gmail 使用的是 smtp.gmail.com:465
  3. 要正确处理特殊字符和认证信息,建议使用环境变量来存储敏感信息。

要是你在使用特定邮箱服务(如 Outlook、Yahoo 等)时遇到问题,可以进一步补充说明,我会为你提供更具针对性的帮助。


在实际应用中,除了 curl,还有许多工具可以用于发送邮件,

以下是一些常见工具及其特点和使用场景的介绍:

一、命令行工具

适合开发者或运维人员通过脚本自动化发送邮件,无需图形界面。

1. mailx/sendmail(Linux/macOS)
  • 特点
    • 系统自带工具(部分 Linux 发行版需手动安装),配置简单,适合发送纯文本邮件。
    • 通过命令行直接调用 SMTP 服务器发送邮件。
  • 使用示例
    echo "邮件内容" | mailx -s "主题" -r "发件人邮箱" -S smtp=smtp.example.com recipient@example.com
    
    • 需提前配置 SMTP 服务器信息(如 ~/.mail.rc 文件)。
2. mutt(Linux/macOS)
  • 特点
    • 功能更丰富的命令行邮件客户端,支持 HTML 邮件、附件、加密(GPG)等。
    • 可交互式撰写邮件,也可通过脚本调用。
  • 使用示例
    mutt -s "主题" -- recipient@example.com <<EOF
    邮件正文
    EOF
    
    • 需配置账户和 SMTP 服务器(如 ~/.muttrc 文件)。
3. PowerShell(Windows)
  • 特点
    • Windows 系统自带的脚本工具,通过 .NET 库发送邮件,支持附件和 HTML。
  • 使用示例
    $smtp = New-Object Net.Mail.SmtpClient('smtp.example.com', 587)
    $smtp.EnableSsl = $true
    $smtp.Credentials = New-Object Net.NetworkCredential('发件人邮箱', '密码')$msg = New-Object Net.Mail.MailMessage('发件人邮箱', '收件人邮箱', '主题', '正文')
    $msg.IsBodyHtml = $true # 启用 HTML 格式
    $smtp.Send($msg)
    

二、图形界面工具(GUI)

适合普通用户通过可视化界面撰写和发送邮件,操作直观。

1. Outlook
  • 特点
    • 微软旗下老牌邮件客户端,支持多账户、日历、任务管理等功能,兼容性强。
    • 适合企业或个人日常办公使用。
  • 使用方式
    • 配置邮箱账户(支持 Exchange、IMAP、POP3 等协议),直接通过界面撰写发送。
2. Thunderbird
  • 特点
    • 开源免费的邮件客户端,支持插件扩展,界面简洁,隐私性较好。
    • 适合技术爱好者或注重隐私的用户。
  • 使用方式
    • 安装后配置邮箱账户,支持手动设置 SMTP/IMAP 服务器。
3. Apple Mail(macOS/iOS)
  • 特点
    • macOS 和 iOS 系统自带的邮件应用,与苹果生态深度整合,操作流畅。
    • 支持 iCloud 邮箱及其他主流邮箱(如 Gmail、Outlook 等)。
4. 网页邮箱(Webmail)
  • 示例:Gmail、Outlook.com、QQ 邮箱、163 邮箱等。
  • 特点
    • 无需安装客户端,直接通过浏览器访问,适合临时使用或多设备同步。
    • 功能全面,支持附件、标签、草稿保存等。

三、脚本语言库(编程场景)

适合开发者通过代码集成邮件发送功能,支持高度定制化。

1. Python
  • smtplib(内置库)、email(构建邮件内容)。
  • 示例代码
    import smtplib
    from email.mime.text import MIMEText
    from email.utils import formataddrmsg = MIMEText('邮件正文', 'plain', 'utf-8')
    msg['From'] = formataddr(('发件人名称', 'sender@example.com'))
    msg['To'] = 'recipient@example.com'
    msg['Subject'] = '主题'server = smtplib.SMTP('smtp.example.com', 587)
    server.starttls()
    server.login('sender@example.com', '密码')
    server.sendmail('sender@example.com', ['recipient@example.com'], msg.as_string())
    server.quit()
    
2. Node.js
  • nodemailer(主流邮件发送库)。
  • 示例代码
    const nodemailer = require('nodemailer');const transporter = nodemailer.createTransport({service: 'Gmail',auth: {user: 'sender@example.com',pass: '密码'}
    });const mailOptions = {from: '发件人名称 <sender@example.com>',to: 'recipient@example.com',subject: '主题',text: '邮件正文'
    };transporter.sendMail(mailOptions, (error, info) => {if (error) console.log(error);else console.log('邮件已发送: ' + info.response);
    });
    
3. PHP
  • 函数:内置 mail() 函数(需配置本地邮件服务器,如 sendmail)。
  • 更推荐库PHPMailer(支持 SMTP 发送,功能更完善)。
4. Java
  • JavaMail API(标准邮件发送库)。

四、邮件发送服务(API 接口)

适合企业级应用或大规模邮件发送,提供高可靠性和可扩展性。

1. SendGrid
  • 特点
    • 专业邮件发送平台,提供 API 和 SMTP 接口,支持事务性邮件、营销邮件等。
    • 具备邮件追踪、退订管理、反垃圾邮件等功能。
2. Mailgun
  • 特点
    • 基于云的邮件发送服务,适合开发者通过 API 集成,提供详细的日志和分析。
3. AWS Simple Email Service (SES)
  • 特点
    • 亚马逊云服务的邮件发送组件,成本低,适合大规模发送和自动化场景。
4. 腾讯云邮件推送 / 阿里云邮件推送
  • 特点
    • 国内云服务商提供的邮件服务,支持验证码、通知类邮件,合规性强。

五、其他工具

1. Postman
  • 特点
    • 原本是 API 测试工具,但通过编写脚本(如 JavaScript)可调用 SMTP 发送邮件,适合临时调试。
2. Telnet/Netcat
  • 特点
    • 最底层的网络工具,可手动与 SMTP 服务器交互发送邮件(需熟悉 SMTP 协议),适合调试或学习。
  • 示例流程
    telnet smtp.example.com 25
    HELO example.com
    MAIL FROM: <sender@example.com>
    RCPT TO: <recipient@example.com>
    DATA
    主题: 测试邮件
    正文内容
    .
    QUIT
    

如何选择合适的工具?

  • 个人日常使用:网页邮箱(如 Gmail/QQ 邮箱)或图形界面工具(Outlook/Thunderbird)。
  • 脚本自动化:命令行工具(mailx/mutt)或编程语言库(Python/Node.js)。
  • 企业级需求:邮件发送服务(SendGrid/AWS SES)或专业客户端(Outlook)。
  • 开发调试:Postman 或底层协议工具(Telnet)。

根据具体场景选择工具,如需高可靠性和可扩展性,优先考虑专业邮件服务;如需快速临时发送,网页邮箱或命令行工具更便捷。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词