Java使用Spring發(fā)送郵件的實(shí)現(xiàn)代碼
Spring Email抽象的核心是MailSender接口,MailSender的實(shí)現(xiàn)能夠通過(guò)連接Email服務(wù)器實(shí)現(xiàn)郵件發(fā)送的功能,如下圖:

Spring自帶一個(gè)MailSender的實(shí)現(xiàn)就是JavaMailSenderImpl,它也是使用JavaMail API來(lái)發(fā)送Email,在使用之前,必須先將JavaMailSenderImpl裝配為Spring應(yīng)用上下文中的一個(gè)bean,如下所示:
@Bean
public MailSender mailSender (Environment env) {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost(env.getProperty("mailserver.host"));
return mailSender;
}
默認(rèn)情況下,JavaMailSenderImpl假設(shè)郵件服務(wù)器監(jiān)聽(tīng)25端口,如果郵件服務(wù)器監(jiān)聽(tīng)不同的端口,可以使用port屬性指定其端口號(hào),在上面的mailSender()方法中添加:
mailSender.setPort(env.getProperty("mailserver.port"));
如果郵件服務(wù)器需要認(rèn)證的話,還需要設(shè)置username和password:
mailSender.setUsername(env.getProperty("mailserver.username"));
mailSender.setPassword(env.getProperty("mailserver.password"));
這樣JavaMailSenderImpl已經(jīng)配置完成,到此可以創(chuàng)建自己的郵件會(huì)話,如果已經(jīng)在JNDI中配置了javax.mail.MailSession的話就沒(méi)有必要為JavaMailSenderImpl配置詳細(xì)的服務(wù)器細(xì)節(jié)了,可以配置它使用JNDI中已就緒的MailSession。
使用JndiObjectFactoryBean,可以在如下的@Bean方法中配置一個(gè)bean,它會(huì)從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中獲取對(duì)象,這里可以使用<jee:jndi-lookup>來(lái)創(chuàng)建一個(gè)bean,它引用了JNDI中的郵件會(huì)話:
<jee:jndi-lookup id="mailSession" jndi-name="mail/Session" resource-ref="true">
郵件會(huì)話準(zhǔn)備好后,就可以將其裝配到mailSender bean中了:
@Bean
public MailSender mailSender (MailSession mailSession) {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setSession(mailSession);
return mailSender;
}
通過(guò)將郵件會(huì)話裝配到JavaMailSenderImpl的session屬性中,就完全替換了原來(lái)的服務(wù)器配置,現(xiàn)在郵件會(huì)話完全通過(guò)JNDI進(jìn)行配置和管理,JavaMailSenderImpl就可以專注于發(fā)送郵件而不必自己處理郵件服務(wù)器了。
接著需要將mailSender裝配到我們的業(yè)務(wù)層實(shí)現(xiàn)類中(假設(shè)為SpitterEmailServiceImpl類),如下:
@Autowired JavaMailSender mailSender;
接著想要給Spitter用戶發(fā)送Email提示他的朋友寫了新的Spittle,這時(shí)需要一個(gè)方法來(lái)發(fā)送Email,這個(gè)方法要接受Email地址和Spittle對(duì)象信息,如下方法就是使用郵件發(fā)送器完成該功能:
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);
}
上面代碼中最后一步將消息傳遞給郵件發(fā)送器的send()方法,這樣郵件就發(fā)送出去了。
發(fā)送帶附件的Email
消息發(fā)送成功了,現(xiàn)在嘗試發(fā)送帶有附件的Email,要發(fā)送附件先要?jiǎng)?chuàng)建multipart類型的消息,Email由多個(gè)部分組成,其中一部分是Email體,其他部分就是附件。要發(fā)送multipart類型的Email,需要?jiǎng)?chuàng)建一個(gè)MIME的消息,可以從郵件發(fā)送器的createMimeMessage( )方法開(kāi)始:
MimeMessage message = mailSender.createMimeMessage();
不過(guò)這里使用javax.mail.internet.MimeMessage的API相對(duì)有點(diǎn)繁瑣,可以使用Spring提供的MimeMessageHelper簡(jiǎn)便操作,實(shí)例化它時(shí)將MimeMessage傳給它。
MimeMessageHelper helper = new MimeMessageHelper(message, true); // true表示是multipart類型
得到MimeMessageHelper實(shí)例后,就可以開(kāi)始組裝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());
下面添加附件,以圖片為例,只要將這個(gè)資源傳遞給helper的addAttachment方法即可:
FileSystemResource image = new FileSystemResource("/file/test.png");
helper.addAttachment("test.png", image);
這里使用Spring的FileSystemResource來(lái)加載位于類路徑下的test.png,再調(diào)用addAttachment(),第一個(gè)參數(shù)是要添加到Email中附件的名稱,第二個(gè)參數(shù)是資源文件。
到這里multipart類型的Email已經(jīng)構(gòu)建完成,現(xiàn)在就要使用MimeMessageHelper發(fā)送帶有附件的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);
}
到此就成功發(fā)送一個(gè)帶有附件的Email了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Spring Boot發(fā)送郵件詳解
- 使用spring框架中的組件發(fā)送郵件功能說(shuō)明
- Spring Boot 發(fā)送郵件功能案例分析
- springMVC發(fā)送郵件的簡(jiǎn)單實(shí)現(xiàn)
- Spring+quartz實(shí)現(xiàn)定時(shí)發(fā)送郵件功能實(shí)例
- Spring Boot實(shí)戰(zhàn)之發(fā)送郵件示例代碼
- Spring Boot中利用JavaMailSender發(fā)送郵件的方法示例(附源碼)
- spring mail借助qq郵箱服務(wù)器發(fā)送郵件
- Spring學(xué)習(xí)筆記3之消息隊(duì)列(rabbitmq)發(fā)送郵件功能
- Java的Spring框架中實(shí)現(xiàn)發(fā)送郵件功能的核心代碼示例
- spring+maven實(shí)現(xiàn)發(fā)送郵件功能
相關(guān)文章
Spring Boot集成Spring Cache過(guò)程詳解
這篇文章主要介紹了Spring Boot集成Spring Cache過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
java數(shù)據(jù)結(jié)構(gòu)基礎(chǔ):算法
這篇文章主要介紹了Java的數(shù)據(jù)解構(gòu)基礎(chǔ),希望對(duì)廣大的程序愛(ài)好者有所幫助,同時(shí)祝大家有一個(gè)好成績(jī),需要的朋友可以參考下,希望能給你帶來(lái)幫助2021-07-07
Java基于裝飾者模式實(shí)現(xiàn)的染色饅頭案例詳解
這篇文章主要介紹了Java基于裝飾者模式實(shí)現(xiàn)的染色饅頭案例,簡(jiǎn)單描述了裝飾者模式的概念、原理及Java使用裝飾者模式的相關(guān)實(shí)現(xiàn)步驟、操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-05-05
Java線上問(wèn)題排查神器Arthas實(shí)戰(zhàn)原理解析
原先我們Java中我們常用分析問(wèn)題一般是使用JDK自帶或第三方的分析工具如jstat、jmap、jstack、?jconsole、visualvm、Java?Mission?Control、MAT等,還有一款神器Arthas工具,可幫助程序員解決很多繁瑣的問(wèn)題,感興趣的朋友一起看看吧2022-01-01
Java連接MQ實(shí)現(xiàn)信息查詢的操作過(guò)程
本文介紹了如何使用Java連接ApacheRocketMQ實(shí)現(xiàn)信息查詢的功能,通過(guò)編寫Java代碼連接MQ并實(shí)現(xiàn)生產(chǎn)者發(fā)送消息和消費(fèi)者接收并處理消息的過(guò)程,展示了如何在分布式系統(tǒng)中實(shí)現(xiàn)訂單處理系統(tǒng)的解耦,感興趣的朋友跟隨小編一起看看吧2024-11-11

