Java实现邮件发送功能

目录

一、准备工作

 二、简易文本邮件发送的实现

2.1 步骤

2.2 代码 

三、复杂文件内容的发送

3.1 文件构成解析

 3.2 包含图片的发送

3.3 包含附件的发送

 四、实战

4.1 jsp动态页面

4.2 实体类POJO

4.3 Servlet

4.4 注册Servlet

4.5 发送邮箱核心类


一、准备工作

1、jar包支持:mail.jar和activation.jar

2、授权码的获取

 二、简易文本邮件发送的实现

2.1 步骤

1、创建Session对象

2、创建Transport对象

3、使用邮箱的用户名和授权码连上邮箱服务器

4、创建一个Message对象(需要传递session)

        message需要指明发件人、收件人以及文件内容

5、发送邮件

6、关闭连接

2.2 代码 

import com.sun.mail.util.MailSSLSocketFactory;import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;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);//使用javaMail发送邮件的5个步骤//1.创建定义整个应用程序所需要的环境信息的session对象Session session=Session.getDefaultInstance(prop, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication("XXXX@qq.com","授权码");}});//开启session的debug模式,这样可以查看到程序发送Email的运行状态session.setDebug(true);//2.通过session得到transport对象Transport ts=session.getTransport();//3.使用邮箱的用户名和授权码连上邮件服务器ts.connect("smtp.qq.com","XXXX@qq.com","授权码");//4.创建邮件:写文件//注意需要传递sessionMimeMessage 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("内容","text/html;charset=UTF-8");//5.发送邮件ts.sendMessage(message,message.getAllRecipients());//6.关闭连接ts.close();}
}

三、复杂文件内容的发送

3.1 文件构成解析

每一个文本、图片、附件可以分为一个MimeBodyPart,最后由MimeMultipart完成组装

 

 3.2 包含图片的发送

import com.sun.mail.util.MailSSLSocketFactory;import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Properties;public class MailDemo02 {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);//使用javaMail发送邮件的5个步骤//1.创建定义整个应用程序所需要的环境信息的session对象Session session=Session.getDefaultInstance(prop, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication("11927XXX@qq.com","授权码");}});//开启session的debug模式,这样可以查看到程序发送Email的运行状态session.setDebug(true);//2.通过session得到transport对象Transport ts=session.getTransport();//3.使用邮箱的用户名和授权码连上邮件服务器ts.connect("smtp.qq.com","11927XXX@qq.com","授权码");//4.创建邮件:写文件//注意需要传递sessionMimeMessage message=new MimeMessage(session);//指明邮件的发件人message.setFrom(new InternetAddress("11927XXX@qq.com"));//指明邮件的收件人message.setRecipient(Message.RecipientType.TO,new InternetAddress("11927XXX@qq.com"));//邮件标题message.setSubject("java发出");//邮件的文本内容//=================================准备图片数据=======================================MimeBodyPart image=new MimeBodyPart();//图片需要经过数据化的处理DataHandler dh=new DataHandler(new FileDataSource("D:\\Bert\\1594126632(1).jpg"));//在part中放入这个处理过图片的数据image.setDataHandler(dh);//给这个part设置一个ID名字image.setContentID("bz.jpg");//准备正文的数据MimeBodyPart text=new MimeBodyPart();text.setContent("这是一张正文<img src='cid:bz.jpg'>","text/html;charset=UTF-8");//描述数据关系MimeMultipart mm=new MimeMultipart();mm.addBodyPart(text);mm.addBodyPart(image);mm.setSubType("related");//设置到消息中,保存修改message.setContent(mm);message.saveChanges();//5.发送邮件ts.sendMessage(message,message.getAllRecipients());//6.关闭连接ts.close();}
}

3.3 包含附件的发送

