电子邮件

1、基础知识铺垫

要在网络上实现邮件功能,必须要有专门的邮件服务器。 这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过的邮件,并把邮件投递到邮件接收者的电子邮箱中。 SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。 电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请。比如我们要使用QQ邮箱,就需要开通邮箱能;

传输协议

  • SMTP协议
    发送邮件:
    我们通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。
  • POP3协议
    接收邮件:
    我们通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。

邮件收发原理

1、邮件服务器

①SMTP邮件服务器:替用户发送邮件和接收外面发送给本地用户的邮件

②POP3/IMAP邮件服务器:帮助用户读取SMTP邮件服务器接收进来的邮件

2、邮件传输协议

①电子邮件需要在邮件客户端和邮件服务器之间,以及两个邮件服务器之间进行邮件传递,那就必须要遵守一定的规则,这个规则就是邮件传输协议

②SMTP协议:全称为 Simple Mail Transfer Protocol,简单邮件传输协议。它定义了邮件客户端软件和SMTP邮件服务器之间,以及两台SMTP邮件服务器之间的通信规则

③POP3协议:全称为 Post Office Protocol,邮局协议。它定义了邮件客户端软件和POP3邮件服务器的通信规则

④IMAP协议:全称为 Internet Message Access Protocol,Internet消息访问协议,它是对POP3协议的一种扩展,也是定义了邮件客户端软件和IMAP邮件服务器的通信规则

我们说所有的邮件服务器和邮件客户端软件程序都是基于上面的协议编写的.

使用java实现邮件发送功能需要使用的类

我们将用代码完成邮件的发送。这在实际项目中应用的非常广泛,比如注册需要发送邮件进行账号激活,再比如OA项目中利用邮件进行任务提醒等等。 使用Java发送 E-mail 十分简单,但是首先你应该准备 JavaMail APIJava Activation Framework 。 得到两个jar包: 1.mail.jar 2.activation.jar JavaMail 是sun公司(现以被甲骨文收购)为方便Java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,如前面所讲的SMTP,POP3,IMAP,还有MIME等。我们在使用JavaMail API 编写邮件时,无须考虑邮件的底层实现细节,只要调用JavaMail 开发包中相应的API类就可以了。

我们可以先尝试发送一封简单的邮件,确保电脑可以连接网络。

  • 创建包含邮件服务器的网络连接信息的Session对象。
  • 创建代表邮件内容的Message对象
  • 创建Transport对象,连接服务器
  • 发送Message
  • 关闭连接

2、java实现邮件简单发送

解析以下简单邮件发送的7个固定步骤,如果你要使用,直接复制粘贴代码,并将你的邮箱+授权码填进去就可以用了

1、准备一些参数

    Properties prop = new Properties();prop.setProperty("mail.host", "smtp.qq.com");  //设置QQ邮件服务器prop.setProperty("mail.transport.protocol", "smtp"); // 邮件发送协议prop.setProperty("mail.smtp.auth", "true"); // 需要验证用户名密码// 关于QQ邮箱,还要设置SSL加密,加上以下代码即可MailSSLSocketFactory sf = new MailSSLSocketFactory();sf.setTrustAllHosts(true);prop.put("mail.smtp.ssl.enable", "true");prop.put("mail.smtp.ssl.socketFactory", sf);

2、获取session对象

   //1、创建定义整个应用程序所需的环境信息的 Session 对象// 使用QQ邮箱的时候才需要,其他邮箱不需要这一段代码Session session = Session.getDefaultInstance(prop, new Authenticator() {//获取和SMTP服务器的连接对象public PasswordAuthentication getPasswordAuthentication() {//发件人邮件用户名、授权码return new PasswordAuthentication("XXXX@qq.com", "授权码");}});//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态session.setDebug(true);//不开DEBUG我们在控制台就看不到它是怎么发送的邮件,只能等着程序结束再去邮箱中查看是不是收到了邮件

3、获取传输对象

  //2、通过session得到transport对象Transport ts = session.getTransport();//通过这一次和SMTP服务器的连接对象获取发送邮件的传输对象

4、登陆授权

  //3、使用邮箱的用户名和授权码连上SMTP邮件服务器,即登陆ts.connect("smtp.qq.com", "XXXX@qq.com", "授权码");

5、写邮件

 //4、创建邮件对象MimeMessage——点击网页上的写信//创建一个邮件对象MimeMessage message = new MimeMessage(session);//指明邮件的发件人——在网页上填写发件人message.setFrom(new InternetAddress("XXXX@qq.com"));//设置发件人//指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发——在网页上填写收件人message.setRecipient(Message.RecipientType.TO, new InternetAddress("XXXX@qq.com"));//设置收件人//邮件的标题——在网页上填写邮件标题message.setSubject("简单邮件发送实现");//设置邮件主题//邮件的文本内容——在网页上填写邮件内容message.setContent("<h2 style='color:red'>你好啊!</h2>", "text/html;charset=UTF-8");//设置邮件的具体内容

6、发送邮件

  //5、发送邮件——在网页上点击发送按钮ts.sendMessage(message, message.getAllRecipients());

