Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
用WordPress開(kāi)發(fā)企業(yè)官網(wǎng)或者B2B營(yíng)銷型網(wǎng)站或者B2C零售網(wǎng)站,
總是需要有一個(gè)郵件提醒功能的。
每當(dāng)網(wǎng)站上有訪客提交詢盤,或者有人下單購(gòu)物了,又或者網(wǎng)除了什么系統(tǒng)問(wèn)題,作為WordPress網(wǎng)站管理員來(lái)說(shuō),都希望能夠收到一個(gè)郵件通知,這樣就能時(shí)時(shí)刻刻關(guān)注網(wǎng)站動(dòng)態(tài)了。
很多WordPress新手搭建的網(wǎng)站,
往往都不懂怎么設(shè)置郵件提醒。
WP花園作為一家專業(yè)為客戶提供WordPress企業(yè)級(jí)服務(wù)的科技公司,
將會(huì)在這篇文章中詳細(xì)介紹如何通過(guò)WP-AMIL-SMTP插件,
來(lái)幫助您收到來(lái)WordPress網(wǎng)站的任何提醒!
開(kāi)始準(zhǔn)備好小板凳,上課咯!
這個(gè)是一個(gè)免費(fèi)的WordPress郵件SMTP設(shè)置插件,
您可以直接在WordPress的插件庫(kù)中通過(guò)名字的搜索找到,
或者你直接就輸入smtp,然后第一個(gè)安裝量最多的那個(gè)插件,就是你想要找的了:
安裝好插件之后,
你會(huì)在WordPress后臺(tái)的左邊欄目中看到WP MAIL SMTP的條目,
點(diǎn)進(jìn)去就能進(jìn)入設(shè)置頁(yè)面。
這個(gè)WordPress郵件提醒插件的設(shè)置,
很多新人第一次操作的時(shí)候,
往往會(huì)因?yàn)槠渲械囊粋€(gè)小問(wèn)題,導(dǎo)致沒(méi)法對(duì)外發(fā)送郵件。
其實(shí)只要做過(guò)一次SMTP郵件插件的設(shè)置后,以后新的網(wǎng)站,都能照搬相同的配置了。
在這篇文章中,我們以阿里云郵箱為例,做一個(gè)國(guó)內(nèi)的smtp郵件服務(wù)器設(shè)置。
當(dāng)你進(jìn)入到了WP MAIL SMTP編輯頁(yè)面后,
直接無(wú)視他的授權(quán)碼版塊,
在發(fā)件人中填寫(xiě)你要用來(lái)發(fā)郵件的郵箱地址,
然后勾選強(qiáng)制使用:
接著往下移動(dòng),設(shè)置一下【發(fā)件人名稱】,也勾選強(qiáng)制使用,返回路徑也順便勾選一下。
然后再【郵件程序】中選擇【其他SMTP】,這個(gè)很重要,不要選錯(cuò)了:
當(dāng)你勾選了【其他SMTP】以后,你會(huì)看到更多設(shè)置的字段,這里非常復(fù)雜,我們一一為您講解:
按照上述設(shè)置好之后,點(diǎn)擊保存按鈕。
好的,你認(rèn)真填寫(xiě)了各種內(nèi)容,但是怎么知道這些信息是正確的呢?
點(diǎn)擊WP MAIL SMTP插件編輯頁(yè)面中的【電子郵件測(cè)試】,進(jìn)入到一個(gè)新的頁(yè)面,輸入您的另一個(gè)常用郵箱,然后啟用HTML,點(diǎn)擊發(fā)送電子郵件:
如果你操作正確,那么1分鐘之內(nèi),您會(huì)收到這封郵件:
很好,現(xiàn)在你可以開(kāi)始接受網(wǎng)站的任何消息提示了!
其實(shí)工作到這里,還沒(méi)有完成。
WP MAIL SMTP插件只是幫你開(kāi)啟了一個(gè)能夠在WordPress網(wǎng)站對(duì)外發(fā)送郵件的郵箱地址(也就是你設(shè)置的那個(gè))。
但是為了和其他插件配合使用,在其他插件設(shè)置的過(guò)程中,在【發(fā)件人】選項(xiàng),要記得填寫(xiě)你設(shè)置的這個(gè)郵箱地址。
舉個(gè)例子,我們最常用的contact form 7中,想要收到網(wǎng)站表單提交的郵件提醒,就要在contact form 7的郵件編輯頁(yè)面,寫(xiě)上你的這個(gè)郵箱地址:
不要忘記了喲,其他插件也是類似的操作。
作為一家專業(yè)的WordPress網(wǎng)站開(kāi)發(fā)公司,我們每一個(gè)幫客戶開(kāi)發(fā)的WordPress網(wǎng)站,都要設(shè)置一個(gè)郵件提醒功能,所以WP MAIL SMTP是一個(gè)非常重要的插件。
在這篇文章中,
我們?cè)敿?xì)介紹了這個(gè)插件的使用方法。
小朋友們,你學(xué)會(huì)了嗎?
想要開(kāi)發(fā)一個(gè)高級(jí)的WordPress網(wǎng)站,歡迎聯(lián)系我們專業(yè)的團(tuán)隊(duì)!
送郵件常用的有163郵箱,qq郵箱,其中發(fā)送郵件的協(xié)議叫SMTP,接收郵件的協(xié)議叫POP3/IMAP,IMAP協(xié)議比POP3更強(qiáng)大,不過(guò)我們不需要要關(guān)注,因?yàn)榉?wù)器集成郵件只會(huì)涉及到發(fā)送郵件,一般不涉及接收郵件。
我們已163郵箱為例來(lái)講解,首先要開(kāi)通允許客戶端發(fā)送郵件的功能
登錄進(jìn)163郵箱后,點(diǎn)擊設(shè)置
?
選擇開(kāi)啟服務(wù),下面兩個(gè)隨便哪個(gè)都可以,點(diǎn)擊開(kāi)啟后會(huì)提示掃碼發(fā)送短信,發(fā)完短信會(huì)顯示授權(quán)碼, 這個(gè)授權(quán)碼只會(huì)顯示一次,要記錄下來(lái),后面會(huì)用到
?
接下來(lái)就是代碼階段了
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
spring:
mail:
#smtp服務(wù)主機(jī) qq郵箱則為smtp.qq.com
host: smtp.163.com
port: 465 #端口不要使用默認(rèn)的25,阿里云無(wú)法開(kāi)通這個(gè)端口,使用465
protocol: smtps
# 編碼集
default-encoding: UTF-8
#發(fā)送郵件的賬戶
username: xxxxxxx@163.com
#授權(quán)碼
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;
/**
* 發(fā)送純文本郵件
*
* @param tos 接收方
* @param subject 主題
* @param content 郵件內(nèi)容
* @return
*/
public void sendTxtMail(String[] tos, String subject, String content) {
//創(chuàng)建簡(jiǎn)單郵件消息
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("發(fā)送郵件失敗", e);
}
}
}
public void sendHtmlEmail(String[] tos, String subject, String html) {
try {
//創(chuàng)建一個(gè)MINE消息
MimeMessage message=mailSender.createMimeMessage();
MimeMessageHelper minehelper=new MimeMessageHelper(message, true);
minehelper.setFrom(from);
minehelper.setTo(tos);
minehelper.setSubject(subject);
//郵件內(nèi)容 true 表示帶有附件或html
minehelper.setText(html, true);
mailSender.send(message);
} catch (Exception e) {
throw new ServiceFailException("發(fā)送郵件失敗", e);
}
}
由于發(fā)送附件的時(shí)間較長(zhǎng),所有我們用@Async注解做成異步的,SpringBoot的異步線程只有一個(gè),所以并發(fā)量大的話會(huì)有延遲,有條件的話可以把發(fā)送郵件的任務(wù)放入MQ,然后從MQ中取出再執(zhí)行。
/**
* 發(fā)送帶附件的郵件,附件格式為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轉(zhuǎn)成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);
//發(fā)送完刪除臨時(shí)文件
for (File file : list) {
file.delete();
}
}
/**
* 發(fā)送帶附件的郵件,F(xiàn)ile格式
*
* @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) {
//創(chuàng)建一個(gè)MINE消息
MimeMessage message=mailSender.createMimeMessage();
try {
MimeMessageHelper helper=new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(tos);
helper.setSubject(subject);
//郵件內(nèi)容 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("發(fā)送郵件失敗", e);
}
}
@Getter
@Setter
@AllArgsConstructor
static class ResourceBean {
FileSystemResource resource;
String filename;
}
下面是MultipartFile轉(zhuǎn)File的方法
/**
* multiFile轉(zhuǎn)成file,在本地生成一個(gè)文件,文件名隨機(jī),使用完需刪除
*
* @param multiFile 要轉(zhuǎn)換的文件
* @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作為模板來(lái)發(fā)送郵件,首先引入依賴
<!-- thymeleaf模板 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
加入配置項(xiàng),所有模板放在類路徑的templates下面并且以html結(jié)尾
spring:
thymeleaf:
cache: false
mode: LEGACYHTML5
prefix: classpath:/templates/
suffix: .html
然后在建一個(gè)mail.html
?
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>郵件模板</title>
</head>
<body>
<p>您好,感謝您的注冊(cè),這時(shí)一封驗(yàn)證郵件,請(qǐng)點(diǎn)擊下面的鏈接完成注冊(cè)!</p>
<a href="#" th:href="@{http://www.baidu.com(id=${id})}">點(diǎn)我完成注冊(cè)</a>
</body>
</html>
使用templateEngine拿到模板和參數(shù),渲染成html, 之后就跟發(fā)送html郵件一樣了
@Async
public void sendTemplateEmail(String[] tos, String subject, String templateName, Map<String, Object> params) {
Context context=new Context();
//設(shè)置參數(shù)
if (params !=null) {
Set<Map.Entry<String, Object>> entrySet=params.entrySet();
entrySet.stream().forEach(entry -> context.setVariable(entry.getKey(), entry.getValue()));
}
//渲染模板,獲得html內(nèi)容
String html=templateEngine.process("email/" + templateName, context);
sendHtmlEmail(tos, subject, html);
}
?
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。