【node+JS】前端使用nodemailer发送邮件

  • 前言
  • 邮箱配置
  • 完整代码

前言

最近需要实现客户提交表单后,把表单的内容作为邮件发送到对应的邮箱,不通过后端服务,前端直接进行发送。嘶——,说干就干!
一通搜索下来,get到方法有很多种,但是。。。都尝试了一遍之后,只有一个成功了。
在这里插入图片描述
先罗列一下我搜到的方法:
1、formspree:前端实现发送邮件功能(Formspree)
这个注册完formspree的账号之后,准备创建项目表单的时候,一直弹出系统崩溃的表单,额…

2、SmtpJS:SmtpJS发送邮件教程
这一篇似乎看起来很靠谱,于是乎,我一通猛如虎的操作下来。。。它总是给我弹出一个报错:Only elasticemail is supported as an SMTP host. To open an account please visit https://elasticemail.com/account#/create-account?r=20b444a2-b3af-4eb8-bae7-911f6097521c ,大概意思是:只支持elasticemail作为SMTP主机。如需开户,请访问https://elasticemail.com/account#/create-account?r=20b444a2-b3af-4eb8-bae7-911f6097521c,呃…

3、EmailJS:EmailJS 一款不需要服务端实现的邮件发送
这篇文章看起来似乎更靠谱了,可是它告诉我,需要国外的手机号来认证Gmail账号,(⊙o⊙)…

4、nodemailer:「nodemailer」Node 邮件发送模块
好叭,天无绝人之路,我们还是老老实实用node写个接口叭…
在这里插入图片描述

邮箱配置

1、打开网易邮箱–>设置–>【POP3/SMTP/IMAP】
在这里插入图片描述
2、开启POP3/SMTP/IMAP服务
在这里插入图片描述
3、获取授权密码
在这里插入图片描述
4、可以记一下这个
在这里插入图片描述
5、初始化你的项目:npm init -y
6、添加依赖:npm install express@next dotenv nodemailer --save

dotenv:加载 .env 文件中的变量到 process.env 中
nodemailer:Node.JS 邮件发送模块

7、配置.env信息

在这里插入图片描述

完整代码

目录
在这里插入图片描述
index.html

<form id="myForm">
	<label for="name">姓名:</label>
	<input class="text" type="text" id="name" name="name"><br><br>

	<label for="gender">性别:</label>
	<input type="radio" id="male" name="gender" value="male">
	<label for="male"></label>
	<input type="radio" id="female" name="gender" value="female">
	<label for="female"></label><br><br>

	<label for="age">年龄:</label>
	<input class="text" type="number" id="age" name="age"><br><br>
	
	<input class="submit" type="submit" value="提交">
</form>
  <script>
    // 在这里可以添加 JavaScript 代码来处理表单提交等操作
    const myform = document.getElementById('myForm');
    myform.addEventListener('submit', function (event) {
      event.preventDefault();
      const name = myform.elements.name.value;
      const gender = myform.elements.gender.value;
      const age = myform.elements.age.value;
      const form = `name=${name}&gender=${gender}&age=${age}`

      var ajaxObj = new XMLHttpRequest();
      ajaxObj.open("POST", 'http://localhost:3000/send', true);
      ajaxObj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
      ajaxObj.send(form);
      ajaxObj.onreadystatechange = function () {
        if (ajaxObj.readyState == 4 && ajaxObj.status == 200) {
          console.log(ajaxObj.responseText)
        }
      }
    });
  </script>

emailsend.js

var nodemailer = require('nodemailer');
module.exports = class Email {
  constructor() {
    this.config = {
      host: process.env.smtp,
      port: 25,
      auth: {
        user: process.env.mailFrom, //刚才注册的邮箱账号
        pass: process.env.mailPwd  //邮箱的授权码,不是注册时的密码
      }
    };
    this.transporter = nodemailer.createTransport(this.config);
  }

  sendEmail(mail) {
    return new Promise((resolve, reject) => {
      this.transporter.sendMail(mail, function (error, info) {
        if (error) {
          console.log(error)
          reject(error)
        }
        resolve(true)
      });
    })
  }
}

serve.js

