【Java Mail】 使用java mail发送邮件

news/2025/2/8 17:48:13/文章来源:https://www.cnblogs.com/sxdcgaq8080/p/18704850

465端口和587端口差异对比可参考:https://liaoxuefeng.com/books/java/spring/integration/javamail/index.html

 

 

特别注意写在最前面:

1.SMTP邮箱服务 有两个端口SMTP 端口号(SSL)465
SMTP 端口号(starttls)587所以,在发送邮件时,一定要注意 不同端口,配置Properties细节处的差异。
细节不正确,会导致
① null指针异常
② Transport.send(message)后线程卡死无响应以下代码,就是以 465端口发送邮件的完整代码,特别注意标红部分。2.properties.put("mail.transport.protocol", "smtp");
配置未指定,会导致 null指针异常java.lang.NullPointerException: nullat com.sun.mail.handlers.text_plain.writeTo(text_plain.java:133)at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:889)at javax.activation.DataHandler.writeTo(DataHandler.java:317)at javax.mail.internet.MimeUtility.getEncoding(MimeUtility.java:340)at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1573)at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1172)at javax.mail.internet.MimeMultipart.updateHeaders(MimeMultipart.java:522)at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1531)at javax.mail.internet.MimeMessage.updateHeaders(MimeMessage.java:2271)at javax.mail.internet.MimeMessage.saveChanges(MimeMessage.java:2231)3.properties.put("mail.smtp.ssl.enable", "false");properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
配置未指定,会导致 Transport.send(message); 执行后无响应,线程挂起

 

 

 

util核心代码:

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.File;
import java.util.Properties;@Slf4j
public class MailUtils {public static void  sendMail() {// 邮件服务器配置String host = "smtp.XXX.cn"; // 邮件服务器地址String port = "465"; // 邮件服务器端口号String username = "marketingdata-noreply@XX.com"; // 发件人邮箱String password = "OLiafELfknqYtQ6x"; // 发件人邮箱密码// 邮件内容String to = "angel.sxd@XXX.com"; // 收件人邮箱String subject = "暂占邮件标题坑位之看我几分像从前";String body = "这是一封测试邮件,包含附件。";String attachmentPath = "/暂占邮件标题坑位之看我几分像从前.xlsx"; // 附件路径
Properties properties = new Properties();properties.put("mail.transport.protocol", "smtp");properties.put("mail.smtp.host", host);properties.put("mail.smtp.socketFactory.port", port);properties.put("mail.smtp.auth", "true");properties.put("mail.smtp.starttls.enable", "true");properties.put("mail.smtp.ssl.enable", "false");properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");Session session = Session.getInstance(properties, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(username, password);}});session.setDebug(true);log.info("send mail info begin1  props:{} session:{}", JSON.toJSONString(properties), cn.hutool.json.JSONUtil.toJsonStr(session));try {// 创建邮件消息MimeMessage message = new MimeMessage(session);message.setFrom(new InternetAddress(username));message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));message.setSubject(subject);// 创建邮件正文MimeBodyPart textPart = new MimeBodyPart();textPart.setText(body);// 创建附件MimeBodyPart attachmentPart = new MimeBodyPart();File attachmentFile = new File(attachmentPath);DataSource source = new FileDataSource(attachmentFile);attachmentPart.setDataHandler(new DataHandler(source));attachmentPart.setFileName(attachmentFile.getName());// 组合正文和附件Multipart multipart = new MimeMultipart();multipart.addBodyPart(textPart);multipart.addBodyPart(attachmentPart);message.setContent(multipart);log.info("send mail info begin2  message:{} ", cn.hutool.json.JSONUtil.toJsonStr(message));// 发送邮件
            Transport.send(message);log.info("send mail info end  message:{} ", cn.hutool.json.JSONUtil.toJsonStr(message));} catch (AddressException e) {throw new RuntimeException(e);} catch (MessagingException e) {throw new RuntimeException(e);}}}

 

邮件发送成功如图:

 

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

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

相关文章

夸克网盘免费扩容,新用户轻松领取1TB免费空间!一步一步教你如何操作

大家好!今天带来一个超级实用的福利教程——夸克网盘新用户免费领取1TB空间!是不是还在为网盘容量不够用而头疼?或者觉得一些网盘的会员费用太贵,难以承受?那么今天夸克网盘给大家送上大福利,新用户可以轻松领取1TB免费空间,随便存放视频、文件,再也不怕容量不够用了!…