import com.sun.mail.util.MailSSLSocketFactory;import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;public class MailDemo03 {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);//使用javaMail发送邮件的5个步骤//1.创建定义整个应用程序所需要的环境信息的session对象Session session=Session.getDefaultInstance(prop, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication("1192XXXX@qq.com","授权码");}});//开启session的debug模式,这样可以查看到程序发送Email的运行状态session.setDebug(true);//2.通过session得到transport对象Transport ts=session.getTransport();//3.使用邮箱的用户名和授权码连上邮件服务器ts.connect("smtp.qq.com","1192XXXX@qq.com","授权码");//4.创建邮件:写文件//注意需要传递sessionMimeMessage message=new MimeMessage(session);//指明邮件的发件人message.setFrom(new InternetAddress("1192XXXX@qq.com"));//指明邮件的收件人message.setRecipient(Message.RecipientType.TO,new InternetAddress("1192XXXX@qq.com"));//邮件标题message.setSubject("java发出");//邮件的文本内容//=================================准备图片数据MimeBodyPart image=new MimeBodyPart();//图片需要经过数据化的处理DataHandler dh=new DataHandler(new FileDataSource("D:\\Bert\\1594126632(1).jpg"));//在part中放入这个处理过图片的数据image.setDataHandler(dh);//给这个part设置一个ID名字image.setContentID("bz.jpg");//=================================准备正文数据MimeBodyPart text=new MimeBodyPart();text.setContent("这是一张正文<img src='cid:bz.jpg'>","text/html;charset=UTF-8");//=================================准备附件数据MimeBodyPart body1= new MimeBodyPart();body1.setDataHandler(new DataHandler(new FileDataSource("D:\\Bert\\cmd.txt")));body1.setFileName("1.txt");//描述数据关系MimeMultipart mm=new MimeMultipart();mm.addBodyPart(body1);mm.addBodyPart(text);mm.addBodyPart(image);mm.setSubType("mixed");//设置到消息中,保存修改message.setContent(mm);message.saveChanges();//5.发送邮件ts.sendMessage(message,message.getAllRecipients());//6.关闭连接ts.close();}
}

 四、实战

4.1 jsp动态页面

index.jsp

<html>
<body>
<h2>Hello World!</h2>
<form action="${pageContext.request.contextPath}/RegisterServlet.do" method="post">用户名:<input type="text" name="username">密码:<input type="text" name="pwd">邮箱:<input type="text" name="email"><input type="submit" value="注册"></form>
</body>
</html>

4.2 实体类POJO

public class User {private String username;private String password;private String email;public User() {}public User(String username, String password, String email) {this.username = username;this.password = password;this.email = email;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +", email='" + email + '\'' +'}';}
}

4.3 Servlet

import cn.csn.MailDemo01.pojo.User;
import cn.csn.MailDemo01.utils.Sendmail;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class RegisterServlet extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username=req.getParameter("username");String password=req.getParameter("pwd");String email=req.getParameter("email");User user=new User(username,password,email);Sendmail send=new Sendmail(user);send.start();System.out.println("success");}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}
}

4.4 注册Servlet

绑定路径

<servlet><servlet-name>RegisterServlet</servlet-name><servlet-class>cn.csn.MailDemo01.servlet.RegisterServlet</servlet-class></servlet><servlet-mapping><servlet-name>RegisterServlet</servlet-name><url-pattern>/RegisterServlet.do</url-pattern></servlet-mapping>

4.5 发送邮箱核心类

可放在utils目录下

