用WordPress開發企業官網或者B2B營銷型網站或者B2C零售網站,
總是需要有一個郵件提醒功能的。
每當網站上有訪客提交詢盤,或者有人下單購物了,又或者網除了什么系統問題,作為WordPress網站管理員來說,都希望能夠收到一個郵件通知,這樣就能時時刻刻關注網站動態了。
很多WordPress新手搭建的網站,
往往都不懂怎么設置郵件提醒。
WP花園作為一家專業為客戶提供WordPress企業級服務的科技公司,
將會在這篇文章中詳細介紹如何通過WP-AMIL-SMTP插件,
來幫助您收到來WordPress網站的任何提醒!
開始準備好小板凳,上課咯!
這個是一個免費的WordPress郵件SMTP設置插件,
您可以直接在WordPress的插件庫中通過名字的搜索找到,
或者你直接就輸入smtp,然后第一個安裝量最多的那個插件,就是你想要找的了:
安裝好插件之后,
你會在WordPress后臺的左邊欄目中看到WP MAIL SMTP的條目,
點進去就能進入設置頁面。
這個WordPress郵件提醒插件的設置,
很多新人第一次操作的時候,
往往會因為其中的一個小問題,導致沒法對外發送郵件。
其實只要做過一次SMTP郵件插件的設置后,以后新的網站,都能照搬相同的配置了。
在這篇文章中,我們以阿里云郵箱為例,做一個國內的smtp郵件服務器設置。
當你進入到了WP MAIL SMTP編輯頁面后,
直接無視他的授權碼版塊,
在發件人中填寫你要用來發郵件的郵箱地址,
然后勾選強制使用:
接著往下移動,設置一下【發件人名稱】,也勾選強制使用,返回路徑也順便勾選一下。
然后再【郵件程序】中選擇【其他SMTP】,這個很重要,不要選錯了:
當你勾選了【其他SMTP】以后,你會看到更多設置的字段,這里非常復雜,我們一一為您講解:
按照上述設置好之后,點擊保存按鈕。
好的,你認真填寫了各種內容,但是怎么知道這些信息是正確的呢?
點擊WP MAIL SMTP插件編輯頁面中的【電子郵件測試】,進入到一個新的頁面,輸入您的另一個常用郵箱,然后啟用HTML,點擊發送電子郵件:
如果你操作正確,那么1分鐘之內,您會收到這封郵件:
很好,現在你可以開始接受網站的任何消息提示了!
其實工作到這里,還沒有完成。
WP MAIL SMTP插件只是幫你開啟了一個能夠在WordPress網站對外發送郵件的郵箱地址(也就是你設置的那個)。
但是為了和其他插件配合使用,在其他插件設置的過程中,在【發件人】選項,要記得填寫你設置的這個郵箱地址。
舉個例子,我們最常用的contact form 7中,想要收到網站表單提交的郵件提醒,就要在contact form 7的郵件編輯頁面,寫上你的這個郵箱地址:
不要忘記了喲,其他插件也是類似的操作。
作為一家專業的WordPress網站開發公司,我們每一個幫客戶開發的WordPress網站,都要設置一個郵件提醒功能,所以WP MAIL SMTP是一個非常重要的插件。
在這篇文章中,
我們詳細介紹了這個插件的使用方法。
小朋友們,你學會了嗎?
想要開發一個高級的WordPress網站,歡迎聯系我們專業的團隊!
送郵件常用的有163郵箱,qq郵箱,其中發送郵件的協議叫SMTP,接收郵件的協議叫POP3/IMAP,IMAP協議比POP3更強大,不過我們不需要要關注,因為服務器集成郵件只會涉及到發送郵件,一般不涉及接收郵件。
我們已163郵箱為例來講解,首先要開通允許客戶端發送郵件的功能
登錄進163郵箱后,點擊設置
?
選擇開啟服務,下面兩個隨便哪個都可以,點擊開啟后會提示掃碼發送短信,發完短信會顯示授權碼, 這個授權碼只會顯示一次,要記錄下來,后面會用到
?
接下來就是代碼階段了
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
spring:
mail:
#smtp服務主機 qq郵箱則為smtp.qq.com
host: smtp.163.com
port: 465 #端口不要使用默認的25,阿里云無法開通這個端口,使用465
protocol: smtps
# 編碼集
default-encoding: UTF-8
#發送郵件的賬戶
username: xxxxxxx@163.com
#授權碼
password: xxxxxx
test-connection: true
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
@Service
public class EmailService {
@Value("${spring.mail.username}")
private String from;
@Autowired
private JavaMailSender mailSender;
/**
* 發送純文本郵件
*
* @param tos 接收方
* @param subject 主題
* @param content 郵件內容
* @return
*/
public void sendTxtMail(String[] tos, String subject, String content) {
//創建簡單郵件消息
SimpleMailMessage message=new SimpleMailMessage();
message.setFrom(from);
message.setTo(tos);
message.setSubject(subject);
message.setText(content);
try {
mailSender.send(message);
} catch (MailException e) {
e.printStackTrace();
throw new ServiceFailException("發送郵件失敗", e);
}
}
}
public void sendHtmlEmail(String[] tos, String subject, String html) {
try {
//創建一個MINE消息
MimeMessage message=mailSender.createMimeMessage();
MimeMessageHelper minehelper=new MimeMessageHelper(message, true);
minehelper.setFrom(from);
minehelper.setTo(tos);
minehelper.setSubject(subject);
//郵件內容 true 表示帶有附件或html
minehelper.setText(html, true);
mailSender.send(message);
} catch (Exception e) {
throw new ServiceFailException("發送郵件失敗", e);
}
}
由于發送附件的時間較長,所有我們用@Async注解做成異步的,SpringBoot的異步線程只有一個,所以并發量大的話會有延遲,有條件的話可以把發送郵件的任務放入MQ,然后從MQ中取出再執行。
/**
* 發送帶附件的郵件,附件格式為Multipart
*
* @param tos
* @param subject
* @param html
* @param files
*/
@Async
public void sendMultipartEmail(String[] tos, String subject, String html, List<MultipartFile> files) {
List<File> list=new ArrayList<>();
List<ResourceBean> resourceBeans=new ArrayList<>();
if (CollectionUtils.isNotEmpty(files)) {
for (MultipartFile multipartFile : files) {
//把multipart轉成file
Optional<File> optionalFile=FileUtils.multipartFileToFile(multipartFile);
//存在則放入list
optionalFile.ifPresent(file -> {
list.add(file);
resourceBeans.add(new ResourceBean(new FileSystemResource(file), multipartFile.getOriginalFilename()));
});
}
}
sendResourceEmail(tos, subject, html, resourceBeans);
//發送完刪除臨時文件
for (File file : list) {
file.delete();
}
}
/**
* 發送帶附件的郵件,File格式
*
* @param tos
* @param subject
* @param html
* @param files
*/
@Async
public void sendHtmlEmail(String[] tos, String subject, String html, List<File> files) {
List<ResourceBean> resourceBeans=files.stream().map(file -> new ResourceBean(new FileSystemResource(file), file.getName())).collect(Collectors.toList());
sendResourceEmail(tos, subject, html, resourceBeans);
}
private void sendResourceEmail(String[] tos, String subject, String html, List<ResourceBean> resourceBeans) {
//創建一個MINE消息
MimeMessage message=mailSender.createMimeMessage();
try {
MimeMessageHelper helper=new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(tos);
helper.setSubject(subject);
//郵件內容 true 表示帶有附件或html
helper.setText(html, true);
if (CollectionUtils.isNotEmpty(resourceBeans)) {
for (ResourceBean resourceBean : resourceBeans) {
//添加附件
helper.addAttachment(resourceBean.getFilename(), resourceBean.getResource());
}
}
mailSender.send(message);
} catch (Exception e) {
throw new ServiceFailException("發送郵件失敗", e);
}
}
@Getter
@Setter
@AllArgsConstructor
static class ResourceBean {
FileSystemResource resource;
String filename;
}
下面是MultipartFile轉File的方法
/**
* multiFile轉成file,在本地生成一個文件,文件名隨機,使用完需刪除
*
* @param multiFile 要轉換的文件
* @return
*/
public static Optional<File> multipartFileToFile(MultipartFile multiFile) {
// 獲取文件名
String fileName=multiFile.getOriginalFilename();
// 獲取文件后綴
String prefix=getExtention(fileName);
try {
File file=File.createTempFile(UUIDUtils.getUUID(), prefix);
file.deleteOnExit();
multiFile.transferTo(file);
return Optional.of(file);
} catch (Exception e) {
e.printStackTrace();
}
return Optional.empty();
}
我們使用thymeleaf作為模板來發送郵件,首先引入依賴
<!-- thymeleaf模板 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
加入配置項,所有模板放在類路徑的templates下面并且以html結尾
spring:
thymeleaf:
cache: false
mode: LEGACYHTML5
prefix: classpath:/templates/
suffix: .html
然后在建一個mail.html
?
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>郵件模板</title>
</head>
<body>
<p>您好,感謝您的注冊,這時一封驗證郵件,請點擊下面的鏈接完成注冊!</p>
<a href="#" th:href="@{http://www.baidu.com(id=${id})}">點我完成注冊</a>
</body>
</html>
使用templateEngine拿到模板和參數,渲染成html, 之后就跟發送html郵件一樣了
@Async
public void sendTemplateEmail(String[] tos, String subject, String templateName, Map<String, Object> params) {
Context context=new Context();
//設置參數
if (params !=null) {
Set<Map.Entry<String, Object>> entrySet=params.entrySet();
entrySet.stream().forEach(entry -> context.setVariable(entry.getKey(), entry.getValue()));
}
//渲染模板,獲得html內容
String html=templateEngine.process("email/" + templateName, context);
sendHtmlEmail(tos, subject, html);
}
?
*請認真填寫需求信息,我們會在24小時內與您取得聯系。