电子邮件协议及GO发送QQ邮件

本文涉及的产品
.cn 域名,1个 12个月
简介: 提供电子邮件服务的协议叫做:SMTP(Simple Mail Transfer Protocol)为了能够高效安全的进行数据的传输,SMTP协议底层使用的TCP实现两端的连接。

一、电子邮件的工作机制#



提供电子邮件服务的协议叫做:SMTP(Simple Mail Transfer Protocol)为了能够高效安全的进行数据的传输,SMTP协议底层使用的TCP实现两端的连接。


早期的电子邮件收发的工作机制如上图所示。发送端和接收端之间通过SMTP底层的TCP简历连接。通过网络直接将邮件发送到对方的磁盘上。


但是问题也随之而来:



如果接收方没有开机,或者开机了但是没有连接网络,那么就不能通过SMTP协议建立连接,这时发送端只能是个隔一段时间后重试,直到接收端开机了,联网了,发送端才能成功的将邮件发送给接收方。问题很明显,接收方只要不开机,发送方的邮件就不能发送出去,如果是东方国家和西方国家之间的两个人各自在各自的白天才开机,那岂不是他们之间的邮件根本不可能发送出去了?


为了解决这个问题,邮件服务器出现了:



这时收发邮件的工作机制就演变成了上图那样。发送方 面向 邮件服务器发送邮件,而不管接收方是否开机,是否联网,接收方通过上线后使用POP3(Post Office Proto-col)从邮件服务器接收邮件。


整个过程中,邮件服务器是不会断电的。


1.1 SMTP#


通过上图可以看到,SMTP是发送电子邮件时使用的协议。 它底层使用tcp的25号端口。在这个tcp连接上进行控制,应答,以及数据的传输。


客户端以文本的方式发送请求,邮件服务器每次回复3位数字作为应答。比如客户端首次会发送 HELO<domain>表示请求建立连接。正常的话邮件服务器会回复250,表示完成请求命令。


SMTP协议中规定,以'.'最为邮件正文的结束符。当正文前面有一个'.'或者有两个'.' 都要进行特殊处理。


SMTP不会校验发送者,所以我们经常会收到垃圾邮件,据说也会有“POP before SMTP” 和“SMTP认证”机制,来防止冒充发送人。从而减少垃圾邮件的数量。


1.2 POP3#


POP服务器也是一台一直处于充电状态的服务器。


客户端通过pop3协议从pop服务器上接收发送方发过来的协议,但是在接收之前是需要进行用户身份验证的,也就是说,客户端得将自己的账号密码发送到POP服务器,通过验证后才能取回属于自己的邮件


POP与SMTP一样,都是基于TCP连接完成相应的操作的。


1.3 IMAP#


IMAP和POP协议一样都是接收电子邮件时使用的协议。


如果使用IMAP,即使不用将电子邮件下载到本地也可以阅读。因为IMAP实现了字啊服务端处理MIME类型的数据,所以他能实现当一封电子邮件有10个附件时,它能直接打开其中的某一个。而且在服务端作出已读/未读,等状体的修改。


二、邮件地址#


邮件地址通常都是由两部分组成: 名称@地址


常见的像 123@qq.com 这种邮件的地址。


123就是名称,qq.com就是地址。 电子邮件的地址和域名构造相同,后面的com是顶级域名。


现在的电子邮件地址由DNS统一管理。DNS里面存储着各个邮件地址,和这个邮件地址作为发送地址时所对应的邮件服务器的域名信息。我们把这种映射关系称为MX记录。因为方才说了,对现在的邮件发送机制来说,发送者是将邮件发送到邮件服务器上。那通过查询DNS中的MX记录,就能知道xxx@qq.com.xxx@163.com 这种不同的邮件后缀所对应的邮件服务器的域名,通过域名进一步找到这个机器。


三、MIME信息#


最初的很长一段时间里,邮件只能发送文本信息。后台能发送的数据类型已经被拓展到了MIME。可以发送诸如gif, video,png,jpg,jpeg,text/plain 等等类型的数据。具体发送啥样的信息,通过Content-Type定义。


四、使用golang发送qq邮件#


实例代码如下:


package mail
import (
  "strconv"
)
import "gopkg.in/gomail.v2"
func SendMail(mailTo []string, subject string, body string) error {
  mailConn := map[string]string{
    "user": "6464xxxx8@qq.com", // 邮件发送者的地址
    "pass": "trsxxxxxxxxxxcd",  // qq邮箱填授权码,百度一下获取方式。
    "host": "smtp.qq.com", // 发送将邮件发送给腾讯的smtp邮件服务器
    "port": "465",   // 发送邮件使用的端口
  }
  port, _ := strconv.Atoi(mailConn["port"])
  m := gomail.NewMessage()
  m.SetHeader("From", m.FormatAddress(mailConn["user"], "自动化成绩查询"))
  m.SetHeader("To", mailTo...)    //发送给多个用户
  m.SetHeader("Subject", subject) //设置邮件主题
   m.SetBody("text/html", body)    //设置邮件正文
  d := gomail.NewDialer(mailConn["host"], port, mailConn["user"], mailConn["pass"])
  err := d.DialAndSend(m)
  return err
}
  /*
  发送邮件
  stuEmail:学生的邮箱
  subject:标题
  body:发送的内容
  */
func DoSendMail(stuEmail , subject, body string) (e error) {
  mailTo := []string{stuEmail}
  err := SendMail(mailTo, subject, body)
  if err != nil {
    e = err
    return e
  }
  return nil
}
//func main() {
//  //定义收件人
//  mailTo := []string{
//    "2693xxxx8@qq.com",
//    "196xxxxx30@qq.com",
//  }
//  //邮件主题为"Hello"
//  subject := "Hi 出成绩了"
//  // 邮件正文
//  body := "请查收您的新成绩"
//
//  err := SendMail(mailTo, subject, body)
//  if err != nil {
//    log.Println(err)
//    fmt.Println("send fail")
//    return
//  }
//  fmt.Println("send successfully")
//}


相关文章
|
6月前
|
物联网 Go 网络性能优化
使用Go语言(Golang)可以实现MQTT协议的点对点(P2P)消息发送。MQTT协议本身支持多种消息收发模式
使用Go语言(Golang)可以实现MQTT协议的点对点(P2P)消息发送。MQTT协议本身支持多种消息收发模式【1月更文挑战第21天】【1月更文挑战第104篇】
469 1
|
存储 XML JSON
互联网协议必备:Go语言中JSON的序列化与反序列化
互联网协议必备:Go语言中JSON的序列化与反序列化
139 0
|
人工智能 JavaScript 前端开发
MinIO:基于Go实现的高性能、兼容S3协议的对象存储
MinIO:基于Go实现的高性能、兼容S3协议的对象存储
788 1
|
Linux Go C语言
嵌入式linux之go语言开发(四)go语言8583协议报文解析
嵌入式linux之go语言开发(四)go语言8583协议报文解析
|
存储 安全 网络协议
Go 语言快速入门指南:什么是 TLS 安全传输层协议
安全问题,让人既爱又恨,不管是云原生应用还是本地或其他,安全是任何应用程序的一个重要特性。但往往很多时候,安全问题被忽视,成为最后考虑的问题,这样的结果就是:一旦出现问题,就会带来灾难性结果。
Go 语言快速入门指南:什么是 TLS 安全传输层协议
|
Web App开发 NoSQL Linux
小米被指违反 GPL 协议;iOS 16 公测版发布;Go 1.19 RC1 发布 | 思否周刊
小米被指违反 GPL 协议;iOS 16 公测版发布;Go 1.19 RC1 发布 | 思否周刊
197 0
|
Go 数据格式 JSON
Go语言封装Http协议GET和POST请求
本文几乎没有文字叙述:   /* 有关Http协议GET和POST请求的封装 */ package net import ( "net/http" "io" "bytes" "encoding/json" "io/ioutil" ...
4014 0
|
安全 网络协议 Go
TLS1.3 协议的Golang 实现——ClientHello
# 前言 撰写本文时[TLS1.3 RFC](https://tools.ietf.org/html/draft-ietf-tls-tls13-28) 已经发布到28版本。以前写过一点密码学及TLS 相关的文章,为了更深入理解TLS1.3协议,这次将尝试使用Go语言实现它。网络上已有部分站点支持TLS1.3,Chrome浏览器通过设置可支持TLS1.3 (draft23),利用这些条件可验证,
4066 0
|
1天前
|
编译器 Go
go语言编译选项
【10月更文挑战第17天】
9 5