手摸手带你实现一个开箱即用的Node邮件推送服务

news2024/11/18 3:01:07

目录

​编辑

前言

准备工作

邮箱配置

代码实现

服务部署

使用效果

题外话

写在最后

相关代码:


前言

由于邮箱账号和手机号的唯一性,通常实现验证码的校验时比较常用的两种方式是手机短信推送和邮箱推送,此外,邮件推送服务还可以达到推送关键信息和消息通知的诉求。为了方便快捷的使用邮件推送api,我基于Node和相关库快速搭建了一个简易的开箱即用的邮件推送服务。本文与大家做个分享

准备工作

  • 云函数,服务器或第三方内网穿透(提供api调用)
  • Node环境及后续的依赖包
  • 个人邮箱

邮箱配置

首先是邮箱的一些配置项,大部分的POP3/SMTP/IMAP的配置都在设置中,以88邮箱为例,点击客户端设置,开启POP3/SMTP/IMAP服务

然后记住对应的服务器地址、端口,新建秘钥或者访问密码并记住(一般只会展示一次,要记好)

代码实现

使用node+ts+nodemailer模块实现一个云函数,将上述的配置项放在环境变量中,通过云函数的process.env获取,通过调取云函数接口发送邮件操作

// @see https://docs.aircode.io/guide/functions/
import {
    createTransport, Transporter, SentMessageInfo
} from 'nodemailer';
import { catchAwait } from "utils-lib-js"
type IMailOptions = {
    from: string
    to: string
    subject: string
    text: string
}
type IMailParams = { mail: string, title: string, content: string }

type IEnv = {
    service: string // 运营商 参考:node_modules\nodemailer\lib\well-known\services.json 中的配置
    host: string // 邮箱服务器地址
    port: number // 邮箱SSL协议端口号
    user: string //发送方的用户名,一般指邮箱号
    pass: string //发送方的密码,一般指专用密码或者邮箱授权码
    [key: string]: any
}
const { service, host, port, user, pass } = process.env as IEnv

const EmailTransporter = {
    service, // 运营商  qq 网易 若使用QQ邮箱,则只需配置service:qq
    host, // 若使用网易邮箱,则需配置host:smtp.163.com
    port, // 端口
    auth: {
        user, // 发送方的邮箱
        pass, // 发送方授权码
    },
};
class SendMail {
    transporter: Transporter<SentMessageInfo>
    mailOptions?: IMailOptions
    constructor() {
        this.transporter = createTransport(EmailTransporter); //邮箱配置项
    }
    /* 发送邮件模块
     * @method    sendEmail
     * @for       SendMail
     * @param   {String} mail  用户邮箱
     * @param   {String} title  邮件标题
     * @param   {String} content  邮件内容
     * @return {Promise<res>}   是否发送成功
     */
    sendEmail = (opts: IMailParams) => {
        const { mail, title, content } = opts
        this.mailOptions = {
            from: `消息来自 < ${user} >`,
            to: mail,
            subject: title,
            text: content,
        };
        return this.transporter.sendMail(this.mailOptions);
    };
}
const email = new SendMail();
export default async function (params: IMailParams, _: unknown) {
    console.log('Received params:', params);
    const [err, msg] = await catchAwait(email.sendEmail(params))
    return err ?? msg
}

上述代码中的IEnv类型指代的是环境变量的结构,通过获取环境变量的属性来进行基础静态配置 

服务部署

服务部署可以使用AirCode云函数,可以参照这篇文章

注册账号之类的就不说了,直接创建新的App

应用名可以自取,比如mail-server,环境使用node16,ts可以根据自己的具体场景可用可不用,然后选择服务器部署的区域,有美国和香港,选香港就可以了(懂的都懂),最后点击创建按钮

来到开发面板区域,做个说明(建议熟悉一下)

接着将代码复制到代码编辑器中,并根据IEnv类型设置一下环境变量

安装依赖

部署前调试一下

最后部署并复制云函数请求地址

使用效果

题外话

上述用到了AirCode云函数,除此之外推荐一些类似的网站,仅供参考

Glitch: The friendly community where everyone builds the web

laf 云开发

Qoddi.com - Premium Cloud App Hosting Platform

Cloud Application Platform | Heroku

Railway

更多有趣的网站可以通过我的书签获取

