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

简介:

 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,如需转载请自行联系原作者
相关文章
|
18天前
|
安全 Java 应用服务中间件
Spring Boot + Java 21:内存减少 60%,启动速度提高 30% — 零代码
通过调整三个JVM和Spring Boot配置开关,无需重写代码即可显著优化Java应用性能:内存减少60%,启动速度提升30%。适用于所有在JVM上运行API的生产团队,低成本实现高效能。
121 3
|
18天前
|
安全 Java Ruby
我尝试了所有后端框架 — — 这就是为什么只有 Spring Boot 幸存下来
作者回顾后端开发历程,指出多数框架在生产环境中难堪重负。相比之下,Spring Boot凭借内置安全、稳定扩展、完善生态和企业级支持,成为构建高可用系统的首选,真正经受住了时间与规模的考验。
131 2
|
27天前
|
人工智能 Java 开发者
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
JManus是阿里开源的Java版OpenManus,基于Spring AI Alibaba框架,助力Java开发者便捷应用AI技术。支持多Agent框架、网页配置、MCP协议及PLAN-ACT模式,可集成多模型,适配阿里云百炼平台与本地ollama。提供Docker与源码部署方式,具备无限上下文处理能力,适用于复杂AI场景。当前仍在完善模型配置等功能,欢迎参与开源共建。
775 58
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
|
19天前
|
人工智能 Java API
构建基于Java的AI智能体:使用LangChain4j与Spring AI实现RAG应用
当大模型需要处理私有、实时的数据时,检索增强生成(RAG)技术成为了核心解决方案。本文深入探讨如何在Java生态中构建具备RAG能力的AI智能体。我们将介绍新兴的Spring AI项目与成熟的LangChain4j框架,详细演示如何从零开始构建一个能够查询私有知识库的智能问答系统。内容涵盖文档加载与分块、向量数据库集成、语义检索以及与大模型的最终合成,并提供完整的代码实现,为Java开发者开启构建复杂AI智能体的大门。
561 58
|
7天前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
57 8
|
7天前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
35 7
|
22天前
|
监控 Java 数据库
从零学 Dropwizard:手把手搭轻量 Java 微服务,告别 Spring 臃肿
Dropwizard 整合 Jetty、Jersey 等成熟组件,开箱即用,无需复杂配置。轻量高效,启动快,资源占用少,内置监控、健康检查与安全防护,搭配 Docker 部署便捷,是构建生产级 Java 微服务的极简利器。
118 2
|
1月前
|
SQL Java 数据库连接
区分iBatis与MyBatis:两个Java数据库框架的比较
总结起来:虽然从技术角度看,iBATIS已经停止更新但仍然可用;然而考虑到长期项目健康度及未来可能需求变化情况下MYBATISS无疑会是一个更佳选择因其具备良好生命周期管理机制同时也因为社区力量背书确保问题修复新特征添加速度快捷有效.
103 12
|
1月前
|
监控 Kubernetes Cloud Native
Spring Batch 批处理框架技术详解与实践指南
本文档全面介绍 Spring Batch 批处理框架的核心架构、关键组件和实际应用场景。作为 Spring 生态系统中专门处理大规模数据批处理的框架,Spring Batch 为企业级批处理作业提供了可靠的解决方案。本文将深入探讨其作业流程、组件模型、错误处理机制、性能优化策略以及与现代云原生环境的集成方式,帮助开发者构建高效、稳定的批处理系统。
222 1
|
2月前
|
存储 缓存 安全
Java集合框架(三):Map体系与ConcurrentHashMap
本文深入解析Java中Map接口体系及其实现类,包括HashMap、ConcurrentHashMap等的工作原理与线程安全机制。内容涵盖哈希冲突解决、扩容策略、并发优化,以及不同Map实现的适用场景,助你掌握高并发编程核心技巧。