关于邮件协议的理解、实验以及java mail的实现

news2024/11/15 21:49:23

1、几种电子邮件系统组成

传统电子邮件系统

一个传统电子邮件系统由以下几个部分组成

  • UA(用户代理)
  • 邮箱服务器
  • 电子邮件协议
    • 邮件发送协议(SMTP)与邮件接受协议(POP3,IMAP)

在这里插入图片描述

 

用户代理 UA (User Agent)

定义:用户代理 UA 就是用户与电子邮件系统的接口,是电子邮件客户端软件。通常是用户计算机中的一个程序

功能:撰写、显示、处理和通信。


邮箱服务器

功能:收发电子邮件

邮件服务器使用客户-服务器方式工作,同时需要使用两种协议:邮件发送协议和邮件接收协议。发送协议用于UA向服务器或者服务器向服务器发送邮件,接收邮件用于UA从服务器读取邮件。

同时邮件服务器必须能够同时充当客户与服务器。当A发送邮件到B,A为客户;当A从B接收邮件,A为服务器。

基于万维网的电子邮件系统

 

2、电子邮件协议

SMTP

smtp的通信有三个阶段

  • 连接建立
  • 邮件传送
  • 连接释放

连接建立

1.当SMTP客户端每隔一定时间对邮件缓存扫描一次,如发现有邮件,就使用SMTP的熟知端口号25与接收方的邮件服务器的SMTP服务器建立TCP连接。

2.接收方SMTP服务器发出“220 Service ready"告诉客户端它已经准备好接收邮件。

3.客户发送HELO报文,附上发送方的主机名。如果服务器可以接收,则发送“250 OK",否则发送”421 service not available“

SMTP不使用中间的邮件服务器,TCP建立总是在发送方与接收方直接建立。

邮件传送

 1.客户发送MAIL FROM报文介绍报文的发送者。它包括发送人的邮件地址(邮箱名和域名,如house@qq)。这个步骤是必要的:因为可以给服务器在返回差错或报文时的返回邮件地址 。

 2.服务器响应代码250(请求命令完成)或其他适当的代码

 3.客户发送一个或多个RCPT命令,包括收件人的邮件地址,RCPT命令的作用是 : 先弄清接收方系统是否已经准备好接收邮件的准备,然后才发送邮件,这样做视为了避免浪费通信资源,不至于发送了很长的邮件以后才知道是因地址错误 。

4.服务器响应代码250或其他适当的代码。

5.客户发送DATA报文对报文的传送进行初始化,DATA命令表示要开始传送邮件的内容了。

6.服务器响应代码"354 Start mail input: end with <CRLF>.<CRLF>"或其他适当的报文(如421 服务器不可用,500 命令无法识别)。

7.客户用连续的行发送报文的内容。每一行的行结束时输入 <CRLF>.<CRLF> ,即回车换行.回车换行,表示邮件内容结束。

8.服务器响应代码(250 请求命令完成)或其他适当的代码。

        值得注意的是:虽然SMTP使用TCP连接试图使邮件的传送可靠,但它并不能保证不丢失邮件。也就是说,使用SMTP传送邮件只能说可以可靠地传送接收方的邮件服务器,在往后的情况就不知道了。接收方的邮件服务器也许会出故障,使收到的服务器全部丢失(在收件人读取信件之前)。

连接释放

1.客户发送QUIT命令。

 2.服务器响应221(TCP服务关闭)

局限

原生SMTP只能传输ASCII码,最多7B,可不传输2进制文件。明文传输。

POP3

POP3采用C/S的工作方式。在接收邮件的用户PC机中的用户代理UA必须运行POP3的客户程序,而在收件人所连接的ISP的邮件服务器中则运行POP的服务器程序。POP服务器只有在用户输入鉴别信息(用户名+口令)后,才允许对方对邮箱进行读取 。

POP3有 两种工作方式 :删除方式和保存方式。

删除方式就在每一次读取邮件后就把邮箱中的这个邮件删除,用户只能读取一次 

