IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 圣诞节要不要用Java发个邮件 -> 正文阅读

[Java知识库]圣诞节要不要用Java发个邮件

🤞🤞🤞🤞🤞祝愿所有考研的全部上岸🤞🤞🤞🤞🤞

前言

邮件发送是很多网站在注册的时候会使用的一个功能,可以用于用户验证,或者发送用户的一些总结数据。今天就来看一下Java是如何实现邮件发送的。

今天通过两种方式实现,一是普通的Java工程发送邮件,二是在Spring工程中实现发送邮件。

如果你只想了解SpringBoot中的邮件发送,可直接通过目录跳转到SpringBoot邮件发送处

邮件发送作为很多网站都在用功能,其也是想当重要但没有必要进行详细研究。本文代码可直接在项目中使用。

普通Java工程实现邮件发送

Java发送Email十分的简单,但是首先你应该准备JavaMail API和Java Activation Framework。

  • mail.jar
  • activation.jar

JavaMail是Sun公司为方便Java开发人人员方便在应用程序中实现邮件发送接收功能而提供的一套标准的开发包,它支持一些常用的邮件协议,如前面所讲的SMTP/POP3/IMAP还有MME等,我们在使用JavaMail API编写邮件时,无须考虑邮件的底层细节,只要调用JavaMail开发包响应的API类就可以了。

我们在发送邮件前先登录自己的邮箱打开设置,找到账户设置然后开启一下服务。(这里我使用的为qq邮箱,其他邮箱操作类似)
在这里插入图片描述
我们先尝试发送一封简单的邮件。

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

邮箱发送主要又四个核心类,我们在编写程序的时候,记住这四个核心类,就很容易编写处Java的邮件处理程序。
在这里插入图片描述
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

它是一个互联网标准,扩展了电子邮件标准,使其能够支持:
非ASCII字符文本;非文本格式附件(二进制、声音、图像等);由多部分(multiple parts)组成的消息体;包含非ASCII字符的头信息(Header information)

发送简单的邮件

package com.zhao.email;

import com.sun.mail.util.MailSSLSocketFactory;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.GeneralSecurityException;
import java.util.Properties;

/**简单邮件:没有附件和图片,纯文本文件
 * 复杂邮件:由附件和图片
 *
 * 要发发送邮件,需要获得协议和支持!开启服务POP3/SMTP协议
 * qfivbyiwuwcvgefh
 *
 * @Author Zhao
 * @Date 2021-06-17 19:32
 * @Version 1.0
 */
public class EasyEmail {
    public static void main(String[] args) throws Exception {
        Properties properties = new Properties();
        //设置QQ邮箱服务器
        properties.setProperty("mail.host","smtp.qq.com");
        //邮箱发送协议
        properties.setProperty("mail.transport.protocol","smtp");
        //需要验证用户名密码
        properties.setProperty("mail.smtp.auth","true");

        //关于QQ邮箱,还要设置SSL加密,加上以下代码即可,大厂,其他邮箱不需要
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        properties.put("mail.smtp.ssl.enable","true");
        properties.put("mail.smtp.ssl.socketFactory",sf);

        //使用JavaMail发送邮件的五个步骤


        //1、创建定义整个应用程序所需要的环境信息session对象
        //QQ邮箱才有,其他邮箱用不到。
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //发件人邮箱用户名、授权码
                return new PasswordAuthentication("1360970604@qq.com", "qfivbyiwuwcvgefh");
            }
        });
        //开启Session的debug模式,这样可以查看到程序发送Email的运行状态
        session.setDebug(true);
        //2、通过session得到transport对象
        Transport ts = session.getTransport();
        //3、使用邮箱的用户名和授权码连上邮箱服务器
        ts.connect("smtp.qq.com","1360970604@qq.com","qfivbyiwuwcvgefh");
        //4、创建邮件:写邮件
        MimeMessage mimeMessage = new MimeMessage(session);
        //指明邮件的发件人
        mimeMessage.setFrom(new InternetAddress("1360970604@qq.com"));
        //指明邮件的收件人,现在发件人和收件人是一样的,那就是自己个自己发
        mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("zhaoshiji2020@163.com"));

        mimeMessage.setSubject("这只是含文本的简单邮件");//设置邮件的主题
        //邮件文本内容
        mimeMessage.setContent("你好啊!","text/html;charset=utf-8");

        //5、发送邮件
        ts.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
        //关闭连接
        ts.close();
    }
}

