溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

使用Spring的JAVA Mail支持簡化郵件發(fā)送功能

發(fā)布時(shí)間:2020-08-29 20:54:06 來源:腳本之家 閱讀:121 作者:onyas 欄目:編程語言

閑來無事,翻看《Spring in Action》,發(fā)現(xiàn)Spring集成了對(duì)JAVA Mail的支持,有點(diǎn)小激動(dòng)的看了一遍,嗯,話說真的簡單了很多。

Spring的郵件發(fā)送的核心是MailSender接口,在Spring3.0中提供了一個(gè)實(shí)現(xiàn)類JavaMailSenderImpl,這個(gè)類是發(fā)送郵件的核心類??梢酝ㄟ^在配置文件中配置使用,當(dāng)然也可以自己硬編碼到代碼中(方便起見,下面的演示代碼都是硬編碼到代碼中,省得配置麻煩)。

Spring提供的郵件發(fā)送不僅支持簡單郵件的發(fā)送、添加附件,而且還可以使用velocity模板控制頁面樣式(應(yīng)該也支持freemarker)。

首先對(duì)加入相應(yīng)Spring jar包和Java Mail 的jar包。

我們首先得聲明一個(gè)MailSender對(duì)象,因?yàn)镸ailSender對(duì)象只有兩個(gè)重載的send(...)方法,顯得有些簡陋,我們建議選用JavaMailSender接口,或者干脆直接使用實(shí)現(xiàn)類,JavaMailSenderImpl。筆者是使用的JavaMailSenderImpl對(duì)象,功能豐富。

聲明JavaMailSenderImpl對(duì)象,并在構(gòu)造函數(shù)中初始化(當(dāng)然也可以使用IoC容器初始化):

