整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

使用WordPress的WP-MAIL-SMTP插件

使用WordPress的WP-MAIL-SMTP插件教程设置邮件提醒功能

用WordPress开发企业官网或者B2B营销型网站或者B2C零售网站,

总是需要有一个邮件提醒功能的。

每当网站上有访客提交询盘,或者有人下单购物了,又或者网了什么系统问题,作为WordPress网站管理员来说,都希望能够收到一个邮件通知,这样就能时时刻刻关注网站动态了。

很多WordPress新手搭建的网站,

往往都不懂怎么设置邮件提醒。

WP花园作为一家专业为客户提供WordPress企业级服务的科技公司,

将会在这篇文章中详细介绍如何通过WP-AMIL-SMTP插件,

来帮助您收到来WordPress网站的任何提醒!

开始准备好小板凳,上课咯!

安装 WP-MAIL-SMTP插件

这个是一个免费的WordPress邮件SMTP设置插件,

您可以直接在WordPress的插件库中通过名字的搜索找到,

或者你直接就输入smtp,然后第一个安装量最多的那个插件,就是你想要找的了:

安装好插件之后,

你会在WordPress后台的左边栏目中看到WP MAIL SMTP的条目,

点进去就能进入设置页面。

WP MAIL SMTP插件介绍

这个WordPress邮件提醒插件的设置,

很多新人第一次操作的时候,

往往会因为其中的一个小问题,导致没法对外发送邮件。

其实只要做过一次SMTP邮件插件的设置后,以后新的网站,都能照搬相同的配置了。

在这篇文章中,我们以阿里云邮箱为例,做一个国内的smtp邮件服务器设置。

国内阿里云邮箱SMTP设置

当你进入到了WP MAIL SMTP编辑页面后,

直接无视他的授权码版块,

在发件人中填写你要用来发邮件的邮箱地址,

然后勾选强制使用:

接着往下移动,设置一下【发件人名称】,也勾选强制使用,返回路径也顺便勾选一下。

然后再【邮件程序】中选择【其他SMTP】,这个很重要,不要选错了:

其他SMTP设置

当你勾选了【其他SMTP】以后,你会看到更多设置的字段,这里非常复杂,我们一一为您讲解:

  • SMTP主机:smtp.mxhichina.com (阿里云默认的就是这个)
  • 使用SSL加密
  • STMP端口 465
  • 开启TLS
  • 开启认证
  • SMTP用户名:你的邮件地址
  • SMTP密码:你的邮件地址的密码

按照上述设置好之后,点击保存按钮。

电子邮件测试

好的,你认真填写了各种内容,但是怎么知道这些信息是正确的呢?

点击WP MAIL SMTP插件编辑页面中的【电子邮件测试】,进入到一个新的页面,输入您的另一个常用邮箱,然后启用HTML,点击发送电子邮件:

如果你操作正确,那么1分钟之内,您会收到这封邮件:

很好,现在你可以开始接受网站的任何消息提示了!

其他插件的设置(重要)

其实工作到这里,还没有完成。

WP MAIL SMTP插件只是帮你开启了一个能够在WordPress网站对外发送邮件的邮箱地址(也就是你设置的那个)。

但是为了和其他插件配合使用,在其他插件设置的过程中,在【发件人】选项,要记得填写你设置的这个邮箱地址。

举个例子,我们最常用的contact form 7中,想要收到网站表单提交的邮件提醒,就要在contact form 7的邮件编辑页面,写上你的这个邮箱地址:

不要忘记了哟,其他插件也是类似的操作。

WP花园的结语

作为一家专业的WordPress网站开发公司,我们每一个帮客户开发的WordPress网站,都要设置一个邮件提醒功能,所以WP MAIL SMTP是一个非常重要的插件。

在这篇文章中,

我们详细介绍了这个插件的使用方法。

小朋友们,你学会了吗?

想要开发一个高级的WordPress网站,欢迎联系我们专业的团队!

送邮件常用的有163邮箱,qq邮箱,其中发送邮件的协议叫SMTP,接收邮件的协议叫POP3/IMAP,IMAP协议比POP3更强大,不过我们不需要要关注,因为服务器集成邮件只会涉及到发送邮件,一般不涉及接收邮件。


我们已163邮箱为例来讲解,首先要开通允许客户端发送邮件的功能


登录进163邮箱后,点击设置


?


选择开启服务,下面两个随便哪个都可以,点击开启后会提示扫码发送短信,发完短信会显示授权码, 这个授权码只会显示一次,要记录下来,后面会用到


?


接下来就是代码阶段了


1.引入依赖


<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>



2.加入配置


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



3.发送纯文本邮件


@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);
        }
    }
}



4.发送带html格式的邮件


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);
    }
}



5.发送带附件的邮件


由于发送附件的时间较长,所有我们用@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();
}



6.使用模板发送邮件


我们使用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);
}




?