用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小时内与您取得联系。