写在最后

本文介绍了如何使用Node.js和相关库快速搭建一个开箱即用的邮件推送服务。通过配置环境变量和使用Nodemailer库,我们能够快速配置和发送邮件,满足用户的关键信息和通知需求。

以上就是文章全部内容了,希望本文对你理解和搭建开箱即用的Node邮件推送服务有所帮助,并能够在实际应用中发挥作用。

如果觉得文章不错的话,还望三连支持一下,感谢!

相关代码:

邮件推送服务

utils-lib-js: JavaScript工具函数,封装的一些常用的js函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/906005.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

部署问题集合(十九)linux设置Tomcat、Docker,以及使用脚本开机自启(亲测)

前言 因为不想每次启动虚拟机都要手动启动一遍这些东西&#xff0c;所以想要设置成开机自启的状态 设置Tomcat开机自启 创建service文件 vi /etc/systemd/system/tomcat.service添加如下内容&#xff0c;注意修改启动脚本和关闭脚本的地址 [Unit] DescriptionTomcat9068 A…

Nexus(Maven管理器)下载和安装

我们以 Nexus 2.x 为例&#xff0c;演示 Nexus 的安装过程。 官方下载地址 1. 进入 Nexus 2.x 下载页面&#xff0c;根据本机操作系统&#xff0c;选择对应的版本进行下载&#xff0c;如下图所示。 2. 将下载 Nexus 安装包解压到本地磁盘&#xff0c;可获得 nexus-2.14.20-0…

Java字符串

一、所在位置 字符串常量池&#xff1a; 存放字符串的容器 那字符串常量池存在哪呢&#xff1f;根据JDK的版本不同&#xff0c;字符串常量池存放的位置不同。 jdk1.6之前字符串常量池在方法区(想法)中的永久代(具体实现)&#xff08;JVM&#xff1a;新生代、老生代、永久代(永…

三、MySQL 数据库安装集

一、CentOS—YUM 1. MySQL—卸载 # 1、查看存在的MySQL。 rpm -qa | grep -i mysql rpm -qa | grep mysql# 2、删除存在的MySQL。 rpm -e –-nodeps 包名# 3、查找存在的MySQL目录。 find / -name mysql# 4、删除存在的MySQL目录。 rm -rf 目录# 5、删除存在的MySQL配置文件。…

【西安、成都】山洪预警模拟与洪水危险性评价技术及2023年典型地区洪水淹没及损失分析复盘

气候变化背景下&#xff0c;极端天气导致的洪水事件将更加频发。快速城市化对流域下垫面的改变&#xff0c;及人类活动向洪泛区的扩张。二者共同使得全世界多数人类活动高度聚集区的洪水风险增加。洪水淹没危险性&#xff08;各种年遇型洪水淹没&#xff09;是洪水损失评估、风…

mathematica线性代数基础和希腊字母输入

在公式推导的过程中最常使用的就是线性代数&#xff1a; mathematica提供了线性代数的计算模块&#xff0c;不过需要熟悉一下语法&#xff0c;最好的方式就是看文档。 文档的链接 在本地的帮助搜索栏输入howto/DoLinearAlgebra&#xff0c;或者在网页输入链接 How to| 进行线…

老码农的运行时漫谈

写程序离不开运行时&#xff0c;但是有很多伙伴却并没有搞清楚运行时到底是什么。运行时的概念之所以容易被混淆&#xff0c;是因为运行时有两层不同的含义&#xff1a;run time 和 runtime&#xff0c;先贤们在翻译的时候可能忽略了中间的空格&#xff0c;导致运行时一词代表了…

selenium案例之RAM 用户登录 aliyun

文章目录 0x00 Selenium0x01 整体流程 思路1.1 打开浏览器并且访问 登录页面 url: https://signin.aliyun.com/login.htm#/main1.2 定位 "用户名" input 和 "下一步" button 点击下一步1.3 定位 "密码" input 和 "登录" button 点击登…

【C语言】自定义类型:结构体

前言 今天这篇文章&#xff0c;我们来学习自定义类型中的结构体类型 之前我们就初步了解过结构体类型&#xff0c;知道他是用来描述复杂类型的 像之前的short、int、long之类的称为C语言的内置类型 而如结构体、枚举、联合类型称为自定义类型 初识结构体 在正式学习前&…

