QuickJS 如何发送一封邮件 ?

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

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

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

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

javascript 复制代码
// qjs sendmail.js
import * as std from 'std';

// 邮件配置
const smtpServer = 'smtp://smtp.example.com:587';
const username = '[email protected]';
const password = 'your_password';
const from = '[email protected]';
const to = '[email protected]';
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('邮件发送完成');

运行命令:

bash 复制代码
qjs sendmail.js

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

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

  1. 创建 mailer.c
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:
bash 复制代码
gcc -o qjs mailer.c qjs.c -Iquickjs -lesmtp -lssl -lcrypto
  1. 在 QuickJS 中使用:
javascript 复制代码
import * as mailer from 'mailer';

mailer.send({
  server: 'smtp.example.com:587',
  user: '[email protected]',
  pass: 'your_password',
  from: '[email protected]',
  to: '[email protected]',
  subject: '测试邮件',
  body: '邮件正文',
  attachments: ['/path/to/file.txt']
});

注意事项:

  1. curl 方法要求

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

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

    • 使用 PowerShell 的 Send-MailMessage
    javascript 复制代码
    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 等更成熟的运行时环境。

相关推荐
开开心心就好5 分钟前
高效Excel合并拆分软件
开发语言·javascript·c#·ocr·排序算法·excel·最小二乘法
特立独行的猫a10 分钟前
Nuxt.js 中的路由配置详解
开发语言·前端·javascript·路由·nuxt·nuxtjs
中微子12 分钟前
小白也能懂:JavaScript 原型链和隐藏类的奇妙世界
javascript
咸虾米13 分钟前
在uniCloud云对象中定义dbJQL的便捷方法
前端·javascript
梨子同志14 分钟前
JavaScript Proxy 和 Reflect
前端·javascript
海的诗篇_16 分钟前
移除元素-JavaScript【算法学习day.04】
javascript·学习·算法
__Yx__19 分钟前
JavaScript核心概念输出——原型链
javascript
挑战者6668881 小时前
vue入门环境搭建及demo运行
前端·javascript·vue.js
Canmick1 小时前
JavaScript 异步函数健身操
前端·javascript
前端小崔2 小时前
前端面试题之ES6保姆级教程
开发语言·前端·javascript·面试·职场和发展·ecmascript·es6