使用Spring3.x框架的java mail支持来发送邮件

本文涉及的产品
.cn 域名,1个 12个月
简介:

 1.Spring的集成功能  

    在Spring的spring-context-support-3.2.4.RELASE.jar包中提供了Spring对cache,mail, schedule,ui的集成。

    Spring对JavaMail的支持的类在:org.springframework.mail和org.springframework.mail.javamail包中。

  

  2.Spring对JavaMail集成的实现

     主要有两个接口和接口的实现类

    接口:org.springframework.mail.MailMessage

    实现类:org.springframework.mail.SimpleMailMessage

    接口:org.springframework.mail.javamail.JavaMailSender

    实现类:org.springframework.mail.javamail.JavaMailSender.JavaMailSenderImpl

    其它辅助类可以参见:http://docs.spring.io/spring/docs/3.2.4.RELEASE/javadoc-api/ 

 

 3.具体使用Spring集成的JavaMail功能

   创建一个发送邮件的bean,依赖MailMessage bean和JavaMailSender bean,Spring配置如下:

 

1
< span  style = "font-size:14px;font-family:'微软雅黑', 'Microsoft YaHei';" >< bean  id = "mailSender"  class = "org.springframework.mail.javamail.JavaMailSenderImpl" <br>        scope="singleton">< br >        < property  name = "host"  value = "smtp.yeah.net(服务器host)"  />< br >        < property  name = "port"  value = "25"  />< br >        < property  name = "protocol"  value = "smtp"  />< br >        < property  name = "defaultEncoding"  value = "utf-8"  />< br >        < property  name = "username"  value = "邮箱名称"  />< br >        < property  name = "password"  value = "邮箱密码"  />< br >    </ bean >< br >< br >    < bean  id = "mailMessage"  class = "org.springframework.mail.SimpleMailMessage" <br>        scope="prototype">< br >        < property  name = "from"  value = "发件人@yeah.net"  />< br >        < property  name = "to"  value = "收件人@163.com"  />< br >        < property  name = "cc" >< br >            < array >< br >                < value >抄送1@163.com</ value >< br >                < value >抄送2@163.com</ value >< br >                < value >抄送n@163.com</ value >< br >            </ array >< br >        </ property >< br >        < property  name = "bcc" >< br >            < array >< br >                < value >密送1@163.com</ value >< br >                < value >密送2@163.com</ value >< br >                < value >密送n@163.com</ value >< br >            </ array >< br >        </ property >< br >        < property  name = "subject"  value = "Spring Test Java Mail Sender"  />< br >    </ bean >< br >< br >    < bean  id = "userMailSender"  class = "sp4.mail.UserMailSender"  scope = "singleton" <br>        autowire="byName">< br >        < lookup-method  name = "initMailMessage"  bean = "mailMessage"  />< br >    </ bean >< br ></ span >

  

     如上代码所示,mailSender和mailMessage注入到userMailSender bean中,然后程序通过userMailSender bean来控制邮件的发送。

    从配置中可以看到mailSender是一个singleton bean,而mailMessage是prototype bean,这是符合一般发邮件的要求。通常用来发送邮件的类的信息是固定了,邮件信息则可以根据业务需要来设置相应的信息,这么一来,userMailSender是singleton bean, 而其发送的邮件信息是prototype bean, 我们就要处理singleton bean中有prototype bean属性的问题,Spring提供了使用方法查找的方式来实现每次调用userMailSender时,Spring为userMailSender注入一个新的mailMessage bean。


   下面是UserMailSender bean的代码,以及UserMailSender bean的使用示例。

  

1
<span style= "font-size:14px;font-family:'微软雅黑', 'Microsoft YaHei';" > package  sp4.mail;<br><br> import  java.util.Date;<br><br> import  org.springframework.mail.MailException;<br> import  org.springframework.mail.SimpleMailMessage;<br> import  org.springframework.mail.javamail.JavaMailSenderImpl;<br><br> public  abstract  class  UserMailSender {<br><br>     private  JavaMailSenderImpl mailSender;<br><br>     protected  abstract  SimpleMailMessage initMailMessage();<br><br>     public  void  send() {<br>        SimpleMailMessage message = initMailMessage();<br>         try  {<br>             //message 状态操作<br>            message.setText(new Date().toString() + " : Hello World");<br>            //mailSender 状态操作<br>            mailSender.send(message);<br>        } catch (MailException e) {<br>            System.err.println(e.getMessage());<br>        }<br>    }<br><br>    public JavaMailSenderImpl getMailSender() {<br>        return mailSender;<br>    }<br><br>    public void setMailSender(JavaMailSenderImpl mailSender) {<br>        this.mailSender = mailSender;<br>    }<br>}<br><br><br>@Test<br>    public void test1() {<br>        UserMailSender mailSender = (UserMailSender) context<br>                .getBean("userMailSender");<br>        mailSender.send();<br>    }<br></span>


    说明:

    在bean的配置中的信息,同样可以在UserMailSender bean中设置,其中包括UserMailSender bean的属性 mailSender bean 和 mailMessage bean。


   程序中使用JavaMail发送邮件的一些问题:

  1. 无效用户(550 Invalid User)

      产生原因:邮箱地址没有写邮箱域名,如果发件人邮箱没有写域名则直接是:550,如果收件人邮箱没有邮箱域名自然是:无效地址+550

     比如发件人是:zhangsan@163.com 而from的值取zhangsan就回产生。

    解决办法:收,发件人邮箱名称应该带邮箱域名

2.权限验证失败(535 Error: authentication failed)

    产生原因:发件人的邮箱密码或邮箱名称错误

    解决办法:检查邮箱名称和邮箱密码

3. 邮箱名称和密码设置正确仍然不能发送邮件

    产生原因:第三方邮件服务器的话需要查看是否开启smpt服务

    解决办法:来自网易-POP3/SMTP/IMAP服务能让你在本地客户端上更好地收发邮件

4.发送成功,却找不到邮件

   产生原因:主要是由过滤,黑名单,垃圾邮件处理引起

   解决办法:人工干预,查看是否发送成功

5.部分成功,部分失败

   产生原因:发送邮件频率过高,发件人数量太大

   解决办法:放慢发件频率;第三方邮件服务一般有发件人数上限设置,可以查阅然后设置合理人数

6.  如何设置定义人发件人名称

   很抱歉Spring提供的MailMessage接口中只有此方法:

  

1
<span style= "font-size:14px;font-family:'微软雅黑', 'Microsoft YaHei';" > @Override <br>     public  void  setFrom(String from) {<br>         this .from = from;<br>    }<br></span>

    如果想使用更为全面的邮件信息设置和JavaEE邮件接口的实现,可以参见:

   https://javamail.java.net/nonav/docs/api/

   如果使用Maven工具的话可以添加如下依赖(java.mail-api和sun对java.mail-api的实现):

 

1
< span  style = "font-size:14px;font-family:'微软雅黑', 'Microsoft YaHei';" >< dependency >< br >          < groupId >javax.mail</ groupId >< br >          < artifactId >javax.mail-api</ artifactId >< br >          < version >1.5.2</ version >< br >        </ dependency >< br >        < dependency >< br >          < groupId >com.sun.mail</ groupId >< br >          < artifactId >javax.mail</ artifactId >< br >          < version >1.5.2</ version >< br >        </ dependency >< br ></ span >

   

在java.mail.Message接口中定义了setFrom(Address address)和addFrom(Address address)方法,而java.mail.Address接口有一个实现类javax.mail.internet.InternetAddress有如下重载多个的构造方法:

1
<span style= "font-size:14px;font-family:'微软雅黑', 'Microsoft YaHei';" public  InternetAddress(String address, String personal, String charset)<br>                 throws  UnsupportedEncodingException {<br>     this .address = address;<br>    setPersonal(personal, charset);<br>    }<br></span>

上面的构造方法即可以指定邮件地址,显示的个人信息,显示信息的编码。这样就能是发件人从:zhangsan@yeah.net设置为:“张三科技服务”,中文乱码可以通过指定编码格式来处理。


    至此上面列举了使用java mail可能遇到的问题。


  写在最后, 在应用程序中使用JavaMail主要涉及邮件的征文内容(文本,HTML,附件,内容插入媒体等),邮件发送的后台任务,收件人的管理等。



本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1434176,如需转载请自行联系原作者
相关文章
|
14天前
|
缓存 Java 开发工具
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
三级缓存是Spring框架里,一个经典的技术点,它很好地解决了循环依赖的问题,也是很多面试中会被问到的问题,本文从源码入手,详细剖析Spring三级缓存的来龙去脉。
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
|
5天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
398 6
|
2天前
|
XML 前端开发 Java
控制spring框架注解介绍
控制spring框架注解介绍
|
3天前
|
算法 Java
Java项目不使用框架如何实现限流?
Java项目不使用框架如何实现限流?
15 2
|
2天前
|
存储 NoSQL Java
Spring Session框架
Spring Session 是一个用于在分布式环境中管理会话的框架,旨在解决传统基于 Servlet 容器的会话管理在集群和云环境中的局限性。它通过将用户会话数据存储在外部介质(如数据库或 Redis)中,实现了会话数据的跨服务器共享,提高了应用的可扩展性和性能。Spring Session 提供了无缝集成 Spring 框架的 API,支持会话过期策略、并发控制等功能,使开发者能够轻松实现高可用的会话管理。
Spring Session框架
|
9天前
|
Kubernetes Java Android开发
用 Quarkus 框架优化 Java 微服务架构的设计与实现
Quarkus 是专为 GraalVM 和 OpenJDK HotSpot 设计的 Kubernetes Native Java 框架,提供快速启动、低内存占用及高效开发体验,显著优化了 Java 在微服务架构中的表现。它采用提前编译和懒加载技术实现毫秒级启动,通过优化类加载机制降低内存消耗,并支持多种技术和框架集成,如 Kubernetes、Docker 及 Eclipse MicroProfile,助力开发者轻松构建强大微服务应用。例如,在电商场景中,可利用 Quarkus 快速搭建商品管理和订单管理等微服务,提升系统响应速度与稳定性。
28 5
|
10天前
|
Java 应用服务中间件 开发者
深入探索并实践Spring Boot框架
深入探索并实践Spring Boot框架
23 2
|
9天前
|
机器学习/深度学习 数据采集 JavaScript
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
ADR药品不良反应监测系统是一款智能化工具,用于监测和分析药品不良反应。该系统通过收集和分析病历、处方及实验室数据,快速识别潜在不良反应,提升用药安全性。系统采用Java开发,基于SpringBoot框架,前端使用Vue,具备数据采集、清洗、分析等功能模块,并能生成监测报告辅助医务人员决策。通过集成多种数据源并运用机器学习算法,系统可自动预警药品不良反应,有效减少药害事故,保障公众健康。
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
|
10月前
|
前端开发 Java 数据库
Java面试题 - Spring
Java面试题 - Spring
143 0
|
2月前
|
Java 应用服务中间件 开发者
Java面试题:解释Spring Boot的优势及其自动配置原理
Java面试题:解释Spring Boot的优势及其自动配置原理
100 0