保存方式就是在读取邮件后,邮件仍然在服务器中保存,用户可读取多次,该方式是通过对之前的POP3工作方式(即删除)的缺点进行弥补,对功能进行扩充。

IMAP

        在使用IMAP时,用户的PC机上运行IMAP客户程序,然后与接收方的邮件服务器上的IMAP服务器程序建立TCP连接。 POP3不允许用户在邮件服务器上整理自己的邮件,用户在服务器上不能不同的文件夹,POP3也不允许用户在下载邮件之前读取邮件的部分内容,而IMAP则克服了这些POP3的缺点,说白了就是POP3协议不太愿意让用户直接操作服务器,而IMAP正好客户了这些缺点 。

        IMAP4提供了以下功能( 这些功能POP3则没有 ):

        1.用户在下载邮件之前可以检查邮件的首部。

        2.用户在下载邮件之前可以用特定的字符串搜索电子邮件的内容。

        3.用户可以部分地下载电子邮件。

        4.用户可以在邮件服务器上创建、删除邮箱,或对邮箱重命名。(IMAP是双向的,可以同步本地修改到服务端;POP只能同步服务端到本地)

        5.为了存放电子邮件,用户可以在文件夹中创建分层次的邮箱。

补充

为了改变SMTP只能传输ASCII码的缺点,提出了MIME,MIME没有改变SMTP,而是继续采用现有的邮件编码,但增加了邮件主题的结构,定义了传送非ASCII码的编码规则

 

3、telnet实验电子邮件协议

SMTP

POP3

4、java mail

添加javax.mail依赖

public class Main{
    private static String charset = "utf-8";
    private static final String user = "xxxxx@qq.com";
    private static final String pass = "xxx";//授权码
    public static void main(String[] args) throws IOException, MessagingException {
        Session session = getSession();
        MimeMessage email = getEmail(session);
        Transport transport =  session.getTransport();
        transport.connect(user, pass);
        transport.sendMessage(email, email.getAllRecipients());
        transport.close();
    }

    private static MimeMessage getEmail(Session session) throws MessagingException, UnsupportedEncodingException {
        MimeMessage mimeMessage = new MimeMessage(session);
        mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress("xxx@qq.com", "he", charset));
        mimeMessage.setText("hello world",charset);
        mimeMessage.setSentDate(new Date());
        mimeMessage.setContent("hello world", "text/html;charset=utf-8");
        mimeMessage.setFrom(new InternetAddress("xxx@qq.com", "she", charset));
        mimeMessage.setSubject("TEST邮件主题", "UTF-8");
        mimeMessage.saveChanges();
        return mimeMessage;
    }

    private static Session getSession() {
        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", "smtp");   // 使用的协议(JavaMail规范要求)
        props.setProperty("mail.smtp.host", "smtp.qq.com");   // 发件人的邮箱的 SMTP 服务器地址

/*      开启了SSL认证的SMTP连接
        props.setProperty("mail.smtp.auth", "true");            // 需要请求认证
final String smtpPort = "465";
        props.setProperty("mail.smtp.port", smtpPort);
        props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.socketFactory.port", smtpPort);
*/
        Session session = Session.getInstance(props);
        session.setDebug(true);
        return session;
    }
}

springboot:

 <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
spring:
  # 发送QQ邮件配置
  mail:
    host: smtp.qq.co
    protocol: smtp
    port: 465
    username: xxxx@qq.com. #邮箱地址
    password: xxxx #授权码
    properties: # 配置以SSL的方式发送, 这个需要使用这种方式并且端口是465
      mail:
        smtp:
          auth: true
          ssl:
            enable: true
            socketFactory:
              class: com.sun.mail.util.MailSSLSocketFactory
              fallback: false
        debug: true

工具类网上随便找一个,或者参考spring官网

参考文章

计算机网络 电子邮件

在telnet登录并使用SMTP和POP收发邮件(QQ邮箱)

基于JavaMail的Java邮件发送:简单邮件发送

spring官网

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/693151.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mac上mysql启动报错问题Unable to lock ./ibdata1 error: 35

