设为首页 收藏本站
查看: 1241|回复: 0

[经验分享] 使用Spring3.x框架的java mail支持来发送邮件

[复制链接]
累计签到:77 天
连续签到:1 天
发表于 2014-7-4 09:46:09 | 显示全部楼层 |阅读模式
    本文主要介绍使用Spring3.x框架中的JavaMail支持来实现邮件发送功能。   

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,附件,内容插入媒体等),邮件发送的后台任务,收件人的管理等。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-21607-1-1.html 上篇帖子: 源码编译安装postfix 下篇帖子: centos下Extmail的搭建
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表