• 电子邮件发送接收原理(附 go 语言实现发送邮件)


    前言

    首先要了解电子邮件的发送接收,不是点到点的。我想给你传达个消息,不是直接我跑到你家里喊你:“嘿,xxx,是你的益达,快拿走”。

    而是类似快递的发送收取方式,是有服务器的中转的。我先将我的益达给快递公司,然后快递公司将货运到代收点,通知你去取快递。

    题外话:一开始的邮件传递就是点到点的模式,因为最开始的计算机都是大型主机,并且 24 小时不停机,用户也是实时在线,而且每台主机都有固定的 IP 地址。

    电子邮件发送接收原理

    下图是 邮件发送的基本过程与概念 这篇文章的图,感觉很清晰,直接拿过来用了。

    在这里插入图片描述

    该图表示的是用户 AQQ邮箱 发送邮件到用户 B163邮箱

    步骤说明:

    1. 用户 A 的电子邮箱为:xx@qq.com,通过邮件客户端软件写好一封邮件,交到 QQ 的邮件服务器,这一步使用的协议是 SMTP,对应图示的 ①;
    2. QQ 邮箱会根据用户 A 发送的邮件进行解析,也就是根据收件地址判断是否是自己管辖的账户,如果收件地址也是 QQ 邮箱,那么会直接存放到自己的存储空间。这里我们假设收件地址不是 QQ 邮箱,而是 163 邮箱,那么 QQ 邮箱就会将邮件转发到 163 邮箱服务器,转发使用的协议也是 SMTP,对应图示的 ②;
    3. 163 邮箱服务器接收到 QQ 邮箱转发过来的邮件,也会判断收件地址是否是自己,发现是自己的账户,那么就会将 QQ 邮箱转发过来的邮件存放到自己的内部存储空间,对应图示的 ③;
    4. 用户 A 将邮件发送了之后,就会通知用户 B 去指定的邮箱收取邮件。用户 B 会通过邮件客户端软件先向 163 邮箱服务器请求,要求收取自己的邮件,对应图示的 ④;
    5. 163 邮箱服务器收到用户 B 的请求后,会从自己的存储空间中取出 B 未收取的邮件,对应图示 ⑤;
    6. 163 邮箱服务器取出用户 B 未收取的邮件后,将邮件发给用户 B,对应图示的 ⑥;最后三步用户 B 收取邮件的过程,使用的协议是 POP3;

    邮件服务器

    由于搭建自己的邮箱服务,需要有自己的服务器,大多数情况下个人是没有的,这里用 QQ 邮箱进行测试。


    打开 QQ 邮箱网站 -> 登录 -> 设置 -> 账号 ->【POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV 服务】 设置为开启 —> 此时需要手机发送信息进行验证,验证成功后会获得授权码 -> 设置完成后,保存更改

    操作完成后,服务状态如下即可

    在这里插入图片描述

    注意: 授权码要自己保存好,连接邮件服务器的时候用的就是这个。

    发送邮件 go 代码

    借助第三方开源库 go-simple-mail,下方是简单的发送邮件的测试代码:

    package main
    
    import (
    	"log"
    	"github.com/xhit/go-simple-mail/v2"
    )
    
    func main() {
    	server := mail.NewSMTPClient()
        server.Host = "smtp.qq.com" // qq 邮件服务地址
    	server.Port = 25
    	server.Username = "xxx@qq.com"
    	server.Password = "授权码"
        server.Encryption = mail.EncryptionTLS
    
        smtpClient, err := server.Connect()
        if err != nil {
            log.Fatal(err)
        }
    
        // Create email
        email := mail.NewMSG()
        email.SetFrom("发件人昵称")
        email.AddTo("收件人邮箱")
        email.SetSubject("测试主题")
    
        str := `我是测试内容`
        email.SetBody(mail.TextPlain, str)  //发送信息 
        email.AddAttachment("附件地址") // 附件
    
        // Send email
        err = email.Send(smtpClient)
        if err != nil {
            log.Fatal(err)
        }
        log.Println("发送成功")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    代码不复杂,如果有其他的需求,可以查看官方文档,其中例子也很多,自行查看。

    总结

    本文主要介绍了电子邮件发送接收的原理,邮件传输过程中还有许多细节,如:DNS 解析、邮件协议等都没有详细阐述。

    大体流程:用户 A -> 邮箱服务器 (-> 其他邮箱服务器) -> 用户 B

    最后介绍了下使用 golang 来发送邮件,配置好服务器后还是很方便的。

    参考

  • 相关阅读:
    搭建自己的语义分割平台deeplabV3+
    【跟学C++】C++字符串——string类(Study15)
    LeetCode99之恢复二叉搜索树(相关话题:中序遍历)
    origin自定义颜色
    探针台选型应该注意哪些事项
    wy的leetcode刷题记录_Day36
    3715. 最少交换次数(北京师范大学考研机试题)
    【云原生】Docker镜像的创建,Dockerfile
    OpenXR手部追踪实现详解
    一篇让你使用vue-cli搭建SPA项目
  • 原文地址:https://blog.csdn.net/DisMisPres/article/details/134041172