const app = require('express')()
require('dotenv').config()
const sendEmail = require('./emailsend')
var bodyParser = require('body-parser')
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use((req, res, next) => {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
  next();
});
app.get('/', async (req, res) => {
  res.send('hello')
})
app.post('/send', async (req, res) => {
  res.header('Access-Control-Allow-Origin', '*')
  const formData = req.body;
  console.log(formData);
  const send = new sendEmail();
  const emailContent = `
  姓名:${formData.name}
  性别:${formData.gender}
  年龄:${formData.age}
  `;
  try {
    let email = await send.sendEmail({
      from: '1xxxx0@163.com',//发送人邮箱
      to: '1xxxx1@qq.com',//接收人邮箱
      subject: "xxx请查收!",//标题 
      text: emailContent,
    })
    if (email) {
      console.log("发送成功!");
      res.send('发送成功!')
    }
  } catch (e) {
    console.log("发送失败");
    res.send(e)
  }
})

app.listen(3000, () => {
  console.log('http://localhost:3000')
})

以上就可以成功发送邮件啦!
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

原文远知行COO张力加盟逐际动力 自动驾驶进入视觉时代?

11月7日&#xff0c;通用足式机器人公司逐际动力LimX Dynamics官宣了两位核心成员的加入。原文远知行COO张力出任逐际动力联合创始人兼COO&#xff0c;香港大学长聘副教授潘佳博士为逐际动力首席科学家。 根据介绍&#xff0c;两位核心成员的加入&#xff0c;证明一家以技术驱…

如何在OpenWRT上安装SFTP并实现公网远程文件传输

文章目录 前言 1. openssh-sftp-server 安装2. 安装cpolar工具3.配置SFTP远程访问4.固定远程连接地址 前言 本次教程我们将在OpenWRT上安装SFTP服务&#xff0c;并结合cpolar内网穿透&#xff0c;创建安全隧道映射22端口&#xff0c;实现在公网环境下远程OpenWRT SFTP&#xf…

关于阿里云 ACK ingress部分补充

强调&#xff1a; 本文只是作为记录,过一段时间会删除 跟唐老师学习网络 一 Nginx Ingress管理 ① 流量走向 需求&#xff1a; 应用绑定LoadBalance,会自动创建或使用SLBeip:port --> nodeport_ip:port --> service_ip:port --> pod_ip:port 支持的注解 通过…

不妨看看这招: 电销获客渠道——优质的电销数据资源

由于时间的变化&#xff0c;电话营销寻找客户变得越来越困难&#xff0c;这涉及到寻找联系潜在客户的方法。第二个原因是电话禁令相对严厉&#xff0c;电话营销水平参差不齐&#xff0c;人员流动大&#xff0c;导致吸引客户的成本越来越高。那么&#xff0c;电话营销行业的渠道…

【腾讯云 HAI域探秘】借助HAI,轻松部署StableDiffusion环境拿捏AI作画-体验实验赢大奖

爆火的Ai生图你体验到了吗&#xff1f; 没有绘画能力、摄影能力也能随心所欲的创作出自己的作品&#xff01; 但是很多人因为高昂的硬件和繁琐的安装对它望而却步。 腾讯云的高性能应用服务 HAI &#xff08;Hyper Application Inventor&#xff09;是一款专门为AI和科学计算…

xv6实验课程--xv6的写时复制fork(2023)

7. xv6实验课程--xv6的写时拷贝(COW)(2021) 7. xv6实验课程--xv6懒惰分页分配&#xff08;lazy)(2020) 本文来源&#xff1a; https://mp.weixin.qq.com/s/XJkhjrlP232ZDsRyXd0oHQ 已完成的实验代码可以从下列网站获取&#xff1a; git clone https://gitee.com/lhwhit196…

PDF Expert for mac(苹果电脑专业pdf编辑器)兼容12系统

PDF Expert是macOS平台上的一款优秀的PDF阅读和编辑工具&#xff0c;由Readdle公司开发。它不仅拥有方便、易用的界面&#xff0c;还具备诸多功能&#xff0c;比如编辑PDF文件、添加批注、填写表格、签署文件、合并文档等。安装:PDF Expert for Mac(PDF编辑阅读转换器)v3.5.2中…

CAN总线协议的理解以及移植stm32代码并使用

什么是CAN总线协议 是一种异步半双工的通讯协议&#xff0c;只有CAN_High与CAN_Low两条信号线。 有两种连接形式&#xff1a;闭环总线&#xff08;高速&#xff09;和开环总线&#xff08;远距离&#xff09; 他使用的是一种差分信号来传输电信号 所谓差分信号就是两条信号线…

Linux防火墙firewalld(粗糙版)

