SpringBoot配置Email發(fā)送功能實(shí)例
本篇介紹在SpringBoot中配置Email服務(wù)的具體步驟,以及常見的異常分析。
具體案例以QQ郵箱以及QQ企業(yè)郵箱為例。
- QQ郵箱發(fā)送方式
- QQ企業(yè)郵箱發(fā)送方式
- 總結(jié)
tips:
下面提到的hashIndex指的是一個(gè)元素put到hashmap中時(shí),要根據(jù)其key.hashcode & (table.size()-1)來決定其在table中的位置。
table是一個(gè)數(shù)組,類型為Node。Node是hashmap的一個(gè)內(nèi)部類,用來描述hashmap的元素的一些屬性。
1.相關(guān)依賴包
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.0.RELEASE</version>
</parent>
<dependencies>
<!-- springBoot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.3.0.RELEASE</version>
</dependency>
<!-- email -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!-- html模板 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-velocity</artifactId>
</dependency>
</dependencies>
SpringBoot以及mail的依賴包就不做解釋了。
這里簡(jiǎn)單介紹下velocity的作用:
Velocity 是一個(gè)基于 Java 的模板引擎框架,提供的模板語(yǔ)言可以使用在 Java 中定義的對(duì)象和變量上。
作為郵件模板也是它的一個(gè)主要應(yīng)用場(chǎng)景。
具體用法在下面會(huì)進(jìn)行說明。
2.具體案例
1.使用QQ郵箱進(jìn)行發(fā)送
application.properties
#發(fā)送郵箱(可以填你自己的郵箱) email.from = xxxxxxx@qq.com #目標(biāo)郵箱 email.to = #郵箱服務(wù)器 email.host = smtp.qq.com #授權(quán)碼,在QQ郵箱客戶端生成 email.auth = kpzmxhrkqklwbbbd
大家可能不理解auth授權(quán)碼是干什么用的。
這相當(dāng)于是當(dāng)以第三方形式登錄時(shí)用非密碼驗(yàn)證的一種手段。
在QQ郵箱->設(shè)置->賬戶 往下拉可以找到。
同時(shí)需要把POP3/SMTP服務(wù)開啟。

JavaMailSender
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import java.util.Properties;
/**
* author : qianweifeng
* date : 16/4/9.
* describe :
*/
@Configuration
public class MailConfig {
@Autowired
private Environment env;
@Bean(name = "JavaMailSender")
public JavaMailSender getSender(){
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
javaMailSender.setUsername(env.getProperty(ConfigConstant.EMAIL_FROM));
javaMailSender.setHost(env.getProperty(ConfigConstant.EMAIL_HOST));
javaMailSender.setPort(587);//①
javaMailSender.setDefaultEncoding("UTF-8");
Properties props = new Properties();//②
props.setProperty("mail.smtp.host", env.getProperty(ConfigConstant.EMAIL_HOST));
props.setProperty("mail.smtp.auth", "true");
javax.mail.Session session = javax.mail.Session.getDefaultInstance(props,new Authenticator(){
@Override
protected PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication("xxxxxx@qq.com",env.getProperty(ConfigConstant.EMAIL_AUTH));
}
});
javaMailSender.setSession(session);//③
return javaMailSender;
}
}
這是Java郵件發(fā)送的一個(gè)具體實(shí)現(xiàn)Bean。
關(guān)于JavaMailSender的內(nèi)容大家自行看源碼或者度娘。
這里說明3個(gè)方面。
1.javaMailSender.setPort(587) 這個(gè)端口不是隨意設(shè)置的,根據(jù)郵箱服務(wù)器以及協(xié)議來定的。我在網(wǎng)上找了相關(guān)資料,大家參考下:

