相关文章推荐
乖乖的韭菜  ·  Electron Microscopy ...·  9 月前    · 
乖乖的韭菜  ·  nodejs gzip ...·  9 月前    · 
乖乖的韭菜  ·  HBuilderX.vue文件 以及 ...·  10 月前    · 
乖乖的韭菜  ·  CSS3变形 ...·  10 月前    · 
乖乖的韭菜  ·  Uploading to Steam ...·  10 月前    · 
销魂的大白菜  ·  pycharm报错:ModuleNotFou ...·  21 分钟前    · 
神勇威武的长颈鹿  ·  python ...·  21 分钟前    · 
会开车的企鹅  ·  python ...·  21 分钟前    · 

在平时使用邮箱发送邮件的时候,我们一般只用来发送文本内容。但是许多企业发送的邮件会有漂亮的邮件模板,并不只是单纯文本组成:
在这里插入图片描述

接下来我们会使用node.js的nodemailer库和响应式邮件模板mjml来实现如何定义这种邮件模板以及进行发送。

Nodemailer搭建服务

Nodemailer 是一个简单易用的 Node.JS 邮件发送模块(通过 SMTP,sendmail,或者 Amazon SES),支持 unicode,你可以使用任何你喜欢的字符集。并且,Nodemailer 具有高度安全性,支持Unicode、表情符号以及html内容。

新建文件夹 email-project ,初始化项目:

npm init

安装nodemailer模块:

npm install nodemailer

注意,在发送邮件之前,请确保你的邮箱已经开通了smtp服务。我这里是用的qq的邮箱服务:
在这里插入图片描述

有很清楚的操作提示,跟着做就可以。

email-project下新建server文件夹,新建mailer.js

