Java 发邮件-带附件且正文html格式

article/2025/9/14 10:14:12

入职新公司不久,接到一个给用户发邮件的需求,有两点需要说明的:1)正文需要格式化;2)需要带附件。

大概了解了一下需求,我马上开始思考,现有项目中是否有类似的接口可以支持,如果可以支持,那我就不用再开发了。

通过和老员工的沟通,发现以前有发邮件的接口。详细看了下代码,历史需求都是发送短信验证码,重置密码链接等需求,没有带附件的需求,也就没有带附件的接口。

既然要重新开发,想着肯定前人已经有过这种需求,然后再网上google一下,发现真的有。

MultiPartEmail

public void doSendMulitiPartEmail(String subject, String sendHtml, String receiveUser, File attachment) {MultiPartEmail multiPartEmail = new MultiPartEmail();try {multiPartEmail.setHostName(mailHost);multiPartEmail.setAuthentication(sender_username, sender_password);// 发件人multiPartEmail.setFrom(sender_username, "prepared.com");// 收件人multiPartEmail.addTo(receiveUser);// 邮件主题multiPartEmail.setSubject(subject);multiPartEmail.setMsg(sendHtml);
//            multiPartEmail.setContent(sendHtml, "text/html; charset=utf-8");EmailAttachment attachmentLogs = new EmailAttachment();attachmentLogs.setPath(attachment.getPath());attachmentLogs.setDisposition(EmailAttachment.ATTACHMENT);attachmentLogs.setDescription("Logs");attachmentLogs.setName(attachment.getName());// 将multipart对象放到message中multiPartEmail.attach(attachmentLogs);multiPartEmail.send();System.out.println("send success!");} catch (Exception e) {e.printStackTrace();} finally {if (transport != null) {try {transport.close();} catch (MessagingException e) {e.printStackTrace();}}}
}

但是这个代码有个问题:multiPartEmail.setMsg(sendHtml);通过setMsg设置正文,正文不支持html格式,也就是不能格式化,不满足需求1。

但是通过multiPartEmail.setContent(sendHtml, "text/html; charset=utf-8")可以支持正文格式化,但是附件又进不去了。不满足需求2。

通过查看官方文档:

To create a multi-part email, call the default constructor and then you can call setMsg() to set the message and call the different attach() methods.

简单翻译一下:就是通过setMsg()设置正文,通过attach()设置附件。
应该是不支持同时格式化正文和增加附件。(如果有问题,可以指正一下)

HtmlEmail

上代码

public void sendHTMLEmail (EmailMessage message) {try {HtmlEmail htmlEmail = new HtmlEmail();htmlEmail.setAuthentication(sender_username, sender_password);htmlEmail.setHostName(mailHost);htmlEmail.addTo(message.getEmailTo());htmlEmail.setFrom(sender_username, "prepared.com");htmlEmail.setSubject(message.getEmailSubJect());htmlEmail.setMsg(message.getEmailContent());htmlEmail.setCharset("utf-8");// 附件中文乱码解决String name = new String(message.getAttachFile().getName().toString().getBytes(),"utf-8");sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
//            String name1="=?UTF-8?B?"+enc.encode("测试.txt".getBytes("utf-8"))+"?=";String fileName = "=?UTF-8?B?"+enc.encode(name.getBytes("utf-8"))+"?=";htmlEmail.embed(new FileDataSource(message.getAttachFile()), fileName);htmlEmail.send();} catch (EmailException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();}
}

通过查看官方文档,很明显的说明,1)可以带附件;2)正文可以格式化,通过setHtmlMsg()方法即可。

当然,格式化正文,也可以使用setMsg()API.

继续查看文档,可以发现,HtmlEmail 支持正文中嵌入图片、文件等内容(所以 api 名字叫 embed)。

使用这个的过程中,发现一个问题,如果附件文件名称带中文,可能会乱码,有两种方式解决。

方式一:

MimeUtility.encodeText(new String("带中文的文件名".getName().getBytes(),"utf-8"),"utf-8","B")

方式二:

String name = new String("带中文的文件名".getBytes(),"utf-8");
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
String fileName = "=?UTF-8?B?"+enc.encode(name.getBytes("utf-8"))+"?=";

总结

在这次需求中,做的不足的地方就是,没有先看官方文档,而是网上各种找现成代码,走了很多弯路。比如:1)刚开始觉得 HtmlEmail 不支持附件,转战 MultiPartEmail ;2)然后整了半天,发现这个不能格式化正文;3)最后又回到HtmlEmail。

官方文档很重要!!!

官方文档地址:https://commons.apache.org/proper/commons-email/javadocs/api-1.2/index.html


http://chatgpt.dhexx.cn/article/Tw3UfZC6.shtml

相关文章

java实现发送邮件

本文介绍下java实现邮件的发送&#xff0c;意在网站用户评论时能够及时通知站长和用户评论被回复后能够及时通知用户。 下文介绍下具体实现。 java实现 首先引入springboot的邮箱依赖 <dependency><groupId>org.springframework.boot</groupId><artif…

java邮件发送

一、JavaMail介绍 1、概述 JavaMail是利用现有的邮件账户发送邮件的工具&#xff0c;比如我在网易注册一个邮箱账户&#xff0c;通过JavaMail的操控&#xff0c;我可以不亲自登录网易邮箱&#xff0c;让程序自动的使用网易邮箱发送邮件。这一机制被广泛的用在注册激活和垃圾邮…

使用Java实现邮件的发送

