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