Java使用Spring发送邮件的实现代码
spring email抽象的核心是mailsender接口,mailsender的实现能够通过连接email服务器实现邮件发送的功能,如下图:
spring自带一个mailsender的实现就是javamailsenderimpl,它也是使用javamail api来发送email,在使用之前,必须先将javamailsenderimpl装配为spring应用上下文中的一个bean,如下所示:
@bean public mailsender mailsender (environment env) { javamailsenderimpl mailsender = new javamailsenderimpl(); mailsender.sethost(env.getproperty("mailserver.host")); return mailsender; }
默认情况下,javamailsenderimpl假设邮件服务器监听25端口,如果邮件服务器监听不同的端口,可以使用port属性指定其端口号,在上面的mailsender()方法中添加:
mailsender.setport(env.getproperty("mailserver.port"));
如果邮件服务器需要认证的话,还需要设置username和password:
mailsender.setusername(env.getproperty("mailserver.username")); mailsender.setpassword(env.getproperty("mailserver.password"));
这样javamailsenderimpl已经配置完成,到此可以创建自己的邮件会话,如果已经在jndi中配置了javax.mail.mailsession的话就没有必要为javamailsenderimpl配置详细的服务器细节了,可以配置它使用jndi中已就绪的mailsession。
使用jndiobjectfactorybean,可以在如下的@bean方法中配置一个bean,它会从jndi中查找mailsession:
@bean public jndiobjectfactorybean mailsession ( ) { jndiobjectfactorybean jndi = new jndiobjectfactorybean(); jndi.setjndiname("mail/session"); jndi.setproxyinterface(mailsession.class); jndi.setresourceref(true); return jndi; }
接着可以使用spring的<jee:jndi-lookup>元素从jndi中获取对象,这里可以使用<jee:jndi-lookup>来创建一个bean,它引用了jndi中的邮件会话:
<jee:jndi-lookup id="mailsession" jndi-name="mail/session" resource-ref="true">
邮件会话准备好后,就可以将其装配到mailsender bean中了:
@bean public mailsender mailsender (mailsession mailsession) { javamailsenderimpl mailsender = new javamailsenderimpl(); mailsender.setsession(mailsession); return mailsender; }
通过将邮件会话装配到javamailsenderimpl的session属性中,就完全替换了原来的服务器配置,现在邮件会话完全通过jndi进行配置和管理,javamailsenderimpl就可以专注于发送邮件而不必自己处理邮件服务器了。
接着需要将mailsender装配到我们的业务层实现类中(假设为spitteremailserviceimpl类),如下:
@autowired javamailsender mailsender;
接着想要给spitter用户发送email提示他的朋友写了新的spittle,这时需要一个方法来发送email,这个方法要接受email地址和spittle对象信息,如下方法就是使用邮件发送器完成该功能:
public void sendsimplespittleemail (stirng to, spittle spittle) { simplemailmessage message = new simplemailmessage(); string spittername = spittle.getspitter().getfullname(); message.setfrom("...@spitter.com"); // email地址 message.setto(to); message.setsubject("new spittle from " + spittername); message.settext(spittername + "says: " + spittle.gettext()); mailsender.send(message); }
上面代码中最后一步将消息传递给邮件发送器的send()方法,这样邮件就发送出去了。
发送带附件的email
消息发送成功了,现在尝试发送带有附件的email,要发送附件先要创建multipart类型的消息,email由多个部分组成,其中一部分是email体,其他部分就是附件。要发送multipart类型的email,需要创建一个mime的消息,可以从邮件发送器的createmimemessage( )方法开始:
mimemessage message = mailsender.createmimemessage();
不过这里使用javax.mail.internet.mimemessage的api相对有点繁琐,可以使用spring提供的mimemessagehelper简便操作,实例化它时将mimemessage传给它。
mimemessagehelper helper = new mimemessagehelper(message, true); // true表示是multipart类型
得到mimemessagehelper实例后,就可以开始组装email消息了:
string spittername = spittle.getspitter().getfullname(); helper.setform("...@spitter.com"); helper.setto(to); helper.setsubject("new spittle from " + spittername); helper.settext(spittername + " says: " +spittle.gettext());
下面添加附件,以图片为例,只要将这个资源传递给helper的addattachment方法即可:
filesystemresource image = new filesystemresource("/file/test.png"); helper.addattachment("test.png", image);
这里使用spring的filesystemresource来加载位于类路径下的test.png,再调用addattachment(),第一个参数是要添加到email中附件的名称,第二个参数是资源文件。
到这里multipart类型的email已经构建完成,现在就要使用mimemessagehelper发送带有附件的email,完整代码如下:
public void sendspittleemailwithattachment (stirng to, spittle spittle) throws messagingexception { mimemessage message = mailsender.createmimemessage(); mimemessagehelper helper = new mimemessagehelper(message, true); string spittername = spittle.getspitter().getfullname(); helper.setform("...@spitter.com"); helper.setto(to); helper.setsubject("new spittle from " + spittername); helper.settext(spittername + " says: " +spittle.gettext()); filesystemresource image = new filesystemresource("/file/test.png"); helper.addattachment("test.png", image); mailsender.send(message); }
到此就成功发送一个带有附件的email了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。