发送邮件使用的是 SMTP 协议 (简单邮件传输协议), 用于邮件服务器和邮件发送方之间。

邮件的发送过程大致如下:

  1. 在邮件发送方和邮件服务器间建立 TCP 连接, 服务器响应 220 表示连接成功;
  2. 发送方通过HELO命令标识自己的身份. 服务器响应 250 表示准备接收邮件;
  3. 发送方通过AUTH LOGIN命令进行登录, 以 163 邮件服务器为例, 登录账号分别是 base64 编码过的邮箱账号和 163 的客户端授权码. 服务器响应 334 表示账号验证通过, 响应 235 表示授权码验证通过;
  4. 发送方通过MAIL FROM命令指定邮件的发送者. 服务器响应 250 表示成功;
  5. 发送方通过RCPT TO命令指定邮件接收地址, 服务器响应 250 表示成功;
  6. 发送方通过DATA命令发送邮件, 邮件内容包括邮件头和邮件正文部分. 服务器响应 250 表示成功;
  7. 发送方通过QUIT命令断开连接.

Windows 下可以通过 telnet 发送邮件。

邮件头的基本格式为:

邮件头主要配置项:

邮件内容的具体格式和结构, 可以参考: https://help.aliyun.com/knowled。

示例一: 发送简单邮件

sendEmail.php

通过命令行执行脚本文件:

示例二: 发送携带单个附件的邮件

邮件携带附件时, 邮件头的格式类似 HTTP 请求中的上传文件时请求头的格式, 都需要在头部附加说明附件的内容和其他信息.

sendEmailWithAttachment.php

通过命令行运行脚本:

邮箱成功接收到邮件:

示例三: 发送携带多个附件的邮件

sendEmailWithMultiAttachment.php

通过命令行运行脚本:

邮箱接收到邮件:

如果需要设置抄送项, 在邮件头中配置抄送项Cc即可, 如:

然后通过执行命令RCPT TO设置抄送人:

退信的处理

邮件内容不规范, 或相同内容重复发送时, 可能导致退信, 发送失败.

  1. 如果是重复内容反复发送导致的退信, 更换发送人账号即可.
  2. 也可以通过将发件人添加到收件人解决退信问题. 此时邮件头中To的配置项为:

在通过命令设置发件人时, 通过反复执行RCPT TO命令, 设置多个收件人.