当前位置: 首页 > news >正文

QuickJS 如何发送一封邮件 ?

参阅:bellard.org‌ : QuickJS 如何使用 qjs 执行 js 脚本

在 QuickJS 中发送邮件需要依赖外部库或调用系统命令,因为 QuickJS 本身不包含 SMTP 功能。以下是两种实现方法:

方法 1:调用系统命令(推荐)

使用 QuickJS 的 std 模块调用 curl 命令发送邮件(适用于 Linux/macOS):

// qjs sendmail.js
import * as std from 'std';// 邮件配置
const smtpServer = 'smtp://smtp.example.com:587';
const username = 'your_email@example.com';
const password = 'your_password';
const from = 'sender@example.com';
const to = 'recipient@example.com';
const subject = 'QuickJS 邮件测试';
const body = '这是一封来自 QuickJS 的测试邮件';
const attachmentPath = '/path/to/attachment.txt';// 构建 curl 命令
const command = ['curl','--url', smtpServer,'--user', `${username}:${password}`,'--mail-from', from,'--mail-rcpt', to,'--upload-file', '-','--ssl-reqd'
].join(' ');// 构建 MIME 邮件内容
const boundary = 'quickjs-boundary';
const mimeMessage = [`From: <${from}>`,`To: <${to}>`,`Subject: ${subject}`,`MIME-Version: 1.0`,`Content-Type: multipart/mixed; boundary="${boundary}"`,'',`--${boundary}`,'Content-Type: text/plain; charset=utf-8','',body,'',`--${boundary}`,`Content-Type: application/octet-stream; name="${attachmentPath.split('/').pop()}"`,'Content-Disposition: attachment','Content-Transfer-Encoding: base64','',std.loadFile(attachmentPath, 'binary').toString('base64'),'',`--${boundary}--`
].join('\r\n');// 执行命令
const proc = std.popen(command, 'w');
proc.puts(mimeMessage);
proc.close();console.log('邮件发送完成');

运行命令:

qjs sendmail.js

方法 2:使用原生模块(需要编译)

需要编写 C 扩展模块并编译进 QuickJS:

  1. 创建 mailer.c
#include "quickjs.h"
#include <libesmtp.h>static JSValue sendMail(JSContext *ctx, JSValueConst this_val,int argc, JSValueConst *argv) {// 实现 SMTP 邮件发送逻辑// 使用 libesmtp 库 (https://libesmtp.github.io/)// ...
}static const JSCFunctionListEntry funcs[] = {JS_CFUNC_DEF("send", 1, sendMail),
};static int mailer_init(JSContext *ctx, JSModuleDef *m) {return JS_SetModuleExportList(ctx, m, funcs, countof(funcs));
}JSModuleDef *js_init_module_mailer(JSContext *ctx, const char *module_name) {JSModuleDef *m = JS_NewCModule(ctx, module_name, mailer_init);if (!m) return NULL;JS_AddModuleExportList(ctx, m, funcs, countof(funcs));return m;
}
  1. 编译 QuickJS 并链接 libesmtp:
gcc -o qjs mailer.c qjs.c -Iquickjs -lesmtp -lssl -lcrypto
  1. 在 QuickJS 中使用:
import * as mailer from 'mailer';mailer.send({server: 'smtp.example.com:587',user: 'your_email@example.com',pass: 'your_password',from: 'sender@example.com',to: 'recipient@example.com',subject: '测试邮件',body: '邮件正文',attachments: ['/path/to/file.txt']
});

注意事项:

  1. curl 方法要求

    • 系统需安装 curl (7.20.0+)
    • 附件需可读且大小不超过邮件服务器限制
    • 敏感信息建议从环境变量读取
  2. 安全建议

    // 从环境变量读取凭据
    const username = std.getenv('SMTP_USER');
    const password = std.getenv('SMTP_PASS');
    
  3. Windows 系统

    • 使用 PowerShell 的 Send-MailMessage
    const psCommand = [`Send-MailMessage`,`-From '${from}'`,`-To '${to}'`,`-Subject '${subject}'`,`-Body '${body}'`,`-Attachments '${attachmentPath}'`,`-SmtpServer '${smtpServer.split(':')[0]}'`,`-Port ${smtpServer.split(':')[1] || 587}`,`-Credential (New-Object System.Management.Automation.PSCredential('${username}', (ConvertTo-SecureString '${password}' -AsPlainText -Force)))`
    ].join(' ');std.system(`powershell -Command "${psCommand}"`);
    
  4. 替代方案

    • 使用 HTTP API 发送(如 Mailgun/SendGrid)
    • 调用 Python/Node.js 脚本处理邮件发送

对于简单需求,调用系统命令是最快实现方式。对于复杂应用,建议使用 Node.js 等更成熟的运行时环境。

http://www.xdnf.cn/news/924931.html

相关文章:

  • 区块链技术概述
  • Global Security Market知识点总结:主经纪商业务
  • 提高Python编程效率的工具推荐
  • Windows 系统安装 Redis 详细教程
  • 启程:为何选择PHP?
  • STM32学习笔记:定时器(TIM)原理与应用(详解篇)
  • Python入门手册:异常处理
  • 华为OD机试_2025 B卷_人民币转换(Python,100分)(附详细解题思路)
  • 生物发酵展同期举办2025中国合成生物学与生物制造创新发展论坛
  • 36、stringstream
  • AI编程提示词
  • 数据结构测试模拟题(4)
  • 运动控制系统 数控系统 激光切割和焊接系统的特点相同点交叉侧重点
  • 零基础入门PCB设计 强化篇 第五章(实验——51单片机核心板PCB绘制)
  • 【Oracle】数据仓库
  • C++.OpenGL (14/64)多光源(Multiple Lights)
  • [面试精选] 0104. 二叉树的最大深度
  • 历史数据分析——唐山港
  • QT聊天项目DAY14
  • STC8H系列 驱动步进电机
  • 分享下量化快速选股和回测的方法
  • 题目 3241: 蓝桥杯2024年第十五届省赛真题-挖矿
  • 性能优化笔记
  • 《机器学习》(周志华)第一章 绪论
  • 【看到哪里写到哪里】C的“数组指针”
  • 洛谷P12170 [蓝桥杯 2025 省 Python B] 攻击次数
  • 罗尔斯·罗伊斯数字孪生技术赋能航空发动机运维革新:重构维护范式,驱动行业低碳转型
  • 如何拥有自己的镜像和仓库
  • Java 反射机制详解及示例
  • 【数据结构初阶】--算法复杂度的深度解析