使用Nodemailer SES Transport SDK时遇Unexpected token '.'错误求助
Nodemailer集成AWS SES SDK报错分析与修复方案
错误原因分析
- Node.js版本过低:
SyntaxError: Unexpected token '.'最常见诱因是代码使用了低版本Node.js不支持的新语法(如可选链?.、空值合并??)。AWS SES SDK v3及以上版本依赖这些特性,若你的Node.js版本低于14.x,必然触发该错误。 - 依赖版本不兼容:Nodemailer与SES SDK版本不匹配,比如用了高版本SES SDK但搭配的Nodemailer SES传输适配器版本老旧,导致语法冲突。
- 代码语法误用:手动编写的集成代码中,不小心使用了当前环境不支持的新语法。
修复方案
1. 升级Node.js版本
先检查当前Node.js版本:
node -v
若版本低于14.x,升级至14.x及以上的LTS版本(推荐16.x或18.x),确保兼容SES SDK v3的语法要求。
2. 调整依赖版本(不升级Node.js的备选方案)
降级SES SDK到v2版本(不依赖新语法),同时搭配适配的Nodemailer传输包:
- 修改
package.json依赖:{ "dependencies": { "nodemailer": "^6.9.0", "nodemailer-ses-transport": "^1.5.1", "aws-sdk": "^2.1300.0" } } - 重新安装依赖:
npm install
3. 修正集成代码
场景一:使用SES SDK v2 + nodemailer-ses-transport
const nodemailer = require('nodemailer'); const sesTransport = require('nodemailer-ses-transport'); const AWS = require('aws-sdk'); // 配置AWS SES AWS.config.update({ accessKeyId: '你的AWS Access Key', secretAccessKey: '你的AWS Secret Key', region: '你的SES区域(如us-east-1)' }); // 创建SES传输器 const transporter = nodemailer.createTransport(sesTransport({ ses: new AWS.SES({ apiVersion: '2010-12-01' }) })); // 批量发送邮件示例 async function sendBatchEmails(emails) { const promises = emails.map(email => transporter.sendMail({ from: '已在SES验证的发件邮箱', to: email.to, subject: email.subject, text: email.content })); await Promise.all(promises); }
场景二:使用SES SDK v3(需Node.js >=14.x)
const nodemailer = require('nodemailer'); const { SESClient } = require('@aws-sdk/client-ses'); const { awsSesNodemailer } = require('nodemailer-ses-v2-transport'); // 创建SES客户端 const sesClient = new SESClient({ credentials: { accessKeyId: '你的AWS Access Key', secretAccessKey: '你的AWS Secret Key' }, region: '你的SES区域(如us-east-1)' }); // 创建传输器 const transporter = nodemailer.createTransport(awsSesNodemailer({ ses: sesClient })); // 批量发送邮件(控制并发适配SES每秒15封限制) async function sendBatchEmails(emails) { const batchSize = 15; for (let i = 0; i < emails.length; i += batchSize) { const batch = emails.slice(i, i + batchSize); const promises = batch.map(email => transporter.sendMail({ from: '已在SES验证的发件邮箱', to: email.to, subject: email.subject, text: email.content })); await Promise.all(promises); // 跨批次延迟,避免触发速率限制 if (i + batchSize < emails.length) { await new Promise(resolve => setTimeout(resolve, 1000)); } } }
4. 验证环境配置
- 确认AWS账号已开通SES服务,发件邮箱/域名完成验证
- 检查AWS权限,确保所用Access Key拥有
ses:SendEmail和ses:SendRawEmail权限
内容的提问来源于stack exchange,提问作者Simon Nazarenko
相关产品推荐
相关产品推荐