public class SpringMailSender
 {
 
 //
 Spring的郵件工具類,實(shí)現(xiàn)了MailSender和JavaMailSender接口
 private JavaMailSenderImpl
 mailSender;
  
 public SpringMailSender()
 {
 //
 初始化JavaMailSenderImpl,當(dāng)然推薦在spring配置文件中配置,這里是為了簡單
 mailSender
 = new JavaMailSenderImpl();
 //
 設(shè)置參數(shù)
 mailSender.setHost("smtp.qq.com");
 mailSender.setUsername("mosaic@qq.com");
 mailSender.setPassword("asterisks");
 ...

得到了MailSender對(duì)象之后,就可以發(fā)送郵件了,下面是示例代碼,沒有封裝,僅供參考。

1、發(fā)送簡單郵件

/**
 *
 簡單郵件發(fā)送
 *
 */
public void simpleSend()
 {
 //
 構(gòu)建簡單郵件對(duì)象,見名知意
 SimpleMailMessage
 smm = new SimpleMailMessage();
 //
 設(shè)定郵件參數(shù)
 smm.setFrom(mailSender.getUsername());
 smm.setTo("mosaic@126.com");
 smm.setSubject("Hello
 world");
 smm.setText("Hello
 world via spring mail sender");
 //
 發(fā)送郵件
 mailSender.send(smm);
}

2、發(fā)送帶附件的郵件

/**
 *
 帶附件的郵件發(fā)送
 *
 *
 @throws MessagingException
 */
public void attachedSend()
throws MessagingException
 {
 //使用JavaMail的MimeMessage,支付更加復(fù)雜的郵件格式和內(nèi)容
 MimeMessage
 msg = mailSender.createMimeMessage();
 //創(chuàng)建MimeMessageHelper對(duì)象,處理MimeMessage的輔助類
 MimeMessageHelper
 helper = new MimeMessageHelper(msg,
true);
 //使用輔助類MimeMessage設(shè)定參數(shù)
 helper.setFrom(mailSender.getUsername());
 helper.setTo("mosaic@126.com");
 helper.setSubject("Hello
 Attachment");
 helper.setText("This
 is a mail with attachment");
 //加載文件資源,作為附件
 ClassPathResource
 file = new ClassPathResource(
   "Chrysanthemum.jpg");
 //加入附件
 helper.addAttachment("attachment.jpg",
 file);
 //發(fā)送郵件
 mailSender.send(msg);
}

3、發(fā)送富文本郵件

/**發(fā)送富文本郵件
 *
 @throws MessagingException
 */
public void richContentSend()
throws MessagingException
 {
 MimeMessage
 msg = mailSender.createMimeMessage();
 
 MimeMessageHelper
 helper = new MimeMessageHelper(msg,
true);
 
 helper.setFrom(mailSender.getUsername());
 helper.setTo("mosaic@126.com");
 helper.setSubject("Rich
 content mail");
 //第二個(gè)參數(shù)true,表示text的內(nèi)容為html,然后注意<img/>標(biāo)簽,src='cid:file','cid'是contentId的縮寫,'file'是一個(gè)標(biāo)記,需要在后面的代碼中調(diào)用MimeMessageHelper的addInline方法替代成文件
 helper.setText(
   "<body><p>Hello
 Html Email</p><img src='cid:file'/></body>",
   true);
 
 FileSystemResource
 file = new FileSystemResource(
   "C:\\Users\\Public\\Pictures\\Sample
 Pictures\\Chrysanthemum.jpg");
 helper.addInline("file",
 file);
 
 mailSender.send(msg);
}

 4、使用Velocity模板確定郵件風(fēng)格

使用Velocity模板,需要Velocity的jar包,可以在官方網(wǎng)站下載,并加入ClassPath,然后需要聲明一個(gè)VelocityEngine對(duì)象,具體的參考下面代碼,這是筆者第一次使用Velocity,不甚了解,言多有失,望見諒。

聲明一個(gè)VelocityEngine對(duì)象,并在構(gòu)造函數(shù)中初始化(IoC is optional)

...
private VelocityEngine
 velocityEngine;
 
public SpringMailSender()
 {
  ...
 //
 Velocity的參數(shù),通過VelocityEngineFactoryBean創(chuàng)建VelocityEngine,也是推薦在配置文件中配置的
 Properties
 props = System.getProperties();
 props.put("resource.loader",
"class");
 props
   .put("class.resource.loader.class",
     "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
 VelocityEngineFactoryBean
 v = new VelocityEngineFactoryBean();
 v.setVelocityProperties(props);
 try {
  velocityEngine
 = v.createVelocityEngine();
 }
catch (VelocityException
 e) {
  e.printStackTrace();
 }
catch (IOException
 e) {
  e.printStackTrace();
 }
 
}

簡單的Velocity模板文件(index.vm):

<html>
<head>
<style type="text/css">
h5{
 color:red;
 background:#efefef;
}
</style>
</head>
<body>
<h5>${user}
 </h5>
<p><p>
<i>${content}</i>
</body>
</html>

開起來貌似很容易理解,只是普通的Html文件,使用了一些${placeholder}作為占位符。

Java要做的,就是加載模板,并將相應(yīng)的值插入到占位符當(dāng)中。

/**
 *
 使用Velocity模板發(fā)送郵件
 *
 *
 @throws MessagingException
 */
public
 void templateSend() throws MessagingException {
 //
 聲明Map對(duì)象,并填入用來填充模板文件的鍵值對(duì)
 Map<String,
 String> model = new HashMap<String,
 String>();
 model.put("user",
 "MZULE");
 model.put("content",
 "Hello");
 //
 Spring提供的VelocityEngineUtils將模板進(jìn)行數(shù)據(jù)填充,并轉(zhuǎn)換成普通的String對(duì)象
 String
 emailText = VelocityEngineUtils.mergeTemplateIntoString(
   velocityEngine,
 "index.vm", model);
 //
 和上面一樣的發(fā)送郵件的工作
 MimeMessage
 msg = mailSender.createMimeMessage();
 MimeMessageHelper
 helper = new MimeMessageHelper(msg, true);
 helper.setFrom(mailSender.getUsername());
 helper.setTo("mosaic@126.com");
 helper.setSubject("Rich
 content mail");
 helper.setText(emailText,
 true);
 
 mailSender.send(msg);
}

Spring可謂是大大簡化了郵件的發(fā)送步驟,雖然我們自己封裝可能實(shí)現(xiàn)起來并不復(fù)雜,但是,有現(xiàn)成的有何必要重新造輪子呢?(當(dāng)然造輪子可以學(xué)到很多)

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI