一、电子邮件的工作机制

提供电子邮件服务的协议叫做: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")
//}

电子邮件协议及GO发送QQ邮件的更多相关文章

  1. python3:利用SMTP协议发送QQ邮件+附件

    转载请表明出处:https://www.cnblogs.com/shapeL/p/9115887.html 1.发送QQ邮件,首先必须知道QQ邮箱的SMTP服务器 http://service.mai ...

  2. Java发送QQ邮件

    面试的时候被问到这个问题,别人问我用Java发过邮件没有,被问得一脸懵逼.然后就研究了一下,不是很难,按照网上的方法折腾了几天就搞出来了. 首先,使用QQ邮箱发送邮件之前需要在邮箱里面配置,开启pop ...

  3. 5分钟 wamp下php phpmaile发送qq邮件 2015最新方法说明

    13:40 2015/11/20 5分钟 wamp下php phpmaile发送qq邮件 2015最新方法说明 关键点:现在qq邮箱开通smtp服务后会给你一个很长的独立新密码,发邮件配置中的密码需要 ...

  4. 【python】脚本连续发送QQ邮件

    今天习得用python写一个连续发送QQ邮件的脚本,经过测试,成功给国内外的服务器发送邮件,包括QQ邮箱.163邮箱.google邮箱,香港科技大学的邮箱和爱丁堡大学的邮箱.一下逐步解答相关技巧. 首 ...

  5. java mail Received fatal alert: handshake_failure java 无法发送邮件问题 java 发送qq邮件(含源码)

     java 无法发送邮件问题 java 发送qq邮件 报错:java mail Received fatal alert: handshake_failure (使用ssl) javax.mail.M ...

  6. CI框架使用PHPmail插件发送QQ邮件:

    有助请顶,不好请评.0:33 2016/3/12CI框架使用PHPmail插件发送QQ邮件:发送成功,不过修改了主机参数,还包含了一个phpmail中的一个另外的文件,详见下方:参见:http://c ...

  7. Quartz.NET浅谈一 : 简单Job使用(定时发送QQ邮件)

    Quartz.NET是一个全功能的开源作业调度系统,可用于从最小的应用程序到大型企业系统. 直接上代码吧... 一.新建一个控制台项目 略过 二.安装Nuget包 三.创建发送邮箱辅助工具类 stat ...

  8. 九、Python发送QQ邮件(SMTP)

    看了廖雪峰老师的教程: 一封电子邮件的旅程就是 发件人 -> MUA -> MTA -> MTA -> 若干个MTA -> MDA <- MUA <- 收件人 ...

  9. 使用python发送QQ邮件

    这里用到了Python的两个包来发送邮件: smtplib 和 email . Python 的 email 模块里包含了许多实用的邮件格式设置函数,可以用来创建邮件“包裹”.使用的 MIMEText ...

随机推荐

  1. Polycarp and Div 3 CodeForces - 1005D

    这个题目其实很简单,有很多的方法写,然后我还是不会写,感觉自己好菜, 我开始想的是dp,但是不知道怎么dp,看了网上题解,豁然开朗 dp[i] 表示前面i个数满足条件的数有多少,f[s]表示前缀和为s ...

  2. Mahout聚类和kafaka相关知识

    1.说几种距离测度Mahout: 欧式距离测度:平方欧式距离测度:曼哈顿距离测度:余弦距离测度:加权距离测度 2.K-means算法参数:

  3. LeetCode--LinkedList--141.Linked List Cycle(Easy)

    141. Linked List Cycle(Easy)2019.7.10 题目地址https://leetcode.com/problems/linked-list-cycle/ Given a l ...

  4. 【HBase】快速了解上手rowKey的设计技巧

    目录 为什么要设计rowKey 三大原则 长度原则 散列原则 唯一原则 热点问题的解决 加盐 哈希 反转 时间戳反转 为什么要设计rowKey 首先要弄明白一点,Regions的分区就是根据数据的ro ...

  5. java web程序员微信群

    关注微信公众号"程序员成长日志",回复关键字"java"扫码进群 本群主要为大家解决工作中遇到的问题遇到的问题发到群里大家集思广益平时可以瞎扯不定期红包

  6. 数据结构之栈(stack)的实现

    一.栈 1.定义 栈的英文为(stack),是一种数据结构 栈是一个先入后出(FILO-First In Last Out)的有序列表. 栈(stack)是限制线性表中元素的插入和删除只能在线性表的同 ...

  7. [hdu5396 Expression]区间DP

    题意:给一个表达式,求所有的计算顺序产生的结果总和 思路:比较明显的区间dp,令dp[l][r]为闭区间[l,r]的所有可能的结果和,考虑最后一个符号的位置k,k必须在l,r之间,则l≤k<r, ...

  8. 以前的一些word的整理

    LAMP部署 环境:虚拟机centos7 安装apache: 命令:yum install -y httpd (在执行这个命令时,可能会遇到运行yum时出现/var/run/yun.pid已被锁定,P ...

  9. ReactNative报错:Can't find variable: __fbBatchedBridge

    最近开始研究ReactNative,首先根据网上教程 http://www.codeceo.com/article/windows-react-native-android.html 一步一步来.完成 ...

  10. node的http模块

    node中的几个常用核心模块的api返回的都是eventEmitter的实例,也就是说都继承了on和emit方法,用以监听事件并触发回调来处理事件. http模块处理网络请求通常是创建一个server ...