注意:发件人这里设置自己的邮箱信息。return new PasswordAuthentication("1360970604@qq.com", "qfivbyiwuwcvgefh");第一个参数为自己的邮箱,第二个参数为授权码,需要在自己邮箱设置-》账户中获取。就是图中圈起来的地方。
在这里插入图片描述

发送复杂的邮件

复杂的邮件就是说邮件内容可以包含,图片和附件。这里我们需要先了解一个名词。
MIME(多用途互联网邮件扩展类型)
然后我们在来了解一下两个类:

  • MimeBodyPart
    javax.mail.internet.MimebodyPart类表示的是一个MIME消息,他和MimeMessage类一样都是从Part接口继承过来的。

  • MimeMultipart
    Javax.mail.internet.MimeMultipart是抽象类Multipart的实现子类,它用来组合多个MIME,一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象。

在这里插入图片描述

package com.zhao.email;

import com.sun.mail.util.MailSSLSocketFactory;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.FileInputStream;
import java.util.Properties;

/**
 * @Author Zhao
 * @Date 2021-06-17 20:47
 * @Version 1.0
 */
public class ComplexEmail {
    public static void main(String[] args) throws Exception{
//        System.out.println(Class.class.getResource("/").getPath());

        Properties properties = new Properties();
        //设置QQ邮箱服务器
        properties.setProperty("mail.host","smtp.qq.com");
        //邮箱发送协议
        properties.setProperty("mail.transport.protocol","smtp");
        //需要验证用户名密码
        properties.setProperty("mail.smtp.auth","true");

        //关于QQ邮箱,还要设置SSL加密,加上以下代码即可,大厂,其他邮箱不需要
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        properties.put("mail.smtp.ssl.enable","true");
        properties.put("mail.smtp.ssl.socketFactory",sf);

        //使用JavaMail发送邮件的五个步骤


        //1、创建定义整个应用程序所需要的环境信息session对象
        //QQ邮箱才有,其他邮箱用不到。
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //发件人邮箱用户名、授权码
                return new PasswordAuthentication("1360970604@qq.com", "qfivbyiwuwcvgefh");
            }
        });
        //开启Session的debug模式,这样可以查看到程序发送Email的运行状态
        session.setDebug(true);
        //2、通过session得到transport对象
        Transport ts = session.getTransport();
        //3、使用邮箱的用户名和授权码连上邮箱服务器
        ts.connect("smtp.qq.com","1360970604@qq.com","qfivbyiwuwcvgefh");
        //4、创建邮件:写邮件
        MimeMessage mimeMessage = new MimeMessage(session);
        //指明邮件的发件人
        mimeMessage.setFrom(new InternetAddress("1360970604@qq.com"));
        //指明邮件的收件人,现在发件人和收件人是一样的,那就是自己个自己发
        mimeMessage.setRecipients(Message.RecipientType.TO,new Address[]{new InternetAddress("zhaoshiji2020@163.com"),
        new InternetAddress("wangzhenleiya@163.com"),
        new InternetAddress("2572284725@qq.com"),
        new InternetAddress("1732479783@qq.com"),
        new InternetAddress("1505874684@qq.com"),
        new InternetAddress("1689655897@qq.com"),
        });

        mimeMessage.setSubject("通知");//设置邮件的主题
        //邮件文本内容
       //=================================================

        //准备图片数据
        MimeBodyPart image = new MimeBodyPart();
        //图片需要经过数据处理 ,DataHandler数据处理
        DataHandler dataHandler = new DataHandler(new FileDataSource("EmailWeb/src/main/resources/b.jpg"));
        image.setDataHandler(dataHandler);//在我们的Body中放入这个处理的图片数据
        image.setContentID("b.jpg");//给图片设置一个ID,我们在后面可以使用

        //准备正文数据
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("<h1>邮件发送!</h1><br/><img src='cid:b.jpg'/>","text/html;charset=utf-8");

        //描述数据关系
        MimeMultipart mm = new MimeMultipart();
        mm.addBodyPart(text);
        mm.addBodyPart(image);
        mm.setSubType("related");


        //============添加附件的操作

        MimeBodyPart context = new MimeBodyPart();
        context.setContent(mm);

        MimeBodyPart body1 = new MimeBodyPart();
        FileDataSource fileDataSource = new FileDataSource("EmailWeb/src/main/resources/302通知.txt");

        DataHandler dataHandler1 = new DataHandler(fileDataSource);
        body1.setDataHandler(dataHandler1);
        String s = MimeUtility.encodeText(fileDataSource.getName());
        body1.setFileName(s);//设置附件名称

        MimeMultipart mimeMultipart = new MimeMultipart();
        mimeMultipart.addBodyPart(context);
        mimeMultipart.addBodyPart(body1);
        mimeMultipart.setSubType("mixed");


        //设置数据关系,保存修改
        mimeMessage.setContent(mimeMultipart);//把最后编辑好的邮件放到消息当中。
        mimeMessage.saveChanges();//保存修改
        //=================================================

        //5、发送邮件
        ts.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
        //关闭连接
        ts.close();
    }
}