上篇是iptables的增删改查 自定义链&#xff1a; systemctl stop firewalld setenforce 0 iptables -N lmn iptables -vnL iptables -t filter -vnL 修改链名&#xff1a; iptables -E lmn ky01 iptables -t filter -vnL iptables -t filter -I ky01 -p icmp -j ACCEP…

蓝桥杯每日一题2023.11.8

题目描述 题目分析 对于输入的abc我们可以以a为年也可以以c为年&#xff0c;将abc,cab,cba这三种情况进行判断合法性即可&#xff0c;注意需要排序去重&#xff0c;所以考虑使用set 此处为纯模拟的写法&#xff0c;但使用循环代码会更加简洁。 方法一&#xff1a; #include&…

基于java web的计算机office课程平台设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

无人机航迹规划:七种智能优化算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划--提供MATLAB代码

一、七种算法&#xff08;DBO、LO、SWO、COA、LSO、KOA、GRO&#xff09;简介 1、蜣螂优化算法DBO 蜣螂优化算法&#xff08;Dung beetle optimizer&#xff0c;DBO&#xff09;由Jiankai Xue和Bo Shen于2022年提出&#xff0c;该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁…

阿里云Intel Xeon Platinum可扩展处理器性能说明

阿里云Intel Xeon Platinum可扩展处理器性能如何&#xff1f;目前云服务器ECS经济型e实例采用该款CPU型号&#xff0c;正好阿里云服务器网购买了一台2核CPU、2G内存、3M固定带宽、40G ESSD Entry云盘&#xff0c;一年优惠价99元&#xff0c;第二年续费不涨价依旧是99元一年&…

Idea安装使用教程~

在本文中&#xff0c;我们将提供关于如何安装 IntelliJ IDEA 的详细步骤。如果您是初学者或只是想尝试一下 IDEA&#xff0c;我们建议您下载 Community 版。如果您需要更多高级功能&#xff0c;可以选择 Ultimate 版。 步骤一&#xff1a;下载 IntelliJ IDEA 首先&#xff0c;…

使用表单登录方法模拟登录通信人家园,要求发送登录请求后打印出来的用户名下的用户组类别

目标网站&#xff1a;https://www.txrjy.com/forum.php 一、进入网页&#xff0c;右键“检查” 二、输入用户名和密码&#xff0c;点击“登录”&#xff0c;点击“Network”,上划加载项找到蓝色框中的内容 三、点击第一个加载项&#xff0c;找到URL 四、相关代码&#xff1a; …

渗透必备:Proxifier玩转代理

目录 0# 概述 1# Proxifier介绍 2# 操作过程 2.1 配置代理服务器 2.2 配置代理规则 3# Proxifier玩转代理 3.0 配置说明 3.1 通过Proxifier进行内网渗透 3.2 通过Proxifier将VM虚拟机代理 3.3 通过Proxifier进行小程序抓包 3.4 补充 4# 总结 0# 概述 在日常的渗透过…

Pytorch模型使用与修改、保存与加载

模型的使用及修改、保存与加载 以图像处理中torchvision为例&#xff0c;PyTorch通过torchvision.models模块提供了更多的预训练模型. 在图像分类当中&#xff0c;包括许多模型 import torchvision import warnings import torch warnings.filterwarnings("ignore&quo…

C++ 代码实例:并查集简单创建工具

文章目录 前言代码仓库代码说明main.cppMakefile 结果总结参考资料作者的话 前言 C 代码实例&#xff1a;并查集简单创建工具。 代码仓库 yezhening/Programming-examples: 编程实例 (github.com)Programming-examples: 编程实例 (gitee.com) 代码 说明 简单地创建并查集注…

软件测试|PO设计模式在 UI 自动化中的实践

PO的思想最早是2013年由IT大佬Martin Flower提出的&#xff1a;https://martinfowler.com/bliki/PageObject.html 没错&#xff0c;就是他 — 没错&#xff0c;就是他 — 在他的文章里有这样一张经典样图,图片中展示了测试代码中直接操作HTML元素和使用PO模式将page对象封装成…

“锡安主义”贝尔福宣言希伯来抵抗运动犹太启蒙改革运动奋锐党闪米特人雅利安人

目录 “锡安主义” 贝尔福宣言 希伯来抵抗运动 犹太启蒙改革运动 奋锐党 闪米特人 雅利安人 “锡安主义” “锡安主义”是一种政治和民族运动&#xff0c;旨在支持并促进犹太人建立自己的国家并在历史上与宗教上的祖先之地——巴勒斯坦地区建立一个独立的国家。这一运动…