记录一次mac安装mysql启动报错问题Unable to lock ./ibdata1 error: 35。首先&#xff0c;这是第一次在公司新领的mac上面去安装mysql&#xff0c;在去年换新电脑之前&#xff0c;老电脑也安装过&#xff0c;没出现过这种问题。其次&#xff0c;自己的几台windows笔记本也安装过…

VS2019 彻底卸载、安装C\C++\C#

彻底卸载 进入“控制面板 - 程序和功能”&#xff0c;找到并选择VS2019&#xff0c;单击右键选择“卸载”。 在弹出的卸载向导中&#xff0c;我们需要选择要卸载的组件&#xff0c;如果要彻底卸载VS2019&#xff0c;则需要全部选择&#xff0c;并依次执行卸载操作。 在VS2019…

要从HTML中提取img标签的src属性(图片链接),可以使用正则表达式方式。

1. 定义提取src属性的正则表达式: const srcRegex /<img\s(?:[^>]*?\s)?src\s*\s*(["])((?:[^\1"]|\\\1|.)*?)\1/g 这个正则会匹配类似<img src"http://example.com/1.jpg">中的src属性和括号中的连接。2. 调用字符串的matchAll()方法…

系统集成项目管理工程师(项目管理知识[二])

第八章 项目进度管理 1、前导图法4种类型依赖关系&#xff1a; (1)结束-开始的关系&#xff08;F-S型&#xff09; (2)结束-结束的关系&#xff08;F-F型&#xff09; (3)开始-开始的关系&#xff08;S-S型&#xff09; (4)开始-结束的关系&#xff08;S-F型&#xff09; 2、…

Fastjson漏洞

Fastjson 概述 Fastjson是阿里巴巴公司开源的一款json解析器&#xff0c;它可以解析 JSON 格式的字符串&#xff0c;支持将 Java Bean 序列化为 JSON 字符串&#xff0c;也可以从 JSON 字符串反序列化到JavaBean。 漏洞版本 Fastjson <1.2.24 反序列化远程命令执行漏洞 F…

如何关闭带有隐患的端口?一键关闭危险端口?封锁电脑端口工具

你是否担心自己的Windows电脑存在安全隐患&#xff1f;毕竟&#xff0c;黑客攻击时刻都在发生&#xff01;今天&#xff0c;我将为大家分享一些有关Windows危险端口的知识&#xff0c;以及如何一键关闭高危端口&#xff0c;保障你的电脑安全。希望这些能够帮助你更好地保护自己…

Hidl编程实战(一)——定义HAL服务

1. 概述 hidl基本知识可以参考官网 安卓官网-hidl 也讲解了C和Java实现hidl 本文讲解CHal服务的创建 2. 文件的创建 aosp整编过的代码&#xff0c;可以直接choosecombo后使用hidl-gen工具。如果没有整编过&#xff0c;可以单编hidl-gen工具。 hidl-gen工具可以用来协助创建h…

6应用层-6.3【实验】【计算机网络】

6应用层-6.3【实验】【计算机网络】 前言推荐6应用层知识DHCP协议分析DHCP报文格式DHCP抓包分析 6.1 Web服务与FTP服务配置6.2 DNS域名系统配置6.3 DHCP动态协议参数配置实验目的实验内容及实验环境实验原理实验过程1.搭建网络环境2.配置路由器3.配置DSCP服务器4.完成右侧网络主…

20230627通过WPS给PPT幻灯片加入页码

20230627通过WPS给PPT幻灯片加入页码 2023/6/27 23:16 缘起&#xff1a;不想每次都手工给打印的PPT加页码&#xff0c;就通过百度搜索来自动加页码了&#xff01; 真是偷懒让人进步呀&#xff01; 百度搜索&#xff1a;ppt加页码怎么设置 方法步骤.png ?点击「插入」选项卡「幻…

C++(Day1)