import cn.csn.MailDemo01.pojo.User;
import com.sun.mail.util.MailSSLSocketFactory;import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;public class Sendmail extends Thread {private String from="XXX@qq.com";private String host="smtp.qq.com";private User user;public Sendmail(User user){this.user=user;}@Overridepublic void run() {try {Properties prop=new Properties();prop.setProperty("mail.host",host);///设置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);//使用javaMail发送邮件的5个步骤//1.创建定义整个应用程序所需要的环境信息的session对象Session session= Session.getDefaultInstance(prop, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(from,"授权码");}});//开启session的debug模式,这样可以查看到程序发送Email的运行状态session.setDebug(true);//2.通过session得到transport对象Transport ts=session.getTransport();//3.使用邮箱的用户名和授权码连上邮件服务器ts.connect(host,from,"授权码");//4.创建邮件:写文件//注意需要传递sessionMimeMessage message=new MimeMessage(session);//指明邮件的发件人message.setFrom(new InternetAddress(from));//指明邮件的收件人message.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getEmail()));//邮件标题message.setSubject("注册通知");//邮件的文本内容message.setContent("恭喜你("+user.getUsername()+")成功注册!"+"密码:"+user.getPassword(),"text/html;charset=UTF-8");//5.发送邮件ts.sendMessage(message,message.getAllRecipients());//6.关闭连接ts.close();}catch (Exception e){System.out.println(e);}}
}

 此处引入多线程的目的是提高用户的体验,防止因发送文件时间过长,导致前端响应过久。

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

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

相关文章

快速创建一个vue项目并运行

前期准备工作: 1.安装node 2.安装npm 3.设置淘宝镜像 4.全局安装webpack 5.webpack 4.X 开始&#xff0c;需要安装 webpack-cli 依赖 6.全局安装vue-cli 正文开始: 1.创建项目 ,回车 vue init webpack vue-svg > Project name vue-demo 项目名称 回车 > Pro…

harmonyOS next之实现时间打卡定时器

需求&#xff1a;实现一个时间打卡签到按钮。 实现方法&#xff1a;每隔一秒钟获取一下当前时间。 实现代码如下&#xff1a; Column(){Text(this.curTime).fontColor(#FFFFFF).fontWeight(600).fontSize(32vp)Text(上班打卡).fontColor(#FFFFFF) } .width(170vp) .height(170…

⭐️苹果电脑安装windows10双系统【详细图文步骤保姆级教程】【本教材适用于MAC台式机、笔记本MacBook air和pro】

苹果电脑安装windows10双系统【详细图文步骤保姆级教程】【本教材适用于MAC台式机、笔记本MacBook air和pro】 苹果电脑安装windows10双系统一、准备工作准备项1&#xff1a;U盘作为系统安装盘准备项2&#xff1a;您需要安装的系统镜像 二、启动转换助理步骤1&#xff1a;找到启…

【CSS in Depth 2 精译_050】7.3 CSS 响应式设计中的流式布局原则(Fluid layout)

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第七章 响应式设计】&#xff08;概述&#xff09; 7.1 移动端优先设计原则&#xff08;上篇&#xff09; 7.1.1 创建移动端菜单&#xff08;下篇&#xff09;7.1.2 给视口添加 meta 标签&#xf…

Dockerfile样例

一、基础jar镜像制作 ## Dockerfile FROM registry.openanolis.cn/openanolis/anolisos:8.9 RUN mkdir /work ADD jdk17.tar.gz fonts.tar.gz /work/ RUN yum install fontconfig ttmkfdir -y && yum clean all && \chmod -R 755 /work/fonts ADD fonts.conf …

《Sui区块链:重塑去中心化应用的新星与未来潜力》

目录 引言 一、Sui 1、 技术架构 2、 编程语言 3、Move起源 4、Move的几个关键点&#xff1a; 5、Move 智能合约编程语言 6、智能合约编程语言可以做什么 7、和其他编程语言有什么不同 8、 安全性 9、开发者体验 10、生态系统 11、 未来发展 总结 引言 在区块链技…

vue后台管理系统从0到1(5)

文章目录 vue后台管理系统从0到1&#xff08;5&#xff09;完善侧边栏修改bug渲染header导航栏 vue后台管理系统从0到1&#xff08;5&#xff09; 接上一期&#xff0c;我们需要完善我们的侧边狼 完善侧边栏 我们在 element 组件中可以看见&#xff0c;这一个侧边栏是符合我们…

Linux驱动开发——platform平台总线

bus_type 一、主要作用 设备管理 bus_type负责管理连接在特定总线上的设备。它维护一个设备链表&#xff0c;其中包含了所有注册到该总线上的设备。通过这个链表&#xff0c;内核可以方便地遍历和管理连接在该总线上的设备。例如&#xff0c;对于 PCI 总线&#xff0c;bus_typ…

无人机之视觉技术篇

一、视觉传感器的类型 摄像头&#xff1a; 最常见的视觉传感器&#xff0c;能够捕捉可见光图像和视频。 通过单目、双目或多目摄像头的组合&#xff0c;无人机能够实现立体视觉&#xff0c;从而估算距离、深度&#xff0c;并进行物体识别和追踪。 红外传感器&#xff1a; …

【汇编语言】寄存器(内存访问)(七)—— CPU提供的栈机制

文章目录 前言1. CPU提供的栈机制2. push指令3. 问题4. 问题的分析与解答5. pop指令结语 前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构、操作系统、微机原理&#xff09;的重要基础。但仅仅从课程的角度出发就太片面了&#xff0c;其实学习汇编语言可以深…

基于Java的茶叶商城设计与实现(源码+定制+开发)茶叶电商系统开发、茶叶电商平台开发、茶叶在线销售平台设计与开发

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

英伟达开源最新大模型Nemotron 70B后,只有OpenAI o1一个对手了

来源 | 机器之心 今天&#xff0c;英伟达又开源了一个性能超级强大的模型 —— Llama-3.1-Nemotron-70B-Instruct&#xff0c;它击败了 OpenAI 的 GPT-4o 和 Anthropic 的 Claude-3.5 Sonnet 等多个开闭源模型。 从命名来看&#xff0c;显然 Llama-3.1-Nemotron-70B-Instruct …

MySQL-15.DQL-排序查询

一.DQL-排序查询 -- 排序查询 -- 1.根据入职时间&#xff0c;对员工进行升序排序 select * from tb_emp order by entrydate asc ;-- 2.根据入职时间&#xff0c;对员工进行降序排序 select * from tb_emp order by entrydate desc ;-- 3.根据 入职时间 对公司员工进行 升序排序…

scala 高阶函数(2)上

学习目录 一.reduce reduce的含义 idea实例 二.reduceLeft-reduceRight reduceLeft-reduceRight的含义 idea实例 练习&#xff1a;求最值

word建立目录以及修改页码

1、为word建立新的目录 &#xff08;1&#xff09;选中word中的标题设置为第几级标题&#xff0c;将所有的标题均设置完成。最后可以鼠标右击标题&#xff0c;对不同的标题字体大小等进行设置。右击-->修改-->格式-->段落 &#xff08;2&#xff09;在word中插入新的…

【多模态大模型】 端侧多模态模型 Qwen2-VL-2B-Instruct

【多模态大模型】 端侧多模态模型 Qwen2-VL-2B-Instruct Qwen2-VL-2B-Instruct 模型介绍模型测评运行环境安装运行模型Image Resolution for performance boosttwo methods for fine-grained control over the image size input to the model: 下载开源协议参考 Qwen2-VL-2B-In…

专题十二_floodfill(洪水灌溉)算法_算法专题详细总结

目录 1. 图像渲染&#xff08;medium&#xff09; 解析&#xff1a; 函数头&#xff1a; 函数体&#xff1a;固定模板 设置全局变量&#xff1a; 总结&#xff1a; 2. 岛屿数量&#xff08;medium&#xff09; 解析&#xff1a; 注意&#xff1a; 总结&#xff1a; …

利用由 Search AI 提供支持的自动导入功能加速 Elastic Observability 中的日志分析

作者&#xff1a;来自 Elastic Bahubali Shetti 通过自动化自定义数据集成&#xff0c;以创纪录的速度将日志迁移到 AI 驱动的日志分析。 Elastic 正在通过自动提取自定义日志来加速采用 AI 驱动的日志分析&#xff08;AI-driven log analytics&#xff09;&#xff0c;随着基…

时间序列预测(六)——循环神经网络(RNN)

目录 一、RNN的基本原理 1、正向传播&#xff08;Forward Pass&#xff09;&#xff1a; 2、计算损失&#xff08;Loss Calculation&#xff09; 3、反向传播——反向传播通过时间&#xff08;Backpropagation Through Time&#xff0c;BPTT&#xff09; 4、梯度更新&…

Flink时间语义和时间窗口

前言 在实际的流计算业务场景中&#xff0c;我们会发现&#xff0c;数据和数据的计算往往都和时间具有相关性。 举几个例子&#xff1a; 直播间右上角通常会显示观看直播的人数&#xff0c;并且这个数字每隔一段时间就会更新一次&#xff0c;比如10秒。电商平台的商品列表&a…