前端用js发送邮箱 前端发送邮箱

news2024/9/25 9:40:55

前端发送邮箱

  • 安装包依赖
  • 邮箱授权码
  • demo eg:
    • picture
      • 页面发送内容
      • 有效接受效果
    • code
    • 参考别人写的code
  • 说明

安装包依赖

yarn add nodemailer

nodemailer官网

邮箱授权码

邮箱授权码: 邮箱授权码需要开通,以QQ邮箱为例,其它大同小异
在这里插入图片描述

demo eg:

picture

页面发送内容

在这里插入图片描述

有效接受效果

在这里插入图片描述

code


<script lang="ts" setup>
// yarn add nodemailer
// import nodemailer from 'nodemailer';
const nodemailer = require('nodemailer');

const send = () => {
  message.info('开始发送');
  let dom = document.getElementById('emailCon') as HTMLDivElement;

  sendEmail('xxxxxx@qq.com', 'xxxxxx@qq.com', dom.innerHTML, 'xxxxxxx');
};

/**
 *
 * @param fromEmail 发送者邮箱
 * @param toEmail 接收者邮箱
 * @param sendCon 发送内容
 * @param pass smtp授权密码
 * @param host 邮箱服务的host
 */
const sendEmail = (
  fromEmail: string,
  toEmail: string,
  sendCon: string,
  pass: string,
  host: string = 'smtp.qq.com',
) => {
  /**
   * 邮箱服务的host:
   * qq: smtp.qq.com
   * 163: smtp.163.com
   */
  let transporter = nodemailer.createTransport({
    host, //发送者邮箱服务端口,参考 https://github.com/nodemailer/nodemailer-wellknown/blob/master/services.json
    port: 465,
    secure: true,
    auth: {
      user: fromEmail, //发送者邮箱
      pass, //发送者邮箱授权码,不是登录或者独立密码,是你设置的smtp授权密码
    },
  });
  let mailOptions = {
    from: `夜空孤狼啸 "<${fromEmail}>"`, // sender address
    to: toEmail, // list of receivers
    subject: '测试邮箱', // Subject line
    text: 'Hello world?texttexttexttext', // plain text body
    html: sendCon, // html body
  };
  transporter.sendMail(mailOptions, (err: any, info: any) => {
    if (err) {
      console.log(err);
      message.error('发送失败');
    } else {
      console.log(info);
      message.success('发送成功');
    }
  });
};
</script>

<template>
  <Layout name="nodemailer 发送邮件" title="nodemailer" titleWidth="130px">
    <template #btn>
      <a-button type="primary" @click="send">发送</a-button>
    </template>
    <template #content>
      <div class="con w-px-600 h-px-600" contentEditable="true" id="emailCon"></div>
    </template>
  </Layout>
</template>

<style lang="less" scoped>
.con {
  outline: 1px solid #ccc;
}
</style>

参考别人写的code

'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等

说明

在上面的代码中,我们将SMTP服务器的主机名设置为smtp.qq.com,端口号设置为465,并启用了SSL加密连接。同时,将your-email@qq.com和your-password替换为你自己的QQ邮箱地址和密码。

其他的邮件选项,如收件人、抄送地址、主题、正文内容、HTML内容和附件等,可以按照需求进行设置和修改。

请注意,QQ邮箱的SMTP服务器要求使用SSL/TLS加密连接,因此我们将secure选项设置为true来启用安全连接。

运行修改后的代码后,它将使用你的QQ邮箱账号发送一封带附件、抄送和HTML格式的测试邮件。
确保你的QQ邮箱已正确配置,并允许使用SMTP服务进行邮件发送。如果需要,你可能需要在QQ邮箱设置中启用SMTP服务,并使用QQ邮箱的授权码(不是登录密码)进行身份验证。详细的配置信息可以参考QQ邮箱提供的文档或联系他们的支持团队。

请记住,不同的邮箱服务提供商可能有不同的配置要求和限制,请根据你的实际情况进行相应的调整和处理。

如果你使用的是自己的邮箱服务,可以根据你的自有邮箱服务器的配置信息进行相应的更改。确保提供正确的SMTP服务器主机名、端口号和认证信息。

通过这篇文章,我们了解了如何使用Node.js的Nodemailer模块发送带附件、抄送和HTML格式的电子邮件。Nodemailer提供了丰富的功能和选项,使我们能够轻松地集成邮件服务到我们的应用程序中,满足各种需求。

请记住,在实际生产环境中,你可能需要进行额外的配置和安全性考虑。以下是一些建议和注意事项:

  • 配置自有邮箱服务器:如果你使用的是自有邮箱服务器,确保正确配置服务器的主机名、端口号和安全设置(如SSL/TLS)。
  • 邮箱账号安全:避免在代码中直接硬编码邮箱账号和密码。你可以将敏感信息存储在配置文件或环境变量中,并在代码中引用它们。
  • 应用程序密码:如果你的邮箱账号启用了两步验证,建议生成一个应用程序专用密码,并使用该密码进行SMTP身份验证,而不是使用主密码。
  • 邮件内容和格式:根据你的需求,可以使用HTML格式来创建丰富的邮件内容,包括样式和图像。确保提供备选的纯文本内容,以便兼容不支持HTML格式的邮件客户端。
  • 附件处理:使用attachments选项可以添加附件到邮件中。确保提供正确的附件文件名和路径,并确保邮件大小不超过SMTP服务器的限制。
  • 错误处理:在发送邮件时,使用错误回调函数来处理潜在的错误情况,并采取适当的措施。你可以记录错误、发送错误通知或执行其他操作,以适应你的应用程序需求。
  • 邮件发送限制:一些SMTP服务器可能对发送邮件的频率或数量有限制。确保了解你所使用的SMTP服务器的限制,并根据需要进行适当的管理和调整。
  • 安全性考虑:如果你处理敏感信息或使用邮件服务进行身份验证,确保使用安全的连接(如SSL/TLS)来保护邮件传输过程中的数据安全性。

在本文中,我们探讨了如何使用Node.js的Nodemailer模块发送带附件、抄送和HTML格式的电子邮件,以及如何将其应用于QQ邮箱作为自有邮箱服务的情况。
总结一下,以下是关键要点:

  1. 安装Nodemailer模块:使用npm包管理器安装Nodemailer模块,这是一个用于发送电子邮件的强大工具。
  2. 设置邮箱服务器信息:根据你的自有邮箱服务提供商的要求,配置SMTP服务器的主机名、端口号和安全选项。
  3. 配置认证信息:提供你的邮箱地址和密码(或授权码)作为SMTP服务器的认证信息。
  4. 构建邮件选项:设置邮件的发送者、收件人、抄送地址、主题、正文文本、HTML内容和附件等选项。
  5. 使用附件:使用attachments选项添加附件到邮件中,确保提供正确的附件文件名和路径。
  6. 发送邮件:使用transporter.sendMail()方法发送邮件,并处理发送结果的回调函数。
  7. QQ邮箱配置:对于QQ邮箱,需要将SMTP服务器设置为smtp.qq.com,使用SSL加密连接(端口465),并提供QQ邮箱的地址和密码作为认证信息。

在实际使用中,还需注意安全性、错误处理和额外配置等因素。确保保护敏感信息、了解SMTP服务器的限制,并根据需要进行适当的调整和管理。

通过以上步骤,你可以使用Node.js和Nodemailer模块灵活地发送带附件、抄送和HTML格式的电子邮件,满足你的应用程序的需求。

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

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

相关文章

ROCm Code Object Tooling

ROCm&#xff08;Radeon Open Compute&#xff09;提供了一系列的工具&#xff0c;用于检查和提取编译器生成的代码对象&#xff0c;包括可执行文件、目标文件和共享对象库。 一、roc-obj roc-obj 是 ROCm&#xff08;Radeon Open Compute&#xff09;提供的一个高层级工具&a…

【软件文档】需求规格说明书编制模板

1 范围 1.1 系统概述 1.2 文档概述 1.3 术语及缩略语 2 引用文档 3 需求 3.1 要求的状态和方式 3.2 系统能力需求 3.3 系统外部接口需求 3.3.1 管理接口 3.3.2 业务接口 3.4 系统内部接口需求 3.5 系统内部数据需求 3.6 适应性需求 3.7 安全性需求 3.8 保密性需求 3.9 环境需求…

数据结构(邓俊辉)学习笔记】串 14——BM_GS算法:构造gs表

以下&#xff0c;就来简要地介绍 gs 表的具体构造算法。算法为了便于理解其原理&#xff0c;这里将整个算法划分为若干的层次&#xff0c;并逐层递进、逐层细化。 我们首先需要引入 MS 子串与 ss 表的概念。实际上&#xff0c;相对于模式串中的任何一个字符 P[j] &#xff0c…

RP2040 C SDK开发串口的使用

RP2040 C SDK开发串口的使用 &#x1f4cd;环境搭建部署篇《RP2040 VSCode C/C开发环境快速部署》&#x1f516;RP2040 有硬件串口资源有2个。&#x1f33f;参考RP2040 C SDK Hardware APIS&#xff1a;https://www.raspberrypi.com/documentation/pico-sdk/hardware.html#grou…

安卓APK重签名并查看MD5值-2024最新版

重签名 命令行运行&#xff1a; apksigner sign --ks your_keystore.jks --out output.apk input.apk在这个命令中&#xff1a; –ks 或 --keystore 参数后面是你的keystore文件路径。 your_keystore.jks 是你的keystore文件。 –out 参数后面是输出的签名后的APK文件名。 out…

发布npm包到GitLab教程

之前在研究如何搭建UI组件库&#xff08;内部使用&#xff09;&#xff0c;其中重要的一步就是发布npm包到GitLab。中间踩了很多坑&#xff0c;在这里记录一下整个流程方便大家快速上手。不足之处欢迎指出&#x1f64f; 1. 获取Token 在gitlab中打开access tokens申请页面&am…

鲲鹏服务器之ARM探知

什么叫arm架构 ARM架构过去称作进阶精简指令集机器&#xff08;Advanced RISC Machine&#xff0c;更早称作&#xff1a;Acorn RISC Machine&#xff09;&#xff0c;是一个32位精简指令集&#xff08;RISC&#xff09;处理器架构&#xff0c;其广泛地使用在许多嵌入式系统设计…

CSS系列之详解overflow(四)

一、什么是溢出 CSS 的 overflow 属性用于控制元素内容溢出时的表现方式。当元素的内容超出其指定的尺寸范围时&#xff0c;就会出现溢出现象。比如&#xff0c;一个元素的高度设置是 80px&#xff0c;但内容高度不只是 80px&#xff0c;内容此时就叫做溢出了。 那需要注意的…

【QT学习】1-2 Liunx环境下QT5.12.9软件安装1——VMware17.0.0虚拟机安装

注意&#xff1a;如果电脑已经安装低版本的VMware&#xff0c;千万不要卸载&#xff0c;直接覆盖安装&#xff0c;更新到新的安装版本 1.点击.exe文件&#xff0c;右键以管理员身份运行&#xff0c;点击下一步&#xff0c;下一步 2.选择软件安装位置后&#xff0c;点击下一步。…

Datawhale X 李宏毅苹果书 AI夏令营(深度学习进阶)task3

批量归一化 其实归一化简单一点理解就类似于我们学过的数学中的每个数值减去平均值除以标准差。 神经网络中的批量归一化&#xff08;Batch Normalization&#xff0c;BN&#xff09;就是其中一个“把山铲平”的想法。不要小看优化这个问题&#xff0c;有时候就算误差表面是凸…

面试基本内容

1.类加载器 类加载器加载过程: 加载:&#xff08;将字节码文件加载到运行时数据区的方法区中/元空间&#xff09; 链接:&#xff08;验证:检查字节码文件是否合法—>准备:静态类变量赋值为默认值&#xff0c;不会实例变量分配初始化—>解析:将常量池引用&#xff0c;转化…

Java | Leetcode Java题解之第382题链表随机节点

题目&#xff1a; 题解&#xff1a; class Solution {ListNode head;Random random;public Solution(ListNode head) {this.head head;random new Random();}public int getRandom() {int i 1, ans 0;for (ListNode node head; node ! null; node node.next) {if (rando…

14.神经网络的基本骨架 - nn.Module 的使用

神经网络的基本骨架 - nn.Module 的使用 Pytorch官网左侧&#xff1a;Python API&#xff08;相当于package&#xff0c;提供了一些不同的工具&#xff09; 关于神经网络的工具主要在torch.nn里 网站地址&#xff1a;torch.nn — PyTorch 1.8.1 documentation Containers C…

【Linux】CodeServer:云IDE部署

Code-server 是一个开源项目&#xff0c;它允许你在任何地方通过浏览器访问 Visual Studio Code&#xff08;VS Code&#xff09;编辑器。这意味着你可以在远程服务器或云端运行 VS Code&#xff0c;并通过浏览器进行编码、调试和开发&#xff0c;而不需要在本地安装 VS Code。…

EtherCAT 转 ModbusTCP 网关

设备简介 本产品是 EtherCAT 和 Modbus TCP 网关&#xff0c;使用数据映射方式工作。 本产品在 EtherCAT 侧作为 EtherCAT 从站&#xff0c;接 TwinCAT 、 CodeSYS 、 PLC等&#xff1b;在 ModbusTCP 侧做为 ModbusTCP 主站&#xff08; Client &#xff09;或从站…

<数据集>无人机识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;9229张 标注数量(xml文件个数)&#xff1a;9229 标注数量(txt文件个数)&#xff1a;9229 标注类别数&#xff1a;1 标注类别名称&#xff1a;[UAV] 使用标注工具&#xff1a;labelImg 标注规则&#xff1a;对类别…

我如何解决 java.lang.ClassNotFoundException:javax.xml.bind.DatatypeConverter

优质博文&#xff1a;IT-BLOG-CN 问题 我如何解决java.lang.ClassNotFoundException&#xff1a;javax.xml.bind.DatatypeConverter 2024-08-25T02:31:25.46202:00 ERROR 21868 --- [fintonic-oauth] [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet…

springAI框架学习总结

springAI 1.springAI基本介绍 springAI是一个AI工程应用框架&#xff0c;其目标是将 Spring 生态系统设计原则&#xff08;例如可移植性和模块化设计&#xff09;应用于 AI 领域&#xff0c;并推广使用 POJO 作为 AI 领域应用程序的构建块。 2.特性 灵活的AIP支持chat,text…

Matlab R2022b使用Camera Calibrator工具箱张正友标定法进行相机标定附带标定前后对比代码

打开Camera Calibrator 在这添加你拍摄的图片 根据你每个方块的实际边长填写&#xff0c;我是15mm。 通俗一点&#xff0c;要k3就选3 Coefficients&#xff0c;否则为0&#xff1b;要p1、p2就选Tangential Distortion。然后进行计算。 可以点击右侧误差高的选中图像进行移…

【计算机网络】计算机网络的分层结构

为什么要分层&#xff1f;为什么要制定协议&#xff1f; 计算机网络功能复杂→采用分层结构&#xff0c;将诸多功能合理地划分在不同层次→对等层之间制定协议&#xff0c;以实现功能。