注意:这里也是同理,把邮箱和授权码换成自己的。支持多人发送。

SpringBoot中实现邮件发送

普通的Java工程实现邮件发送,太过于麻烦和繁琐。但是我们目前都是直接使用Springboot进行开发,所以Springboot的邮件发送是我们长使用的。下面我们就聊一聊如何在SpringBoot中实现邮件发送。
先了解一下邮件发送的流程:
在这里插入图片描述
SpringBoot发送邮件的流程:

  • 邮件发送需要引入spring-boot-starter-mail
  • Spring Boot 自动配置MailSenderAutoConfiguration
  • 定义MailProperties内容,配置在application.yml中
  • 自动装配JavaMailSender
  • 测试邮件发送

首先我们先准备依赖:

<!--导入邮件启动器-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

在配置文件中配置信息:

#hijbxlwrerfbfjdi
spring.mail.host=smtp.qq.com
spring.mail.username=1360970604@qq.com
spring.mail.password=hijbxlwrerfbfjdi
#开启加密验证 //只有qq邮箱需要
spring.mail.properties.mail.smtp.ssl.enable=true

代码示例:

@SpringBootTest
class SpringBoot09TextApplicationTests {

    @Autowired
    JavaMailSenderImpl mailSender;

    @Test
    void contextLoads() {
        SimpleMailMessage mailMessage = new SimpleMailMessage();
        mailMessage.setSubject("Hello");
        mailMessage.setText("洛必达");

        mailMessage.setTo("779351771@qq.com");
        mailMessage.setFrom("1360970604@qq.com");
        mailSender.send(mailMessage);
    }

    @Test
    void test() throws MessagingException {

        //一个复杂邮件
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true,"utf-8");

        helper.setSubject("EDG牛逼");
        helper.setText("<p style='color:red;'>夹逼定义</p>",true);
        //附件
        helper.addAttachment("考研秘籍.chw",new File("F:\\桌面\\jQueryAPI_1.7.1_CN.chw"));
		//接收方 要发送的邮箱
        helper.setTo("1360970604@qq.com");
        //发送方
        helper.setFrom("1360970604@qq.com");
        mailSender.send(mimeMessage);
    }
}

这样就完成了在Springboot中邮件的发送。

优化策略

在发送邮件时需要一定的时间去执行,我们可以采用开启异步任务的方式来发送邮件。
我们利用SpringBoot提供的@Async注解就可以进行异步处理。在使用的时候需要在配置类或启动类上加上@EnableAsync注解开启异步任务。
使用方法:

@Async
public void Hello(){
    //xxxxx我们就可以在这里调用邮件发送的代码
    System.out.println("数据正在处理....");
}

这样即使邮件发送还未完成也不会影响后续程序的运行,也就是程序不会因为邮件发送过慢而发送阻塞。

注意事项

我们在测试的时候一定不要频繁发送邮件,可能会出现警告或者封号的问题!!!!

都看到这了,麻烦赏个赞🤞
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-26 22:00:25  更:2021-12-26 22:02:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 8:33:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码