7、关闭服务器资源

    //6、关闭连接对象,即关闭程序中打开的连接资源ts.close();

实现向自己邮箱发送邮件的功能代码:

public class MailDemo01 {public static void main(String[] args) throws Exception {Properties prop = new Properties();prop.setProperty("mail.host", "smtp.qq.com");  //设置QQ邮件服务器prop.setProperty("mail.transport.protocol", "smtp"); // 邮件发送协议prop.setProperty("mail.smtp.auth", "true"); // 需要验证用户名密码// 关于QQ邮箱,还要设置SSL加密,加上以下代码即可MailSSLSocketFactory sf = new MailSSLSocketFactory();sf.setTrustAllHosts(true);prop.put("mail.smtp.ssl.enable", "true");prop.put("mail.smtp.ssl.socketFactory", sf);//  1.创建session对象//使用QQ邮箱的时候才需要,其他邮箱不需要这一段代码Session session = Session.getDefaultInstance(prop, new Authenticator() {//获取和SMTP服务器的连接对象public PasswordAuthentication getPasswordAuthentication() {//发件人邮件用户名、授权码// mtxsmbxgflekebhb// pzsctkyklfnxebfereturn new PasswordAuthentication("2277644734@qq.com", "mtxsmbxgflekebhb");}});// 开启Session的debug模式,这样就可以查看到程序发送Email的运行状态session.setDebug(true);//  2.创建Transport对象//  通过这一次和SMTP服务器的连接对象获取发送邮件的传输对象Transport ts = session.getTransport();//  3.使用邮箱的用户名和授权码连上邮件服务器ts.connect("smtp.qq.com","2277644734@qq.com","mtxsmbxgflekebhb");//  4.创建一个Message对象(需要传递session)MimeMessage message = new MimeMessage(session);//  指明邮件的发件人——在网页上填写发件人message.setFrom(new InternetAddress("2277644734@qq.com")); // 设置发送人//  指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发——在网页上填写收件人message.setRecipient(Message.RecipientType.TO, new InternetAddress ("2277644734@qq.com")); // 设置收件人//  邮件的标题——在网页上填写邮件标题message.setSubject("简单的邮件发送测试");//  邮件的文本内容——在网页上填写邮件内容message.setContent("<h2 style='color:red'> 恭喜你啦!</h2>","text/html;charset=UTF-8");//  5.发送邮件ts.sendMessage(message,message.getAllRecipients());//  6.关闭连接ts.close();}
}

3、复杂邮件的发送

复杂邮件就是非纯文本的邮件,可能还包含了图片和附件等资源

先认识两个类一个名词:

MIME(多用途互联网邮件扩展类型)

  • MimeBodyPart类

javax.mail.internet.MimeBodyPart类表示的是一个MIME消息,它和MimeMessage类一样都是从Part接口继承过来。即一个MIME消息对应一个MimeBodyPart对象,而MimeBodyPart对象就是我们写的邮件内容中的元素

  • MimeMultipart类

javax.mail.internet.MimeMultipart是抽象类 Multipart的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象。即一个MimeMultipart对象表示多个MimeBodyPart的集合,而一个MimeMultipart表示的就是我们一封邮件的内容
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YhcZKhGA-1607266159332)(JavaWeb.assets/1747479-20200909180657427-1563537314.png)]

MimeMultipart对象的使用的时候需要设置setSubType()的属性值,一共就下面3种取值

  • alternative:表明这个MimeMultipart对象中的MimeMessage对象的数据是纯文本文件
  • related:表明这个MimeMultipart对象中的MimeMessage对象的数据包含非纯文本文件
  • mixed:表明这个MimeMultipart对象中的MimeMessage对象的数据包含附件

相较于简单邮件,复杂邮件变化的地方只是在于邮件内容本身会发送变化,而其他的步骤都是一样的

1、准备一些参数
2、获取session对象
3、获取传输对象
4、登陆授权
5、写邮件 (和简单邮件相区别)
6、发送邮件
7、关闭服务器资源

复杂邮件和简单邮件的区别的地方:


//图片
MimeBodyPart body1 = new MimeBodyPart();
body1.setDataHandler(new DataHandler(new FileDataSource("图片的绝对地址")));
body1.setContentID("yhbxb.png"); //图片设置ID//文本
MimeBodyPart body2 = new MimeBodyPart();
body2.setContent("请注意,我不是广告<img src='cid:yhbxb.png'>","text/html;charset=utf-8");//附件MimeBodyPart body3 = new MimeBodyPart();body3.setDataHandler(new DataHandler(new FileDataSource("附件1的绝对地址")));body3.setFileName("test.c"); //附件设置名字MimeBodyPart body4 = new MimeBodyPart();body4.setDataHandler(new DataHandler(new FileDataSource("附件2的绝对地址")));body4.setFileName("test.txt"); //附件设置名字//拼装邮件正文内容MimeMultipart multipart1 = new MimeMultipart();multipart1.addBodyPart(body1);multipart1.addBodyPart(body2);multipart1.setSubType("related"); //1.文本和图片内嵌成功!//new MimeBodyPart().setContent(multipart1); //将拼装好的正文内容设置为主体MimeBodyPart contentText =  new MimeBodyPart();contentText.setContent(multipart1);//拼接附件MimeMultipart allFile =new MimeMultipart();allFile.addBodyPart(body3); //附件allFile.addBodyPart(body4); //附件allFile.addBodyPart(contentText);//正文allFile.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为mixed;//设置到消息中,保存修改message.setContent(allFile);//将MimeMultipart放入消息对象中message.saveChanges();//保存上面的修改

