前端使用node.js通过nodemailer发送邮件

在node中收发电子邮件是非常方便的,然后再封装几个简单的接口,前端就可以很容易调用和实现功能。下面写了个简单例子,也是第一次写这样的功能,做个记录。给有需要的朋友们做个参考。

Nodemailer简介


nodemailer是一个简单易用的Node.js邮件发送组件
官网地址:https://nodemailer.com

GitHub地址:https://github.com/nodemailer/nodemailer

Nodemailer的主要特点包括:

  • 支持Unicode编码
  • 支持Window系统环境
  • 支持HTML内容和普通文本内容
  • 支持附件(传送大附件)
  • 支持HTML内容中嵌入图片
  • 支持SSL/STARTTLS安全的邮件发送
  • 支持内置的transport方法和其他插件实现的transport方法
  • 支持自定义插件处理消息
  • 支持XOAUTH2登录验证

安装使用


在安装了node.js之后下载安装 nodemailer

npm install nodemailer --save

发送邮件部分


下面是一个简单的示例,展示如何使用 Nodemailer 来通过 QQ 邮箱发送电子邮件。请确保你已经开通了 QQ 邮箱的 SMTP 服务,并获取了授权码。
开通个人QQ邮箱授权码可参考 service: 'QQ'
开通腾讯企业邮箱授权码可参考 service: '"QQex"'

'use strict';  
  
// 引入nodemailer模块  
const nodemailer = require('nodemailer');  
  
// 创建邮件传输器  
// 这里我们使用的是QQ邮箱的SMTP服务器  
// 注意:确保你的QQ邮箱已经开启了SMTP服务,并且获取了授权码  
const transporter = nodemailer.createTransport({  
  service: 'QQ', // 使用QQ邮箱的SMTP服务  
  port: 465, // SMTP端口号,通常SMTP over SSL的端口是465  
  secure: true, // 使用SSL连接  
  auth: {  
    user: '你的QQ邮箱地址', // 填写你的QQ邮箱地址  
    pass: '你的授权码', // 填写你在QQ邮箱中获取的授权码,不是登录密码  
  },  
});  
  
// 定义邮件的选项  
const mailOptions = {  
  from: `"发件人名称" <你的QQ邮箱地址>`, // 发件人的邮箱地址和名称  
  to: '收件人邮箱地址', // 收件人的邮箱地址  
  subject: '邮件主题', // 邮件的标题  
  text: '纯文本内容', // 邮件的纯文本内容(如果同时定义了html,则html会被优先使用)  
  html: '<h1>HTML内容</h1>', // 邮件的HTML内容  
  // 如果需要添加附件,可以定义attachments数组  
  attachments: [  
    {  
      filename: '附件1.jpg', // 附件的文件名  
      path: '附件1的本地路径或URL', // 附件的本地文件路径或网络URL  
      cid: 'myImage1', // CID,用于在HTML内容中引用该图片  
    },  
    {  
      filename: '附件2.docx',  
      path: '附件2的本地路径或URL',  
      cid: 'myDocument',  
    },  
    // 可以继续添加更多附件...  
  ],  
};  
  
// 发送邮件  
transporter.sendMail(mailOptions, (error, info) => {  
  if (error) {  
    // 如果发送邮件过程中出错,则打印错误信息  
    console.error('发送邮件时出错:', error);  
    return;  
  }  
  // 如果邮件发送成功,则打印相关信息  
  console.log('邮件发送成功:', info);  
  // info对象包含了邮件发送的详细信息,如messageId等  
});  
  
// 备注:  
// 1. 确保已经通过npm安装了nodemailer模块  
// 2. 替换上述代码中的'你的QQ邮箱地址'、'你的授权码'、'收件人邮箱地址'等为实际的值  
// 3. 邮件的HTML内容中,如果引用了附件中的图片,可以通过<img src="cid:图片CID" />的方式引用  
// 4. attachments数组中可以添加多个附件对象,每个对象定义了附件的文件名、路径和CID等信息  
// 5. 发送邮件时,如果发生错误,会在回调函数的error参数中返回错误信息  
// 6. 如果邮件发送成功,回调函数的info参数会包含邮件的详细信息,如messageId等

在实际的生产环境中,建议使用环境变量来存储敏感信息(如邮箱地址和授权码),而不是硬编码在代码中,以确保安全性。

封装接口部分
如果你想要为前端提供一个简单的API接口来发送邮件,你可以创建一个Express应用来实现这个功能。以下是一个简单的示例:

const express = require('express');  
const bodyParser = require('body-parser');  
const nodemailer = require('nodemailer');  
  
const app = express();  
app.use(bodyParser.json()); // 解析JSON请求体  
app.use(bodyParser.urlencoded({ extended: true })); // 解析URL编码的请求体  
  
// 创建邮件传输器(同上面的代码)  
const transporter = nodemailer.createTransport({  
  // ... 配置项  
});  
  
// 定义发送邮件的路由  
app.post('/send-email', (req, res) => {  
  const { from, to, subject, text, html, attachments } = req.body;  
  
  const mailOptions = {  
    from,  
    to,  
    subject,  
    text,  
    html,  
    attachments,  
  };  
  
  transporter.sendMail(mailOptions, (error, info) => {  
    if (error) {  
      res.status(500).json({ error: '邮件发送失败' });  
      return;  
    }  
    res.json({ message: '邮件发送成功' });  
  });  
});  
  
// 启动服务器  
const PORT = process.env.PORT || 3000;  
app.listen(PORT, () => {  
  console.log(`Server is running on port ${PORT}`);  
});

在这个示例中,我们创建了一个Express应用,并定义了一个POST路由 /send-email。前端可以通过发送一个包含邮件信息的POST请求到这个路由来触发邮件发送。请确保你已经安装了 express 和 body-parser 这两个依赖。

现在,你可以运行这个Express应用,并在前端通过AJAX或Fetch API来调用 /send-email 路由发送邮件了。记得处理可能出现的错误和异常情况,并为用户提供友好的反馈。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容