2.關(guān)于Properties的設(shè)置。這里只需要設(shè)置其郵箱服務(wù)器以及啟用授權(quán)碼驗(yàn)證方式即可。
3.session完成的使用授權(quán)碼驗(yàn)證郵件發(fā)送方,相當(dāng)于建立起一個(gè)有效會(huì)話。
import com.service.config.ConfigConstant;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.SmartLifecycle;
import org.springframework.core.env.Environment;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;
import org.springframework.stereotype.Component;
import javax.mail.internet.MimeMessage;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
/**
* author : qianweifeng
* date : 16/4/9.
* describe :
*/
@Component
public class MailUtil implements SmartLifecycle {
@Autowired
private JavaMailSender javaMailSender;
@Autowired
private Environment env;
private Logger logger = LoggerFactory.getLogger(MailUtil.class);
private ScheduledExecutorService service = Executors.newScheduledThreadPool(2);
private final AtomicInteger count = new AtomicInteger(1);
public MimeMessagePreparator Send(final String text) {
MimeMessagePreparator preparator = new MimeMessagePreparator() {
public void prepare(MimeMessage mimeMessage) throws Exception {
MimeMessageHelper message = new MimeMessageHelper(mimeMessage);
message.setTo(env.getProperty(ConfigConstant.EMAIL_TO));
message.setFrom(env.getProperty(ConfigConstant.EMAIL_FROM));
message.setSubject("java email send test");
// String text = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "velocity/report.vm", "UTF-8", model);
message.setText(text, true);
}
};
return preparator;
}
@Override
public boolean isAutoStartup() {
return true;
}
@Override
public void stop(Runnable runnable) {
}
@Override
public void start() {
service.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
try {
if (count.get() == 2) {
service.shutdown();
logger.info("the task is down");
}
logger.info("start send email and the index is " + count);
javaMailSender.send(Send("test !" + "*" + count.getAndIncrement()));
logger.info("send email success");
}catch (Exception e){
logger.error("send email fail" , e);
}
}
},2000,2000, TimeUnit.MILLISECONDS);
}
@Override
public void stop() {
}
@Override
public boolean isRunning() {
return false;
}
@Override
public int getPhase() {
return 0;
}
}
使用方式:
將郵件服務(wù)器,授權(quán)碼,發(fā)送方,接受放在application.properties配置好。
項(xiàng)目啟動(dòng)后就會(huì)開始發(fā)送,總共發(fā)送2封郵件。
使用velocity來構(gòu)建郵件正文
public void send(final String date, final String date2) {
final List<UVBean> uVBean = getUV(start, end);
final List<UserResAndLoginReport> resAndLoginReports = dao.RegisterAndLogin(start, end);
Map model = new HashMap();
model.put("uVBean", uVBean);
model.put("resAndLoginReports", resAndLoginReports);
String text = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "velocity/report.vm", "UTF-8", model);
}
<h3>1.UV</h3>
<TABLE border="1px" style="border-collapse: collapse;">
<TR>
<td nowrap="nowarp" style="width:80px;" class="date">日期</td>
<td nowrap="nowarp" style="width:120px;" class="head">UV</td>
</TR>
#foreach( $data in $uVBean )
<TR>
<TD nowrap="nowarp" class="date">${data.date}</TD>
<TD nowrap="nowarp" class="count">${data.data}</TD>
</TR>
#end
</TABLE>
...
假設(shè)我們需要在郵件中顯示的一些復(fù)雜內(nèi)容,可以后臺(tái)以對(duì)象的形式包裝起來,放入一個(gè)hashmap中,在velocity解析出來,至于如何解析,那就是velocity的語(yǔ)義的問題了。
使用velocity可以在郵件正文中以html的方式來豐富化郵件。
2.使用QQ企業(yè)郵箱進(jìn)行發(fā)送
過程以及代碼幾乎相同
區(qū)別是郵件服務(wù)器為:smtp.exmail.qq.com或者pop.exmail.qq.com
沒有授權(quán)碼這一概念。
發(fā)送端口號(hào)25或者SMTP協(xié)議下端口為465,POP協(xié)議下端口為995。
推薦驗(yàn)證方式為直接用戶名+密碼,或者用ssl方式進(jìn)行驗(yàn)證。
給出一個(gè)簡(jiǎn)單的樣例:
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
javaMailSender.setUsername(env.getProperty("spring.mail.username"));
javaMailSender.setHost(env.getProperty("spring.mail.host"));
javaMailSender.setPassword(env.getProperty("spring.mail.password"));
javaMailSender.setPort(25);
javaMailSender.setDefaultEncoding("UTF-8");
javaMailSender.send(preparator);
preparator就是上面出現(xiàn)過的MimeMessagePreparator的實(shí)例。配置方法見上。
3.總結(jié)
1.發(fā)送郵件我們首要配置的包括:郵箱服務(wù)器,協(xié)議,端口。
2.一般驗(yàn)證有兩種方式,一種是直接的用戶名密碼,另一種是通過授權(quán)碼或者ssl進(jìn)行驗(yàn)證。
3.郵件的正文可以是純文本,或者是html內(nèi)容,html內(nèi)容可以由velocity模板構(gòu)建或者直接用字符串構(gòu)建出html內(nèi)容。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot整合TKMyBatis實(shí)現(xiàn)單表增刪改查操作
據(jù)說tk.mybatis能夠讓我不寫sql代碼就可以所有單表操作問題,作為熱愛偷懶的我,怎么能放過這種機(jī)會(huì)。talk is cheap, show me the code。趕緊搞個(gè)例子爽一把先2023-01-01
SpringBoot+jsp項(xiàng)目啟動(dòng)出現(xiàn)404的解決方法
這篇文章主要介紹了SpringBoot+jsp項(xiàng)目啟動(dòng)出現(xiàn)404的解決方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03
Spring Shell應(yīng)用程序開發(fā)流程解析
這篇文章主要介紹了Spring Shell應(yīng)用程序開發(fā)流程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10
SpringBoot3 Spring WebFlux簡(jiǎn)介(推薦)
SpringWebFlux是Spring Framework 5中引入的響應(yīng)式Web框架,用于支持非阻塞異步通信和響應(yīng)式流處理,與傳統(tǒng)的SpringMVC相比,WebFlux提供了完全異步非阻塞的編程模型,適用高并發(fā)、微服務(wù)架構(gòu)和實(shí)時(shí)數(shù)據(jù)流,本文介紹SpringBoot3 Spring WebFlux簡(jiǎn)介,感興趣的朋友一起看看吧2024-10-10
java?webservice超時(shí)時(shí)間設(shè)置方法代碼
當(dāng)我們使用WebService進(jìn)行調(diào)用時(shí),有時(shí)會(huì)出現(xiàn)超時(shí)的情況,下面這篇文章主要給大家介紹了關(guān)于java?webservice超時(shí)時(shí)間設(shè)置方法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
java多線程編程之使用runnable接口創(chuàng)建線程
實(shí)現(xiàn)Runnable接口的類必須使用Thread類的實(shí)例才能創(chuàng)建線程,通過Runnable接口創(chuàng)建線程分為以下兩步2014-01-01

