Spring Email抽象的核心是MailSender接口,MailSender的實現能夠通過連接Email服務器實現郵件發送的功能,如下圖:
Spring自帶一個MailSender的實現就是JavaMailSenderImpl,它也是使用JavaMail API來發送Email,在使用之前,必須先將JavaMailSenderImpl裝配為Spring應用上下文中的一個bean,如下所示:
1
2
3
4
5
6
|
@Bean public MailSender mailSender (Environment env) { JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); mailSender.setHost(env.getProperty( "mailserver.host" )); return mailSender; } |
默認情況下,JavaMailSenderImpl假設郵件服務器監聽25端口,如果郵件服務器監聽不同的端口,可以使用port屬性指定其端口號,在上面的mailSender()方法中添加:
1
|
mailSender.setPort(env.getProperty( "mailserver.port" )); |
如果郵件服務器需要認證的話,還需要設置username和password:
1
2
|
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:
1
2
3
4
5
6
7
8
|
@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中了:
1
2
3
4
5
6
|
@Bean public MailSender mailSender (MailSession mailSession) { JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); mailSender.setSession(mailSession); return mailSender; } |
通過將郵件會話裝配到JavaMailSenderImpl的session屬性中,就完全替換了原來的服務器配置,現在郵件會話完全通過JNDI進行配置和管理,JavaMailSenderImpl就可以專注于發送郵件而不必自己處理郵件服務器了。
接著需要將mailSender裝配到我們的業務層實現類中(假設為SpitterEmailServiceImpl類),如下:
1
2
|
@Autowired JavaMailSender mailSender; |
接著想要給Spitter用戶發送Email提示他的朋友寫了新的Spittle,這時需要一個方法來發送Email,這個方法要接受Email地址和Spittle對象信息,如下方法就是使用郵件發送器完成該功能:
1
2
3
4
5
6
7
8
9
|
public void sendSimpleSpittleEmail (Stirng to, Spittle spittle) { SimpleMailMessage message = new SimpleMailMessage(); String spitterName = spittle.getSpitter().getFullName(); 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( )方法開始:
1
|
MimeMessage message = mailSender.createMimeMessage(); |
不過這里使用javax.mail.internet.MimeMessage的API相對有點繁瑣,可以使用Spring提供的MimeMessageHelper簡便操作,實例化它時將MimeMessage傳給它。
MimeMessageHelper helper = new MimeMessageHelper(message, true); // true表示是multipart類型
得到MimeMessageHelper實例后,就可以開始組裝Email消息了:
1
2
3
4
5
|
String spitterName = spittle.getSpitter().getFullName(); helper.setTo(to); helper.setSubject( "New spittle from " + spitterName); helper.setText(spitterName + " says: " +spittle.getText()); |
下面添加附件,以圖片為例,只要將這個資源傳遞給helper的addAttachment方法即可:
1
2
|
FileSystemResource image = new FileSystemResource( "/file/test.png" ); helper.addAttachment( "test.png" , image); |
這里使用Spring的FileSystemResource來加載位于類路徑下的test.png,再調用addAttachment(),第一個參數是要添加到Email中附件的名稱,第二個參數是資源文件。
到這里multipart類型的Email已經構建完成,現在就要使用MimeMessageHelper發送帶有附件的Email,完整代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
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.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了。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://www.cnblogs.com/weknow619/p/6500764.html