Postgres入门:三种免费且简单的方法

大家好&#xff0c;开发者们&#xff01;今年大约有9万人参与了Stack Overflow的调查。令人印象深刻的是&#xff0c;Postgres被评为第一数据库。此外&#xff0c;DB Engines还将PostgreSQL列为全球增长最快的数据库之一。这对我们意味着什么呢&#xff1f;很明显&#xff0c;我…

数学思维导图怎么画?别错过这几简单绘制方法

数学思维导图怎么画&#xff1f;数学思维导图可以帮助我们更好地组织和理解各种数学概念。不仅是学生和教师可以受益&#xff0c;数学思维导图也可以在研究和工作中发挥作用。这种工具可以帮助你清晰地表示各种数学概念和关系&#xff0c;并将它们可视化&#xff0c;以便更容易…

LeetCode.双指针(三)

例题一 一、题目 两数之和 II - 输入有序数组 给你一个下标从 1 开始的整数数组 numbers &#xff0c;该数组已按 非递减顺序排列 &#xff0c;请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] &#xf…

思维导图怎么制作?了解一下这几种制作方法

思维导图怎么制作&#xff1f;思维导图是一种非常有效的组织思考和表达想法的工具。它可以帮助人们更好地理解和记忆信息&#xff0c;并且可以通过可视化的方式帮助人们更好地理解复杂的关系和概念。制作思维导图有多种方法&#xff0c;例如手绘、使用电子表格或专业的思维导图…

《软件方法》强化自测题-分析(4)

DDD领域驱动设计批评文集 通过做强化自测题加入“软件方法建模师”群 《软件方法》各章合集 按照业务建模、需求、分析、设计工作流考察&#xff0c;答案不直接给出&#xff0c;可访问自测链接或扫二维码自测&#xff0c;做到全对才能知道答案。 知识点见《软件方法》&…

不同企业如何选择合适的CRM系统?

市场上的CRM系统千差万别&#xff0c;如何选到适合的CRM系统&#xff1f;很多企业凭借感觉盲目选型&#xff0c;结果上线后发现CRM系统功能不符合需求。这就好比买衣服&#xff0c;不试穿就买回家&#xff0c;结果发现尺码不合适&#xff0c;还不能退换。下面说说企业如何进行C…

一起学SF框架系列7.4-spring-AOP-AOP代理创建

AOP的BeanDefinition加载后&#xff0c;Spring提供了自动代理机制&#xff0c;让容器自动根据目标bean生成AOP代理bean&#xff0c;本文讲述具体如何实现。 基本机制 Spring的启动过程中&#xff0c;在bean实例化前后、初始化前后均提供了外部介入处理机制&#xff08;详见“…

三、SQLServer 数据库安装集

一、Docker 安装 Docker下安装SqlServer2019Docker 安装 SQLServer 1. 创建容器 前置准备 # 1. 创建主机映射目录 mkdir -p /root/sqlserver # 2. 修改主机映射目录权限 chown -R 10001:0 /root/sqlserver创建容器 # 1、拉取镜像。 #sudo docker pull mcr.microsoft.com/mssql/…

超越函数界限:探索JavaScript函数的无限可能

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 &#x1f4da; 前言 &#x1f4d8; 1. 函数的基本概念 &#x1f4df; 1.1 函数的定义和调用 &#x1f4df; 1.2 …

用加持了大模型的 Byzer-Notebook 做数据分析是什么体验

Byzer-Notebook 是专门为 SQL 而研发的一款 Web Notebook。他的第一公民是 SQL&#xff0c;而 Jupyter 则是是以 Python 为第一公民的。 随着 Byzer 引擎对大模型能力的支持日渐完善&#xff0c; Byzer-Notebook 也在不自觉中变得更加强大。我和小伙伴在聊天的过程中才发现他已…

TCP定制协议,序列化和反序列化

目录 前言 1.理解协议 2.网络版本计算器 2.1设计思路 2.2接口设计 2.3代码实现&#xff1a; 2.4编译测试 总结 前言 在之前的文章中&#xff0c;我们说TCP是面向字节流的&#xff0c;但是可能对于面向字节流这个概念&#xff0c;其实并不理解的&#xff0c;今天我们要介…