电子邮件发送接收原理(附 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("发件人昵称<xxx@qq.com>")
    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("发送成功")
}

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

总结

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

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

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

参考

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java可以通过使用JavaMail API来实现发送接收邮件的功能。下面是一个简单的Java程序示例,演示如何使用JavaMail API发送邮件: ```java import java.util.*; import javax.mail.*; import javax.mail.internet.*; public class SendMail { public static void main(String[] args) { final String username = "your_email_address@gmail.com"; final String password = "your_email_password"; Properties props = new Properties(); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.port", "587"); Session session = Session.getInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }); try { Message message = new MimeMessage(session); message.setFrom(new InternetAddress("from_email_address@gmail.com")); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("to_email_address@gmail.com")); message.setSubject("Testing JavaMail API"); message.setText("Dear Mail Crawler," + "\n\n Please do not spam my email!"); Transport.send(message); System.out.println("Done"); } catch (MessagingException e) { throw new RuntimeException(e); } } } ``` 这个程序使用Gmail SMTP服务器发送电子邮件。您需要将您的Gmail电子邮件地址和密码替换为程序中的“your_email_address”和“your_email_password”。您还需要将发件人和收件人的电子邮件地址替换为程序中的“from_email_address”和“to_email_address”。 要接收邮件,您需要使用JavaMail API中的IMAP或POP3协议。这里是一个简单的Java程序示例,演示如何使用JavaMail API接收邮件: ```java import java.util.Properties; import javax.mail.*; import javax.mail.internet.*; public class ReceiveMail { public static void main(String[] args) throws Exception { Properties props = new Properties(); props.setProperty("mail.store.protocol", "imaps"); props.setProperty("mail.imaps.host", "imap.gmail.com"); props.setProperty("mail.imaps.port", "993"); props.setProperty("mail.imaps.ssl.enable", "true"); Session session = Session.getDefaultInstance(props, null); Store store = session.getStore("imaps"); store.connect("your_email_address@gmail.com", "your_email_password"); Folder inbox = store.getFolder("INBOX"); inbox.open(Folder.READ_ONLY); Message[] messages = inbox.getMessages(); for (int i = 0; i < messages.length; i++) { System.out.println("Subject: " + messages[i].getSubject()); System.out.println("From: " + messages[i].getFrom()[0]); System.out.println("Text: " + messages[i].getContent().toString()); } inbox.close(false); store.close(); } } ``` 这个程序使用IMAP协议从Gmail收取邮件。您需要将您的Gmail电子邮件地址和密码替换为程序中的“your_email_address”和“your_email_password”。这个程序只是简单地打印收件箱中的邮件主题,发件人和正文。 需要注意的是,如果您使用的是Gmail帐户,请确保已启用“IMAP访问”和“安全性较低的应用程序访问”选项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值