Java使用Spring发送邮件的实现代码
发布时间 - 2026-01-10 23:26:03 点击率:次Spring Email抽象的核心是MailSender接口,MailSender的实现能够通过连接Email服务器实现邮件发送的功能,如下图:
Spring自带一个MailSender的实现就是JavaMailSenderImpl,它也是使用JavaMail API来发送Email,在使用之前,必须先将JavaMailSenderImpl装配为Spring应用上下文中的一个bean,如下所示:
@Bean
public MailSender mailSender (Environment env) {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost(env.getProperty("mailserver.host"));
return mailSender;
}
默认情况下,JavaMailSenderImpl假设邮件服务器监听25端口,如果邮件服务器监听不同的端口,可以使用port属性指定其端口号,在上面的mailSender()方法中添加:
mailSender.setPort(env.getProperty("mailserver.port"));
如果邮件服务器需要认证的话,还需要设置username和password:
mailSender.setUsername(env.getProperty("mailserver.username"));
mailSender.setPassword(env.getProperty("mailserver.password"));
这样JavaMailSenderImpl已经配置完成,到此可以创建自己的邮件会话,如果已经在JNDI中配置了javax.mail.MailSession的话就没有必要为JavaMailSenderImpl配置详细的服务器细节了,可以配置它使用JNDI中已就绪的MailSession。
使用JndiObjectFactoryBean,可以在如下的@Bean方法中配置一个bean,它会从JNDI中查找MailSession:
@Bean
public JndiObjectFactoryBean mailSession ( ) {
JndiObjectFactoryBean jndi = new JndiObjectFactoryBean();
jndi.setJndiName("mail/Session");
jndi.setProxyInterface(MailSession.class);
jndi.setResourceRef(true);
return jndi;
}
接着可以使用Spring的<jee:jndi-lookup>元素从JNDI中获取对象,这里可以使用<jee:jndi-lookup>来创建一个bean,它引用了JNDI中的邮件会话:
复制代码 代码如下:
<jee:jndi-lookup id="mailSession" jndi-name="mail/Session" resource-ref="true">
邮件会话准备好后,就可以将其装配到mailSender bean中了:
@Bean
public MailSender mailSender (MailSession mailSession) {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setSession(mailSession);
return mailSender;
}
通过将邮件会话装配到JavaMailSenderImpl的session属性中,就完全替换了原来的服务器配置,现在邮件会话完全通过JNDI进行配置和管理,JavaMailSenderImpl就可以专注于发送邮件而不必自己处理邮件服务器了。
接着需要将mailSender装配到我们的业务层实现类中(假设为SpitterEmailServiceImpl类),如下:
@Autowired JavaMailSender mailSender;
接着想要给Spitter用户发送Email提示他的朋友写了新的Spittle,这时需要一个方法来发送Email,这个方法要接受Email地址和Spittle对象信息,如下方法就是使用邮件发送器完成该功能:
public void sendSimpleSpittleEmail (Stirng to, Spittle spittle) {
SimpleMailMessage message = new SimpleMailMessage();
String spitterName = spittle.getSpitter().getFullName();
message.setFrom("...@spitter.com"); // email地址
message.setTo(to);
message.setSubject("New spittle from " + spitterName);
message.setText(spitterName + "says: " + spittle.getText());
mailSender.send(message);
}
上面代码中最后一步将消息传递给邮件发送器的send()方法,这样邮件就发送出去了。
发送带附件的Email
消息发送成功了,现在尝试发送带有附件的Email,要发送附件先要创建multipart类型的消息,Email由多个部分组成,其中一部分是Email体,其他部分就是附件。要发送multipart类型的Email,需要创建一个MIME的消息,可以从邮件发送器的createMimeMessage( )方法开始:
MimeMessage message = mailSender.createMimeMessage();
不过这里使用javax.mail.internet.MimeMessage的API相对有点繁琐,可以使用Spring提供的MimeMessageHelper简便操作,实例化它时将MimeMessage传给它。
复制代码 代码如下:
MimeMessageHelper helper = new MimeMessageHelper(message, true); // true表示是multipart类型
得到MimeMessageHelper实例后,就可以开始组装Email消息了:
String spitterName = spittle.getSpitter().getFullName();
helper.setForm("...@spitter.com");
helper.setTo(to);
helper.setSubject("New spittle from " + spitterName);
helper.setText(spitterName + " says: " +spittle.getText());
下面添加附件,以图片为例,只要将这个资源传递给helper的addAttachment方法即可:
FileSystemResource image = new FileSystemResource("/file/test.png");
helper.addAttachment("test.png", image);
这里使用Spring的FileSystemResource来加载位于类路径下的test.png,再调用addAttachment(),第一个参数是要添加到Email中附件的名称,第二个参数是资源文件。
到这里multipart类型的Email已经构建完成,现在就要使用MimeMessageHelper发送带有附件的Email,完整代码如下:
public void sendSpittleEmailWithAttachment (Stirng to, Spittle spittle) throws MessagingException {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
String spitterName = spittle.getSpitter().getFullName();
helper.setForm("...@spitter.com");
helper.setTo(to);
helper.setSubject("New spittle from " + spitterName);
helper.setText(spitterName + " says: " +spittle.getText());
FileSystemResource image = new FileSystemResource("/file/test.png");
helper.addAttachment("test.png", image);
mailSender.send(message);
}
到此就成功发送一个带有附件的Email了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# spring
# 发送邮件
# email邮件发送
# java
# 邮件发送
# Spring Boot发送邮件详解
# 使用spring框架中的组件发送邮件功能说明
# Spring Boot 发送邮件功能案例分析
# springMVC发送邮件的简单实现
# Spring+quartz实现定时发送邮件功能实例
# Spring Boot实战之发送邮件示例代码
# Spring Boot中利用JavaMailSender发送邮件的方法示例(附源码)
# spring mail借助qq邮箱服务器发送邮件
# Spring学习笔记3之消息队列(rabbitmq)发送邮件功能
# Java的Spring框架中实现发送邮件功能的核心代码示例
# spring+maven实现发送邮件功能
# 可以使用
# 邮件服务器
# 就可以
# 到此
# 创建一个
# 自己的
# 第一个
# 多个
# 将其
# 就没
# 第二个
# 写了
# 还需要
# 有必要
# 中了
# 为例
# 所示
# 要将
# 在上面
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案
微信小程序制作网站有哪些,微信小程序需要做网站吗?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
Laravel如何实现一对一模型关联?(Eloquent示例)
Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲
javascript基于原型链的继承及call和apply函数用法分析
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
如何快速搭建安全的FTP站点?
如何快速辨别茅台真假?关键步骤解析
如何在阿里云购买域名并搭建网站?
linux top下的 minerd 木马清除方法
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
b2c电商网站制作流程,b2c水平综合的电商平台?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
详解CentOS6.5 安装 MySQL5.1.71的方法
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
智能起名网站制作软件有哪些,制作logo的软件?
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
浅谈redis在项目中的应用
Laravel storage目录权限问题_Laravel文件写入权限设置
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
如何在阿里云完成域名注册与建站?
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
JavaScript常见的五种数组去重的方式
Laravel如何为API编写文档_Laravel API文档生成与维护方法
网站优化排名时,需要考虑哪些问题呢?
Laravel如何实现多对多模型关联?(Eloquent教程)
Android使用GridView实现日历的简单功能
浅谈Javascript中的Label语句
Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
如何为不同团队 ID 动态生成多个非值班状态按钮
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
微信小程序 wx.uploadFile无法上传解决办法
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】
公司网站制作价格怎么算,公司办个官网需要多少钱?
如何快速搭建虚拟主机网站?新手必看指南
Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控
如何快速生成专业多端适配建站电话?
WordPress 子目录安装中正确处理脚本路径的完整指南
EditPlus中的正则表达式 实战(2)
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
如何在 Pandas 中基于一列条件计算另一列的分组均值

