golang

使用golang的net/smtp包发送邮件

SMTP是一种将邮件从一端发送到另一端的一种机制。其工作在TCP/IP模型的应用层。有时使用TLS或SSL来建立终端系统之间的安全连接。

当SMTP客户端有消息要发送时,其会建立到SMTP服务器的双向传输通道。连接建立后,客户端启动邮件传送事务,该事务由一系列发送到服务器的命令构成。服务器回应每条消息。回应表明命令是否被接受,或者需要额外的数据或是否有任何错误。

这是一个简单的SMTP交互如何完成(来源维基百科)。

SMTP传输邮件对象,邮件对象包含信封和邮件内容。SMTP信封包含如下内容

  1. 创建会话和客户端启动:服务器发送问候消息,客户端发送标识。(EHLO)
  2. 邮件会话:由MAIL FROM命令,RCPT TO命令和DATA命令组成。

DATA命令表示信封结束,客户端发送邮件内容。

net/smtp包提供了所有ESMTP命令的功能

对于邮件中的CC字段,SMTP建议在邮件内容中添加CC接受者的详细信息,同时向所有的接受者发送相同的副本。对于密件抄送(BCC),详细信息不回添加到内容中,但会发送邮件。

go语音的net/smtp包为这些命令每一个都提供函数。

前两个函数都返回一个客户端。第三种方法用来指定一个特定的主机名。程序员不需要担心EHLO命令,库会负责处理。

Mail方法发送一个MAIL FROM命令

Rcpt方法发送一个RCPT TO命令

Data()方法将DATA命令发送到服务器。它返回一个io writer对象。将要发送的邮件内容写入此对象中。

最后Close()方法发送一个QUIT命令

下面是一个例子

别尝试运行这段代码。对于使用Gmail邮箱来讲,这段代码并不能工作。Gmail需要使用密码登录的,同时还需要SSL/TLS进行端对端的加密。

原来的SMTP实现没有任何安全性。但最终还是增加了一些安全功能。所有的SMTP服务器都维护这一个发送者身份的数据库和FROM MAIL地址的映射。因此,当用户发送邮件时,FROM MAIL命令中提到的邮件ID应被映射到用户身份上。所有的SMTP服务器也需要客户端提供某种端到端的安全性。

安全性的第一步是使用TLS来代替TCP。NewClient()方法接受一个net.conn对象,并重新使用该连接来创建一个SMTP客户端对象。

当客户端发送EHLO命令后,服务器端会返回一个该服务器支持的服务扩展列表。该服务扩展包含它支持的列表认证机制。 这是来自SMTP服务器的典型响应。

客户端需要在EHLO命令和MAIL FROM命令之前发送AUTH数据。

在我们的例子中,我们将使用PLAIN身份验证。

在PLAIN身份验证中,客户端将用户名和密码元组发送到服务器。

之后,我们发送剩下的命令,这些命令我们再前面提到过。

完整的代码示例如下

对于CC和BCC,需要将相同的邮件发送给个别的收件人。所有邮件的内容都是一样的,密件抄送(BCC)细节不在邮件内容中提供。

以下是CC和BCC的示例代码

直译自:https://hackernoon.com/golang-sendmail-sending-mail-through-net-smtp-package-5cadbe2670e0

Leave a Reply

Your email address will not be published. Required fields are marked *