const nodemailer = require("nodemailer")
const transporter = nodemailer.createTransport({
    service: "qq", // 内置传输发送邮件
    port: 465, // 端口 
    secureConnection: true, // 安全ssl连接
    // 授权认证
    auth: {
        // 用来发送邮件的邮箱
        user: "xxxxx@qq.com",
        // 不是邮箱登录密码,是smtp授权码
        pass: "你的smtp授权码"
const mailOption = {
    from: "xxxxxxx@qq.com", // 发送的邮箱地址
    to: "yyyyyyyy@qq.com", // 接收的邮箱地址
    subject: "测试邮件!", // 邮箱的标题
    text: "测试内容!" // 正文内容
// 发送邮件
transporter.sendMail(mailOption, (error, info) => {
    if (error) {
        return console.log(error)
    // 成功会返回messageId
    console.log("Message send: %", info.messageId)

这样,我们成功地运行了邮件服务,向指定的用户发送了一封测试邮件。

编写mjml邮件

MJML是一种标记语言,设计用于轻松实现一个响应式邮件。它的语义语法使得它容易和简单,而其丰富的标准组件库可以减少你开发时间,并减轻您的邮件代码库。MJML是一个开源的引擎能够将MJML转换成响应式布局的HTML。

在主流邮箱(如qq或163邮箱)中,邮件的编辑,模式可以切换到html模式:
在这里插入图片描述

但是,这种编辑模式需要使用非常老的table布局格式,并且兼容性很差。所以我们选择mjml来快速开发响应式邮件。

安装mjml:

npm install mjml

email-project下新建template文件夹,新建test.mjml文件:

<mj-head> <mj-title>注册成功!</mj-title> <mj-attributes> <mj-text line-height="120%"></mj-text> </mj-attributes> <mj-style inline="inline"> .header{ display:flex; align-items: center; </mj-style> </mj-head> <mj-body> <mj-wrapper background-color="#000" border-radius="5px"> <mj-section css-class="header"> <mj-column width="40%"> <mj-image width="150px" src="https://static01.imgkr.com/temp/590385d1399741a8a56f6cb7db7a3b28.jpg"></mj-image> </mj-column> <mj-column padding="40px 10px"> <mj-text font-size="45px" align="center" color="#fff">注册成功!</mj-text> </mj-column> </mj-section> <mj-section> <mj-column> <mj-divider border-color="orange"></mj-divider> </mj-column> </mj-section> <mj-section padding="0 20px"> <mj-column> <mj-text color="#fff" font-size="16px">Dear Marcus</mj-text> <mj-text color="#fff" font-size="16px">好叭,其实你什么也没有注册,这只是我发的一个测试邮件模板!</mj-text> <mj-spacer height="10px"></mj-spacer> <mj-button background-color="orange" href="https://www.baidu.com">点一下啥也不会发生</mj-button> </mj-column> </mj-section> <mj-section> <mj-column> </mj-column> </mj-section> </mj-wrapper> </mj-body> </mjml>

具体如何编写可以看官方文档或者看后面参考中的博客。这里主要提两点:

  • 引入图片使用网络地址,不要使用本地图片
  • mj-column外面最好用my-section包起来
  • 如果使用vscode,可以安装mjml插件来进行预览

这里生成的模板是这样的:
在这里插入图片描述

整合mjml和nodemailer

我们已经编写好了邮件模板,但是nodemailer并不能直接发送mjml。我们需要运行对应的命令将mjml转换为对应的html文件。

新建temp文件夹,在终端运行命令:

mjml -r ./template/test.mjml -o ./temp/output.html

这样,在temp文件夹下就会生成对应的html文件。

修改mailer.js

const nodemailer = require("nodemailer")
const fs = require("fs")
const transporter = nodemailer.createTransport({
    service: "qq", // 内置传输发送邮件
    port: 465, // 端口 
    secureConnection: true, // 安全ssl连接
    // 授权认证
    auth: {
        // 用来发送邮件的邮箱
        user: "xxxxx@qq.com",
        // 不是邮箱登录密码,是smtp授权码
        pass: "你的smtp授权码"
const mailOption = {
    from: "xxxxxxx@qq.com", // 发送的邮箱地址
    to: "yyyyyyyy@qq.com", // 接收的邮箱地址
    subject: "测试邮件!", // 邮箱的标题
    // text: "测试内容!" // 正文内容
		html: fs.readFileSync("./temp/output.html")
// 发送邮件
transporter.sendMail(mailOption, (error, info) => {
    if (error) {
        return console.log(error)
    // 成功会返回messageId
    console.log("Message send: %", info.messageId)

这样就可以看到,我们成功发送了一封模板邮件。

然而,在业务需求中,我们可能需要根据不同的用户,在邮件中填写不同的内容。比如说我们想要填写接收邮箱相应的用户名,而不是固定的一个名字:
在这里插入图片描述

但是mjml只能编写固定的模板,这种时候我们需要引入模板引擎,帮助我们在内容中填入变量值。

这里我们使用handlebars

npm install handlebars

handlebars支持的是mustache语法,改写test.mjml

<mj-column> <mj-text color="#fff" font-size="16px">Dear {{name}}</mj-text> <mj-text color="#fff" font-size="16px">好叭,其实你什么也没有注册,这只是我发的一个测试邮件模板!</mj-text> <mj-spacer height="10px"></mj-spacer> <mj-button background-color="orange" href="https://www.baidu.com">点一下啥也不会发生</mj-button> </mj-column>

这里双花括号括起来的name就是我们之后要传进去的变量。

修改mailer.js

const nodemailer = require("nodemailer")
// 引入handlebars
const handlebars = require("handlebars")
// 引入mjml方法
const mjml2html = require("mjml")
const fs = require("fs")
// 使用handlebars对mjml文件进行编译
const template = handlebars.compile(fs.readFileSync("./template/test.mjml", "utf8"))
// 定义要传入的参数变量对象
const vars = {
    name: "Leo"
// 将handlebars生成的mjml转为html
const html = mjml2html(template(vars)).html
const transporter = nodemailer.createTransport({
    service: "qq", // 内置传输发送邮件
    port: 465, // 端口 
    secureConnection: true, // 安全ssl连接
    // 授权认证
    auth: {
        // 用来发送邮件的邮箱
        user: "xxxxx@qq.com",
        // 不是邮箱登录密码,是smtp授权码
        pass: "你的smtp授权码"
const mailOption = {
    from: "xxxxxxx@qq.com", // 发送的邮箱地址
    to: "yyyyyyyy@qq.com", // 接收的邮箱地址
    subject: "测试邮件!", // 邮箱的标题
    html: html
// 发送邮件
transporter.sendMail(mailOption, (error, info) => {
    if (error) {
        return console.log(error)
    // 成功会返回messageId
    console.log("Message send: %", info.messageId)

可以看到,我们想要的name参数已经成功传入:
在这里插入图片描述

这样,我们就可以通过传入参数的方法,来给邮件修改不同的内容。

# With a different name npx @mvsde/mailbox create --name < project> 该文件夹默认为当前目录( . ),名称为mailbox-project 。 如果您使用可选的folder参数创建了项目,那么在继续操作之前,请不要忘记使用cd name-of-your-folder更改为新文件cd name-of-your-folder 。 在项目根目录中编辑可选的.mjmlconfig以自定 我的MailerJS的新版本,您可以将其用于电子邮件广告系列。 这个怎么运作 将您的邮递员放在“ victims.txt”文件上。 然后,检查“ configuration.json”文件以编辑所有数据(smtp主机,发件人等),最后,将您的html代码包括在“ scama.html”文件中。 使用以下命令启动文件:node spammerz.js(确保您安装了所有库)
节点邮件程序模板 Nodemailer包装器,可轻松发送HTML模板化电子邮件。 我一直在尝试通过多个HTML模板发送电子邮件时遇到问题。 确实没有任何一种方法可以轻松便捷地解决我的所有需求。 我在节点0.8x的某个地方找到了一个代码片段,该代码片段不起作用,因此我将其改编为该程序包。 通过下载安装, NPM(推荐) npm install --save nodemailer-templation 您需要一个外部SMTP服务器或服务来使此工作。 我推荐Mandrill。 它的免费,快速。 使用山作为我们的SMTP服务的示例。 var Templation = require ( 'nodemailer-templation' ) ; var path = require ( 'path' ) ; //Create our new new mailer
但是前端这一行, 自身这审美, 这一点一点肝, 真是干不了???? 项目总体分为 这两部分. 思路是 请求 天气API, 彩虹屁API, 图床 的数据放入 模板html( template.js) 中, 返回一个HTML字符串, 再将这个字符串用 nodemailer 发送给收件人. 使用 schedule 在每天19.19定时发送 const nodemailer = require("nodemailer"); // create reusable transporter object using the default SMTP transport // 创建发送邮件对象 let transporter = nodemailer.createTransport({ host: "smtp.qq.com", // 发送方邮箱 node_modules\nodemailer\li <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title&gt let mailOptions = { from: 'your_email_address@gmail.com', to: 'recipient_email_address', subject: 'Subject of the email', text: 'Body of the email' 5. 发送电子邮件: transporter.sendMail(mailOptions, function(error, info){ if (error) { console.log(error); } else { console.log('Email sent: ' + info.response); 替换上述代码中的“ your_email_address”和“ your_email_password”为您的电子邮件地址和密码,将“ recipient_email_address”替换为您要发送电子邮件的收件人的电子邮件地址,将“ Subject of the email”替换为您的电子邮件主题,将“ Body of the email”替换为您的电子邮件正文。 请注意,如果您使用的是Gmail帐户,则需要启用“ 您的帐户的低安全性应用程序访问权限”,以便NodeMailer能够发送电子邮件m0_59889760: <div class="pics" v-for="(item, index) in orderInfo.imgUrls" :key="index" v-else> <div v-if="index < num" @click="imgClick(index)" class="img-container"> <image class="evidence-img" :src="item" mode="widthFix" alt /> 这段代码for会全部执行完再去判断是否显示还是判断if去渲染 解析flex属性:flex:1究竟是什么 前端小王hs:
 
推荐文章