25.2.8小记

流 流是输入输出的方式 1.流是一维(用一个数字可以表示其在流中的地方)且单向的 System.out.println("hello");其中out这个成员就是某种用来输出的流其中inputstream和outputstream只是把外面的输入当作字节流来看待(只能做字节层面上的读和写)这个报错:所有IO的…

发那科焊接机器人M-10iA维修总结

发那科作为工业机器人制造商,其焊接机器人产品广泛应用于各种工业领域。然而,随着时间的推移,焊接机器人可能会出现故障,因此了解发那科焊接机器人M-10iA维修知识显得尤为重要。 一、日常法那科机械手维护 1. 定期检查:定期检查FANUC焊接机械手M-10iA的各个部件,如驱动系…

【金牌老会/EI检索稳定/高校学会主办】第十三届工程管理国际学术研讨会(ISPM 2025)诚邀您投稿参会

征文通知 会议简介为推动工程管理领域的创新和发展,增进工程管理界同行间的相互了解与交流,“第十三届工程管理国际学术研讨会(ISPM 2025) ”将于 2025 年6月在北京举办,本次会议由北京工程管理科学学会、北京建筑大学、太原科技大学和湖北省众科地质与环境技术服务中心共…

基于 API 网关践行 API First 开发实践

API 是连接数字生态系统中各应用的桥梁,是提升企业效率和数字化体验的关键。而 API First 开发模式的核心在于:以 API 为先,将其视为“头等公民”,在构建应用、服务及集成之前,应优先定义并设计 API 及其配套。API First 作为一种相对较新的开发模式,它已逐渐流行并获得业…

docker单机部署kafka

docker单机部署kafka 官方镜像地址:apache/kafka - Docker 镜像 |Docker 中心 官方给的命令,部署之后,用工具访问不了:services:broker:image: apache/kafka:latestcontainer_name: brokerenvironment:KAFKA_NODE_ID: 1KAFKA_PROCESS_ROLES: broker,controllerKAFKA_LISTEN…

并发编程 - 线程同步(五)之原子操作Interlocked详解二

学习Interlocked类其他方法,包括Exchange、CompareExchange的泛型和非泛型版本,用于原子更新变量并获取旧值,实现锁机制和CAS算法;And、Or方法用于原子按位操作;MemoryBarrier方法用于执行内存屏障。上一章我们学习了原子操作Interlocked类的几个常用方法,今天我们将继续…

十大MES软件厂家推荐:聚焦珠海盈致

在制造业数字化转型的浪潮中,制造执行系统(MES)作为连接企业资源计划(ERP)与车间自动化系统的桥梁,扮演着至关重要的角色。它不仅能够优化生产流程,提高生产效率,还能确保产品质量,降低运营成本。在众多的MES软件厂家中,珠海盈致凭借其专业的解决方案和深厚的行业经验…

[2025青海民族大学新生赛] re misc crypto _部分wp

re 你的flag被加密啦! 可以直接改源码点击查看代码 def custom_encrypt(plaintext):encrypted = ""key = [3, 5, 2]key_index = 0for char in plaintext:if a <= char <= z:shift = key[key_index]new_char = chr((ord(char) - ord(a) - shift) % 26 + ord(a)…

库卡机械臂控制柜维修高效方法

在工业自动化领域,库卡(KUKA)机器人以其卓越的性能和广泛的应用领域而备受推崇。然而,作为精密复杂的机械设备,库卡机器人控制柜在长时间运行过程中难免会遇到各种故障。因此,及时进行KUKA工业机械手控制器维修和保养,确保控制柜的正常运行,对于保障整个生产线的效率至…

浏览器消息循环

浏览器事件循环的完整与准确叙述(依据 W3C/WHATWG 规范)一、核心机制 JavaScript 的 单线程模型 通过 事件循环(Event Loop) 管理异步操作,其设计核心如下:非阻塞执行:允许主线程在等待 I/O、定时器等操作时继续处理其他任务。 优先级调度:任务(Task) 与 微任务(Mic…

深入剖析实体-关系模型(ER 图):理论与实践全解析

title: 深入剖析实体-关系模型(ER 图):理论与实践全解析 date: 2025/2/8 updated: 2025/2/8 author: cmdragon excerpt: 实体-关系模型(ER 模型)是一种用于描述现实世界中对象及其关系的概念模型,作为数据库设计的重要工具,ER 模型以图形方式表示数据之间的联系。通过…