思维导图 2.定义一个命名空间Myspace&#xff0c;包含以下函数&#xff1a;将一个字符串中的所有单词进行反转&#xff0c;并输出反转后的结果。例如&#xff0c;输入字符串为"Hello World"&#xff0c;输出结果为"olleH dlroW"&#xff0c;并在主函数内测…

GPT所想即所见的快速解惑

这是学习笔记的第 2464篇文章 在很多年前&#xff0c;自己脑袋里面冒出来这样的一段文字&#xff0c; 黑暗中一个孩子站在田野上看着另外一个孩子 就好像自己在看自己。 说是感慨也好&#xff0c;伤感也罢。那种画面感是一直难以名状的&#xff0c;最近试了下GPT&#xff0c;给…

7.用python写网络爬虫,验证码处理

前言 验证码&#xff08;CAPTCHA&#xff09;的全称为全自动区分计算机和人类的公开图灵测试&#xff08;Completely Automated Public Turing testtotellComputersand Humans Apart&#xff09;从其全称可以看出&#xff0c;验证码用 于测试用户是否为真实人类。一个典型的验证…

高速电路设计系列分享-熟悉JESD204B(下)

目录 概要 整体架构流程 技术名词解释 技术细节 1.物理层 小结 概要 随着高速ADC跨入GSPS范围&#xff0c;与FPGA(定制ASIC)进行数据传输的首选接口协JESD204B。为了捕捉频率范围更高的RF频谱&#xff0c;需要宽带RFADC。在其推动下&#xff0c;对于能够捕捉更宽带宽并支持配置…

eclipse配置tomcat

一、为什么要配置tomcat &#xff1f; Eclipse是一款非常流行的Java开发集成环境&#xff08;IDE&#xff09;&#xff0c;它主要用于开发Java语言相关的应用程序。而Tomcat则是一个流行的开源Web服务器&#xff0c;也是一个Servlet容器。 在Java Web应用程序的开发过程中&…

有哪些免费好用的Python IDE(集成开发环境)?

工欲善其事&#xff0c;必先利其器。Python的学习过程少不了集成开发编辑环境(IDE)。这些Python IDE会提供插件、工具等帮助开发者加快使用Python开发的速度&#xff0c;提高效率。这里收集了一些对开发者非常有帮助的Python IDE(来自hittp://doc.okbase.net/havoc/archive/242…

【CGAL】Clion+vcpkg+MacOS M2

安装brew 链接如下&#xff1a; MacBook使用笔记&#xff1a;安装Homebrew&#xff08;M1&#xff09; - 知乎 打开mac终端&#xff0c;输入&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 这个是国内镜…

【Java面试题】设计模式

文章目录 设计模式你知道哪些?工厂模式单例模式★★★适配器模式代理模式定义作用静态代理动态代理★★★ 观察者模式★★★责任链模式 设计模式你知道哪些? ​ 创建型模式&#xff08;Creational Pattern&#xff09;&#xff1a;对类的实例化过程进行了抽象&#xff0c;能…

vegeta压测工具源码修改, 增加 摸高模式

在pacer.go中增加如下代码. pacer接口实现类作用就是控制吞吐量, 什么时间吞吐量多少. 摸高模式(梯度加压)效果如下 type HighTouchPacer struct {StartAt RateSlope float64HighTouchTimes float64PerHighTouchDuration float64PerStayDu…

uniapp 封装 navbar tabbar

最近换了一家公司工作 因为上家公司老板给的钱不多 还特别会压榨员工 好了好了&#xff0c;不扯皮了 1、封装navbar&#xff1a; 首先需要在pages.json中将对应页面的原生navbar给取消 举例&#xff1a; {"pages": [{"path" : "pages/home/inde…

Windows 10 首次RDP提示需要修改密码的处理方式

有一台Windows 10 的机器&#xff0c; 系统管理员给了一个RDP账号和密码&#xff0c; 使用这个账号远程登录这台机器&#xff0c; 在命令行输入 mstsc 命令&#xff0c;输入用户名密码之后却无法正常登入&#xff0c; 提示要修改密码&#xff0c; 提示的信息如下&#xff1a;…