用java实现邮件发送相关推荐

  1. Java Mail 邮件发送(一):入门Demo

    本文首发于简书,Java Mail 邮件发送(一):Demo 上周公司的项目要求开发邮件发送功能.自己在网上跟着教程边学边做了一下午,现在基本开发完成了.由于一个同事也想看下该怎么写,顺便学习下.所以 ...

  2. 用java实现邮件发送验证码

    java实现邮件发送验证码 网易邮箱开通POP3SMTP服务的步骤 java实现邮件发送验证码 建议不要用qq邮箱,我使用qq邮箱直接一直给我报530错误,我一直认为我代码写的有错误或者POP3/SM ...

  3. java实现邮件发送, 抄送及多附件发送

    java实现邮件发送, 抄送及多附件发送 所需的jar包  mailapi.jar和smtp.jar  或  javax-mail-xxx.jar(如javax.mail-1.5.6.jar)  ht ...

  4. [Java工具] 邮件发送工具

    注册邮箱 去163邮箱(或其他邮箱)注册一个邮箱,并开启SMTP授权码. 程序 需要注意的是,由于阿里云服务器不让使用默认的25端口,所以会出现Windows下测试发送邮件成功,Linux服务器下发送 ...

  5. 【Java EE 学习 21 下】【使用java实现邮件发送、邮件验证】

    一.邮件发送 1.邮件发送使用SMTP协议或者IMAP协议,这里使用SMTP协议演示. SMTP协议使用的端口号:25 rfc821详细记载了该协议的相关信息 (1)使用telnet发送邮件(使用12 ...

  6. java实现邮件发送_基于JavaMail的Java实现简单邮件发送功能

    电子邮件的应用非常广泛,例如在某网站注册了一个账户,自动发送一封欢迎邮件,通过邮件找回密码,自动批量发送活动信息等.但这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送.本 ...

  7. Java实现邮件发送 超详细!!!(以QQ邮箱个人版和企业版为例)

    Java实现发送邮件 超详细!!!(以QQ邮箱个人版和企业版为例) 文章目录 Java实现发送邮件 超详细!!!(以QQ邮箱个人版和企业版为例) 个人邮箱示例 配置依赖 简单了解涉及的两个传输协议 Q ...

  8. java实现邮件发送共鞥_Java实现复杂邮件发送功能(基于JavaMail)的实例

    这篇文章主要为大家详细介绍了基于JavaMail的Java实现复杂邮件发送功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 上一篇文章 基于 JavaMail 的 Java 邮件发送:简单邮件发 ...

  9. java 异步邮件发送_java异步发送邮件

    其中textTemplate和textTemplate2是spring注入的. package com.ucenter.service; import java.util.concurrent.Exe ...

最新文章

  1. c++ 取成员函数地址_c及c++指针及引用简单解释(自学学习心得)
  2. Server.MapPath(path)的使用
  3. java结果集分页太慢_巨大结果集的分页错误
  4. 【深度学习】利用CNN来检测伪造图像
  5. 【软件设计师】2020-08-07
  6. mysql 虚拟列索引_使用MySQL 5.7虚拟列提高查询效率
  7. Image Control
  8. 两点(51Nod-1416)
  9. vue怎么注释html代码,vue文件中如何注释?
  10. linux就该这么学第八课
  11. linux开关机日志文件,Linux开关机命令(shutdown,reboot,halt,init)
  12. 结队编程思路及感悟(python、tkinter、mysql、腾讯云短信等)
  13. 自动驾驶1-1 欢迎来到自动驾驶汽车专业 Welcome to the Self-Driving Cars Specialization
  14. web前端作业-模拟网页CSS
  15. TTT培训,关于培训师的培训
  16. 笔记本开热点后断网问题
  17. 微信小程序-编辑器插件
  18. html页面如何获取已经存在的token,移动端通过携带token访问html页面
  19. 钉钉小程序的开发入门【亲自调试】
  20. java中的接口是什么?

热门文章

  1. maven shade 插件的小插曲
  2. keil MDK5.24打开MDK5.15及以前STM32工程报错Error #545:Required gpdsc file 'FrameworkCubeMX.gpdsc' is missing
  3. PP.io的三个阶段,“强中心”——“弱中心”——“去中心”
  4. node restify框架使用openai(chatgpt)接口
  5. 学习VM上运行dnf(整理)
  6. 自动驾驶汽车为什么需要高精度定位?干货都在这里
  7. vue实现通讯录功能
  8. java中ioc作用_Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例?
  9. 大闸蟹的 O O 第三单元日子——中测与强测的惨烈修罗场
  10. Bilibili的元宇宙布局