欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java使用Spring发送邮件的实现代码

程序员文章站 2024-03-05 22:35:43
spring email抽象的核心是mailsender接口,mailsender的实现能够通过连接email服务器实现邮件发送的功能,如下图: spring自带...

spring email抽象的核心是mailsender接口,mailsender的实现能够通过连接email服务器实现邮件发送的功能,如下图:

Java使用Spring发送邮件的实现代码

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了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。