前言
主题: 本文基于nuxt3 + nodemailer 实现邮件发送的功能
内容:本文分为三个部分:首先是插件介绍,然后是代码实现,最后是注意事项
目的:手模手 实现一个发送邮件功能
环境准备:
框架:基于 nuxt3 搭建的SSR 项目 对于nuxt3项目搭建可以参考 SSR-Nuxt3项目搭建
插件: nodemailer
node:14.18.1 [node版本应该没有有要求]
一、介绍及使用
1. nodemailer
Nodemailer是一个流行的Node.js模块,用于发送电子邮件。它可以发送包含HTML,文本和附件的邮件,并支持多种协议,如SMTP、SMTPS、Sendmail、Amazon SES、和其他传输协议。Nodemailer还提供了许多功能,例如发送定时邮件、SMTP认证、SSL和TLS支持、自定义头和邮件模板等。
2. nuxt3
Nuxt3是一个基于Vue.js实现的服务端渲染框架。其提供了很多功能:路由,中间件,插件,自定义hook,状态管里等等。它支持服务端渲染(SSR),静态生成(SSG),客户端渲染(CSR)。它都采用约定式的文件命名方式来开发,如路由只需要写在pages下的默认当然页面,嵌套级为二级页面, 当我们没有写pages的时候,默认不会引入Router, 还有 页面中使用的vue 方法像 reactive,ref,watch 这些全都不需要引入,就可以直接使用。
3. server
server 层也就是node 层,所谓的服务端渲染:在服务端做初始化请求、 HTML页面构建渲染,再返回给前端,如果对首屏渲染时间、或者SEO有较高要求,服务端渲染是个不二之选。因为像Vue 、React 前端框架搭建的 SPA 项目它是单页应用,就是只有一个HTML,并且会把页面、组件都挂载在一个div上,首屏的时候会做很多页面初始化请求、构建页面,所以就会很慢。
nuxt项目中:我们只需要创建server文件夹,就可以在上面做一些node能的事情比如请求转发、拦截、修改,时效性不高的接口数据进行缓存、存redis、还有鉴权呀等等。本文主要是 使用node 去实现一下邮件的发送。
吹不下去了,上菜上菜👻
二、邮件功能实现
1. 安装:
nuxt3 搭建项目我这里就不赘述了,参考: SSR-Nuxt3项目搭建 项目目录如下
nodemailer
yarn add nodemailer
or
npm i nodemailer
2. 代码编写
新建 server/api/sendEmail.ts
import nodemailer from 'nodemailer';
export default defineEventHandler(async (context) => {
const params = await readBody(context) || {} // 讀取參數
const transporter = nodemailer.createTransport({
host: 'smtp.qq.com',
port: 465, // SMTP 端口
secure: true, // 使用 SSL
secureConnection: true, // 使用 SSL
auth: {
user: "xxxx@qq.com",
pass: 'xxxxhqvfqdwsupvbdiaj' // 这是邮箱去申请的开启服务的密码,POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务
}
});
const mailOptions = {
from: '2xxxx@qq.com', // 发件地址
to: 'xxxx@qq.com', // 收件列表
subject: 'Hollo', // 标题
html: '<b>Hello world ?</b>' // html 内容
};
mailOptions.html = getHtml(params)
let resp = null
const resObj = {
code: 200,
msg: '',
data: {
messageId: ''
}
}
try {
console.log('开始发送邮件')
resp = await transporter.sendMail(mailOptions)
} catch (error) {
console.log('报错了', error)
resObj.code = 10001
resObj.msg = 'Submit Fail !'
} finally {
console.log('发送完成', resp)
if (resp?.messageId) {
resObj.msg = 'Submit Success !'
resObj.data.messageId = resp.messageId
}
return resObj
}
})
// 构建发送的邮件内容
function getHtml(params: object) {
let html = ""
if (Object.keys(params).length) {
const formNames = {
"name": "姓名",
"email": "邮箱",
"messenger": "公司",
"messengerAct": "手机",
"txt": "留言",
}
for (let k in params) {
html += `<p style="line-height: 48px;color: #666666;border-bottom: 1px solid #dddddd;">
<span style="color: #333333; width: 100px;">${formNames[k]}:</span>
${params[k]}
</p>`
}
}
return html
}
定义完就可以去页面中使用啦
pages/test.vue
<template>
<h1 @click="submit">發送郵件</h1>
</template>
<script setup lang="ts">
async function submit() {
const res = await useFetch("/api/sendEmail", {
method: "POST",
params: {
name: "小易",
job: "前端",
},
});
console.log(res);
}
</script>
3. 测试一下
恭喜你 大功告成 😎😎
源码:
https://github.com/xiaoyi1255/nuxt3-temple
感兴趣朋友们可以试一试哦,觉得麻烦的可以吧 ,账号信息的配置 提到环境配置文件中
注意事项
- 注意 SMTP 服务器地址、端口、认证方式、用户名和密码(去邮箱申请开启服务)等
- 注意发件邮箱需要和auth 邮箱一致
- 注意邮件的主题、内容、附件等信息的正确性和完整性,尽可能提高邮件的送达率和稳定性。
- 意防止邮件滥发、垃圾邮件等问题