JavaMail实现带附件的邮件发送
作者:枫眠cc 发布时间:2021-10-21 15:00:09
本文实例为大家分享了JavaMail实现带附件的邮件发送的具体代码,供大家参考,具体内容如下
发送纯文本的邮件
package com.haiwen.test;
import java.util.Date;
import java.util.Properties;
import javax.mail.Message.RecipientType;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import org.junit.Test;
public class MessageDemo1 {
@Test
public void testSend() throws Exception {
// 0. 邮件参数
Properties prop = new Properties();
prop.put("mail.transport.protocol", "smtp"); // 协议
prop.put("mail.smtp.host", "smtp.163.com"); // 主机
// prop.put("mail.smtp.port", 25); // 端口
prop.put("mail.smtp.auth", "true"); // 用户密码认证
prop.put("mail.debug", "true"); // 调试模式
// 1. 创建一个邮件的会话
Session session = Session.getDefaultInstance(prop);
// 2. 创建邮件体对象 (整封邮件对象)
MimeMessage message = new MimeMessage(session);
// 3. 设置邮件体参数:
// 3.1 标题
message.setSubject("我的第一封邮件");
// 3.2 邮件发送时间
message.setSentDate(new Date());
// 3.3 发件人
message.setSender(new InternetAddress("xxx@163.com"));
// 3.4 接收人
message.setRecipient(RecipientType.TO, new InternetAddress("xxx.com"));
// 3.5内容
message.setText("你好,已经发送成功! 正文...."); // 简单纯文本邮件
message.saveChanges(); // 保存邮件(可选)
// 4. 发送
Transport trans = session.getTransport();
trans.connect("xxx@163.com", "xxx");
// 发送邮件
trans.sendMessage(message, message.getAllRecipients());
trans.close();
}
}
MIME组合关系
multipart/mixed类型
如果一封邮件中含有附件,那邮件的Content-Type域中必须定义multipart/mixed类型,邮件通过multipart/mixed类型中定义的boundary标识将附件内容同邮件其它内容分成不同的段。
multipart/related类型
MIME邮件中除了可以携带各种附件外,还可以将其它内容以内嵌资源的方式存储在邮件中。比如我们在发送html格式的邮件内容时,可能使用图像作为html的背景,html文本会被存储在alternative段中,而作为背景的图像则会存储在multipart/related类型定义的段中。
multipart/alternative类型
MIME邮件可以传送超文本内容,但出于兼容性的考虑,一般在发送超文本格式内容的同时会同时发送一个纯文本内容的副本,如果邮件中同时存在纯文本和超文本内容,则邮件需要在Content-Type域中定义multipart/alternative类型,邮件通过其boundary中的分段标识将纯文本、超文本和邮件的其它内容分成不同的段。
邮件结构
JAF框架
JAF(JavaBeans Activation Framework,JavaBeans激活框架)是一个专用的数据处理框架,它用于封装数据,并为应用程序提供访问和操作数据的接口。
JAF的主要作用在于让Java应用程序知道如何对一个数据源进行查看、编辑和打印等操作。对于通过JAF封装的数据,应用程序通过JAF提供的接口可以完成如下功能:
访问数据源中的数据
获知数据源的数据类型
获知可对数据进行的各种操作
用户对数据执行某种操作时,自动创建执行该操作的软件部件的实例对象
JavaMail API可以利用JAF从某种数据源中读取数据和获知数据的MIME类型,并用这些数据生成MIME消息中的消息体和消息类型。
发送带文本、图片的邮件
package com.haiwen.test;
import java.io.File;
import java.util.Date;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Message.RecipientType;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import org.junit.Test;
public class MessageDemo2 {
// 初始化参数
private static Properties prop;
// 发件人
private static InternetAddress sendMan = null;
static {
prop = new Properties();
prop.put("mail.transport.protocol", "smtp"); // 协议
prop.put("mail.smtp.host", "smtp.163.com"); // 主机
// prop.put("mail.smtp.port", 25); // 端口
prop.put("mail.smtp.auth", "true"); // 用户密码认证
prop.put("mail.debug", "true"); // 调试模式
try {
sendMan = new InternetAddress("xxx@163.com");
} catch (AddressException e) {
throw new RuntimeException(e);
}
}
@Test
public void testSend() throws Exception {
// 1. 创建邮件会话
Session session = Session.getDefaultInstance(prop);
// 2. 创建邮件对象
MimeMessage message = new MimeMessage(session);
// 3. 设置参数:标题、发件人、收件人、发送时间、内容
message.setSubject("带图片邮件");
message.setSender(sendMan);
message.setRecipient(RecipientType.TO, new InternetAddress("xxx.com"));
message.setSentDate(new Date());
/*************** 设置邮件内容: 多功能用户邮件 (related) *******************/
// 4.1 构建一个多功能邮件块
MimeMultipart related = new MimeMultipart("related");
// 4.2 构建多功能邮件块内容 = 左侧文本 + 右侧图片资源
MimeBodyPart content = new MimeBodyPart();
MimeBodyPart resource = new MimeBodyPart();
// 设置具体内容: a.资源(图片)
String filePath = MessageDemo2.class.getResource("mm.png").getPath();
DataSource ds = new FileDataSource(new File(filePath));
//使用到了JAF框架把磁盘上的文件加到resource
DataHandler handler = new DataHandler(ds);
resource.setDataHandler(handler);
resource.setContentID("mm.png"); // 设置资源名称,给外键引用
// 设置具体内容: b.文本
content.setContent("<img src='cid:mm.png'/> 好哈哈!", "text/html;charset=UTF-8");
related.addBodyPart(content);
related.addBodyPart(resource);
/******* 4.3 把构建的复杂邮件快,添加到邮件中 ********/
message.setContent(related);
// 5. 发送
Transport trans = session.getTransport();
trans.connect("xxx@163.com", "xxx");
trans.sendMessage(message, message.getAllRecipients());
trans.close();
}
}
发送带文本、图片、附件的邮件
package com.haiwen.test;
import java.io.File;
import java.util.Date;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Message.RecipientType;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import org.junit.Test;
public class MessageDemo3 {
// 初始化参数
private static Properties prop;
// 发件人
private static InternetAddress sendMan = null;
static {
prop = new Properties();
prop.put("mail.transport.protocol", "smtp"); // 指定协议
prop.put("mail.smtp.host", "smtp.163.com"); // 主机 stmp.qq.com
// prop.put("mail.smtp.port", 25); // 端口
prop.put("mail.smtp.auth", "true"); // 用户密码认证
prop.put("mail.debug", "true"); // 调试模式
try {
sendMan = new InternetAddress("xxx@163.com");
} catch (AddressException e) {
throw new RuntimeException(e);
}
}
@Test
public void testSend() throws Exception {
// 1. 创建邮件会话
Session session = Session.getDefaultInstance(prop);
// 2. 创建邮件对象
MimeMessage message = new MimeMessage(session);
// 3. 设置参数:标题、发件人、收件人、发送时间、内容
message.setSubject("带图片邮件");
message.setSender(sendMan);
message.setRecipient(RecipientType.TO, new InternetAddress("xxx.com"));
message.setSentDate(new Date());
/*
* 带附件(图片)邮件开发
*/
// 构建一个总的邮件块
MimeMultipart mixed = new MimeMultipart("mixed");
// ---> 总邮件快,设置到邮件对象中
message.setContent(mixed);
// 左侧: (文本+图片资源)
MimeBodyPart left = new MimeBodyPart();
// 右侧: 附件
MimeBodyPart right = new MimeBodyPart();
// 设置到总邮件块
mixed.addBodyPart(left);
mixed.addBodyPart(right);
/****** 附件 ********/
String attr_path = this.getClass().getResource("a.docx").getPath();
DataSource attr_ds = new FileDataSource(new File(attr_path));
DataHandler attr_handler = new DataHandler(attr_ds);
right.setDataHandler(attr_handler);
right.setFileName("a.docx");
/*************** 设置邮件内容: 多功能用户邮件 (related) *******************/
// 4.1 构建一个多功能邮件块
MimeMultipart related = new MimeMultipart("related");
// ----> 设置到总邮件快的左侧中
left.setContent(related);
// 4.2 构建多功能邮件块内容 = 左侧文本 + 右侧图片资源
MimeBodyPart content = new MimeBodyPart();
MimeBodyPart resource = new MimeBodyPart();
// 设置具体内容: a.资源(图片)
String filePath = MessageDemo3.class.getResource("mm.png").getPath();
DataSource ds = new FileDataSource(new File(filePath));
DataHandler handler = new DataHandler(ds);
resource.setDataHandler(handler);
resource.setContentID("mm.png"); // 设置资源名称,给外键引用
// 设置具体内容: b.文本
content.setContent("<img src='cid:mm.png'/> 好哈哈!", "text/html;charset=UTF-8");
related.addBodyPart(content);
related.addBodyPart(resource);
// 5. 发送
Transport trans = session.getTransport();
trans.connect("xxx@163.com", "xxx");
trans.sendMessage(message, message.getAllRecipients());
trans.close();
}
}
来源:https://blog.csdn.net/lovecuidong/article/details/92658140
猜你喜欢
- 前言开发中,免不了会用到多边形、多角星等图案,比较常用的多边形比如雷达图、多角星比如评价星级的五角星等,本篇文章就使用Flutter绘制封装
- 前言我们一说到spring,可能第一个想到的是 IOC(控制反转) 和 AOP(面向切面编程)。没错,它们是spring的基石,得益于它们的
- 在Android Studio中对一个自己库进行生成操作时将会同时生成*.jar与*.aar文件。分别存储位置: &n
- 其实以前我对Java的Struts框架没有具体认识,通过这篇文章,真的让我了解了框架的用处,好处。下拉框在Web开发中经常会使用到,下面我们
- 走马灯是一种常见的效果,本文讲一下如何用 PageView 在 Flutter 里实现一个走马灯, 效果如下,当前页面的高度比其它页面高,切
- 概述在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。也就是说,程序的流程对运行结果有直接的影响。所以,我们必须清楚每条
- 更新了AS 3.1.2之后,发现新建Kotlin类,类注释依然木有,没办法只有自己动手了。方法很简单,编辑File Header就可以啦。只
- Java常用类库Math类Math包含用于执行基本数字运算的方法,例如基本指数,对数,平方根和三角函数一、Field SummaryModi
- JAVA中去掉空格 1. String.trim() trim()是去掉首尾空格 2.str
- 前言本文准确来讲是探讨如何用 Jackson 来序列化 Apache avro 对象,因为简单用 Jackson 来序列化 Apache a
- paras.xml文件<?xml version="1.0" encoding="UTF-8"
- 引言在学习Java过程中,排序sort是我们常用的功能;在Java里,数组有Arrays.sort()可以排序,集合则是Collection
- 概念尽量使用合成/聚合,而不是使用继承实现复用。所谓的合成/聚合是指一个对象里持有另外一个类的对象,通过调用这些对象的方法得到复用已有功能的
- 推荐激活教程IntelliJ IDEA 2020最新激活码(亲测有效,可激活至 2089 年)最新idea2021注册码永久激活(激活到21
- 一、前言环境:jdk 1.8,SpringCloud Greenwich.SR2。如题,springcloud config-client启
- Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个
- Spring Boot1.为什么要使用 Spring Boot因为Spring, SpringMVC 需要使用的大量的配置文件 (xml文件
- 本文实例讲述了Java计算文本MD5加密值的方法。分享给大家供大家参考,具体如下:java计算文本MD5值,用于加密import java.
- 1.组件添加1.1@Configuration@Configuration:告诉SpringBoot这是一个配置类配置类里面使用@Bean标
- 1.application.yml中添加两个datasourceserver: port: 8080spring: application: