在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 路由发送邮件了。记得处理可能出现的错误和异常情况,并为用户提供友好的反馈。