数年前&#xff0c;邮件的发送是经过人为的运输&#xff0c;从发件人---当地邮局---收件地邮局---收件人&#xff0c;付出的人力物力是非常大的。随着时代的进步&#xff0c;科技的发展&#xff0c;如今我们的生活中出现更高级发送邮件的方式&#xff0c;最常用的就是从&#x…

Java发送邮件详解

目录 一、关于电子邮件 电子邮件 传输协议 SMTP协议 POP3协议 邮件收发原理 二、发送纯文本邮件 二、发送带图片和附件的邮件 一、关于电子邮件 电子邮件 要在网络上实现邮件功能&#xff0c;必须要有专门的邮件服务器。 这些邮件服务器类似于现实生活中的邮局&…

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

本文链接: https://blog.csdn.net/xietansheng/article/details/51673073 电子邮件的应用非常广泛&#xff0c;例如在某网站注册了一个账户&#xff0c;自动发送一封欢迎邮件&#xff0c;通过邮件找回密码&#xff0c;自动批量发送活动信息等。但这些应用不可能和我们自己平时…

js 实现计数器功能

1.运用 setInterval()定时器计算秒数 <!DOCTYPE html> <html><head><title>JS实现计数器</title><meta http-equiv"content-type" content"text/html; charsetgbk"><script src"https://cdn.bootcss.com/jqu…

element的formatter失效的解决方案

formatter传入数据失效 组件封装的时这样 使用方式还是和element的官方使用方式相同

html输入框只能输入文字,input文本框强制输入指定文字的方法以及IE11的兼容

背景:最近开发的韩国项目,在用户姓名输入框一栏中,要求只能输入韩文,通常用到onkeyup和onafterpaste两个事件来触发方法,并在方法中进行校验,但是在IE浏览器中,出现了一种情况,就是韩文单词拼写未完成的时候,会直接进行校验并显示,如下图实例所展示,并不是需要想要的…

jquery对表格行列的操作-jquery动态增加表格行或者列

jquery对表格的操作是老生常谈的问题。最近项目中用到了&#xff0c;今天在这里分享一下&#xff01; 效果大体如下&#xff1a; 分享一下代码吧&#xff01; html <div class"table-responsive" id"Bk_table" style"display:none;">&l…

动态改变Input和Textarea值Vue数据没有绑定的解决办法

背景&#xff1a; 我在循环里面的input框需要限制输入的值的类型&#xff0c;如果我绑定了change的方法的话 首先需要失去焦点才能生效&#xff0c;如果不失去焦点直接点击确定按钮是不能触发事件的 值还是原来的 &#xff0c;第二个如果层级多的话需要把索引什么的传过去用$se…

HTML 限制文本框只能输入数字 onkeyup+onafterpaste

限制文本框只能输入数字 < input onkeyup "if(isNaN(value))execCommand(undo)" onafterpaste "if(isNaN(value))execCommand(undo)" > < input name txt1 onchange "if(/\D/.test(this.value)){alert(只能输入数字);this.value;}" …

JAVAFX的table样式修改

直接上代码吧&#xff0c; .table-view{-fx-font-size: 16; 修改表格字体的大小 } 表头的背景设置 .table-view .column-header-background {-fx-background-color: #DBDBDB; } 表头设置 .table-view .column-header{-fx-border-color:#ffffff; -fx-border-width:0 1 …

bootstrap-table样式修改

bootstrap-table修改后的效果如下 1.删除边线 <style>.table>tbody>tr>td{border-top: 1px solid transparent !important;border-right: 1px solid transparent !important;border-left: 1px solid transparent !important;}.table>thead>tr>th{bord…

HTML常用table样式

转自&#xff1a;http://atgoingguoat.iteye.com/blog/2074431 常用table样式&#xff0c;备自己常年复制用。 效果图 Java代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.d…

一文图解自定义修改el-table样式

我们在使用element UI库的时候&#xff0c;确实给我们带来了许多便利&#xff0c;但是&#xff0c;往往组件库无法满足我们的业务需求&#xff0c;这时就需要我们在组件库的基础上修改样式。 今天水香木鱼一篇图解文章教大家如何在组件库的基础上去修改样式&#xff0c;今天我们…

el-table样式美化

<!-- 列表展示 --><el-table:data="tableData"v-loading="loading2"borderclass="mg-btm-20

ant design table样式修改合集

目录 1. 修改列头样式 改变列头文字颜色 改变列头背景颜色 2. 修改行样式 改变行文字颜色 隔行换色 3.列头居中&#xff0c;列居左/右 4.列表自动滚动 5. 列头超出省略并可以点击全显示 6.Table 点击某一行时改变选中行的边框颜色 7.Table 移入某一行时改变行的颜色 …

Element-UI:el-table样式修改

以下样式代码在less环境下生效&#xff0c;最终样式如下。 样式代码&#xff0c; /*修改table 表体的背景颜色和文字颜色*/ /deep/ .el-table {background-color: transparent;th,td {background-color: transparent;}.el-table__expanded-cell {background-color: transp…

ElementUI table 样式修改

一、概述 element-ui table 默认是白色背景&#xff0c;现在需要修改为黑色背景&#xff0c;白色文字。 二、代码实现 css样式 <style>/*修改table 的背景颜色和文字颜色*/.el-table td, .el-table th.is-leaf,.el-table--border, .el-table--group{border-color: black;…

table 样式美化

1. 单像素边框CSS表格 这是一个很常用的表格样式。 源代码: 1 <!-- CSS goes in the document HEAD or added to your external stylesheet -->2 <style type="text/css">3 table.gridtable {4 font-family: verdana,arial,sans-serif;5 font…