博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用Spring3.x框架的java mail支持来发送邮件
阅读量:7206 次
发布时间:2019-06-29

本文共 5600 字,大约阅读时间需要 18 分钟。

 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

    其它辅助类可以参见: 

 

 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邮件接口的实现,可以参见:

   

   如果使用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,如需转载请自行联系原作者
你可能感兴趣的文章
nagios监控配置
查看>>
<c:forEach> 用法
查看>>
10分钟让你明白MySQL是如何利用索引的
查看>>
正则表达式收集
查看>>
The Log(我所读过的最好的一篇分布式技术文章)
查看>>
我的友情链接
查看>>
jQuery的选择器(四)
查看>>
我的友情链接
查看>>
使用firefox和selenium模拟点击js获取更多评论
查看>>
linux wget 命令用法详解(附实例说明)
查看>>
SQL-mysql设置utf8编码方法
查看>>
linux 基本命令
查看>>
android 5.0 activity的过滤动画
查看>>
Confluence 6 增加和减少你许可证的用户数
查看>>
Confluence 6 配置自动备份
查看>>
正确处理移除list中数据
查看>>
又来批量取消关注了,百度空间关注
查看>>
5.4 异步TCP编程(三)
查看>>
企业场景一主多从宕机从库宕机解决
查看>>
启用ASDM图形化管理防火墙-操作步骤
查看>>