【Spring】使用Spring发送邮件

[size=large]Spring Email抽象的核心是MailSender接口,MailSender的实现能够通过连接Email服务器实现邮件发送的功能,如下图:[/size]
[img]http://images2015.cnblogs.com/blog/1044046/201703/1044046-20170304104825282-276902980.jpg[/img]
[size=large]Spring自带一个MailSender的实现就是JavaMailSenderImpl,它也是使用JavaMail API来发送Email,在使用之前,必须先将JavaMailSenderImpl装配为Spring应用上下文中的一个bean,如下所示:[/size]

@Bean
public MailSender mailSender (Environment env) {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost(env.getProperty("mailserver.host"));
return mailSender;
}

[size=large]默认情况下,JavaMailSenderImpl假设邮件服务器监听25端口,如果邮件服务器监听不同的端口,可以使用port属性指定其端口号,在上面的mailSender()方法中添加:[/size]
mailSender.setPort(env.getProperty("mailserver.port"));

[size=large]如果邮件服务器需要认证的话,还需要设置username和password:[/size]

mailSender.setUsername(env.getProperty("mailserver.username"));
mailSender.setPassword(env.getProperty("mailserver.password"));

[size=large]这样JavaMailSenderImpl已经配置完成,到此可以创建自己的邮件会话,如果已经在JNDI中配置了javax.mail.MailSession的话就没有必要为JavaMailSenderImpl配置详细的服务器细节了,可以配置它使用JNDI中已就绪的MailSession。

使用JndiObjectFactoryBean,可以在如下的@Bean方法中配置一个bean,它会从JNDI中查找MailSession:[/size]

@Bean
public JndiObjectFactoryBean mailSession ( ) {
JndiObjectFactoryBean jndi = new JndiObjectFactoryBean();
jndi.setJndiName("mail/Session");
jndi.setProxyInterface(MailSession.class);
jndi.setResourceRef(true);
return jndi;
}

[size=large]接着可以使用Spring的<jee:jndi-lookup>元素从JNDI中获取对象,这里可以使用<jee:jndi-lookup>来创建一个bean,它引用了JNDI中的邮件会话:[/size]

<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;
}

[size=large]通过将邮件会话装配到JavaMailSenderImpl的session属性中,就完全替换了原来的服务器配置,现在邮件会话完全通过JNDI进行配置和管理,JavaMailSenderImpl就可以专注于发送邮件而不必自己处理邮件服务器了。

接着需要将mailSender装配到我们的业务层实现类中(假设为SpitterEmailServiceImpl类),如下:[/size]

@Autowired
JavaMailSender mailSender;

[size=large]接着想要给Spitter用户发送Email提示他的朋友写了新的Spittle,这时需要一个方法来发送Email,这个方法要接受Email地址和Spittle对象信息,如下方法就是使用邮件发送器完成该功能:[/size]

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);
}

[size=large]上面代码中最后一步将消息传递给邮件发送器的send()方法,这样邮件就发送出去了。[/size]

[size=x-large][b]发送带附件的Email[/b][/size]
[size=large]消息发送成功了,现在尝试发送带有附件的Email,要发送附件先要创建multipart类型的消息,Email由多个部分组成,其中一部分是Email体,其他部分就是附件。要发送multipart类型的Email,需要创建一个MIME的消息,可以从邮件发送器的createMimeMessage( )方法开始:[/size]

MimeMessage message = mailSender.createMimeMessage();

[size=large]不过这里使用javax.mail.internet.MimeMessage的API相对有点繁琐,可以使用Spring提供的MimeMessageHelper简便操作,实例化它时将MimeMessage传给它。[/size]

MimeMessageHelper helper = new MimeMessageHelper(message, true); // true表示是multipart类型

[size=large]得到MimeMessageHelper实例后,就可以开始组装Email消息了:[/size]

String spitterName = spittle.getSpitter().getFullName();
helper.setForm("...@spitter.com");
helper.setTo(to);
helper.setSubject("New spittle from " + spitterName);
helper.setText(spitterName + " says: " +spittle.getText());

[size=large]下面添加附件,以图片为例,只要将这个资源传递给helper的addAttachment方法即可:[/size]

FileSystemResource image = new FileSystemResource("/file/test.png");
helper.addAttachment("test.png", image);

[size=large]这里使用Spring的FileSystemResource来加载位于类路径下的test.png,再调用addAttachment(),第一个参数是要添加到Email中附件的名称,第二个参数是资源文件。

到这里multipart类型的Email已经构建完成,现在就要使用MimeMessageHelper发送带有附件的Email,完整代码如下:[/size]

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);
}

[size=large]到此就成功发送一个带有附件的Email了。



注:更多文章欢迎公众号中查看,公号Id:weknow619。[/size]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值