如何为 Amazon SES sendRawEmail 创建邮件正文



我正在尝试在使用 AWS Node.js 开发工具包时自定义标头。

似乎发送电子邮件 API 端点和随附的 SDK 方法不支持自定义标头。

因此,要使用的适当方法是发送原始电子邮件。

不幸的是,我找不到真正有助于撰写原始电子邮件的好信息或软件包。这意味着发送纯文本和 html 格式,并根据 RFC 2822 和 RFC 5322 创建消息正文和标头。

用 JavaScript 编写的原始主体的简单方法会是什么样子?

这是我想出的一个准系统函数,它只有AWS Javascript SDK作为依赖项。我一开始做错的一件事是 Base 64 编码RawMessage.Data,但AWS SDK已经处理好了。

空行n也很重要。

const sendRawEmail = async () => {
    // Set up from_name, from_email, to, subject, message_id, plain_text, html and configuration_set variables from database or manually
    var date = new Date();
    var boundary = `----=_Part${ Math.random().toString().substr( 2 ) }`;
    var rawMessage = [
        `From: "${ from_name }" <${ from_email }>`, // Can be just the email as well without <>
        `To: ${ to }`,
        `Subject: ${ subject }`,
        `MIME-Version: 1.0`,
        `Message-ID: <${ message_id }@eu-west-1.amazonses.com>`, // Will be replaced by SES
        `Date: ${ formatDate( date ) }`, // Will be replaced by SES
        `Return-Path: <${ message_id }@eu-west-1.amazonses.com>`, // Will be replaced by SES
        `Content-Type: multipart/alternative; boundary="${ boundary }"`, // For sending both plaintext & html content
        // ... you can add more headers here as decribed in https://docs.aws.amazon.com/ses/latest/DeveloperGuide/header-fields.html
        `n`,
        `--${ boundary }`,
        `Content-Type: text/plain; charset=UTF-8`,
        `Content-Transfer-Encoding: 7bit`,
        `n`,
        plain_text,
        `--${ boundary }`,
        `Content-Type: text/html; charset=UTF-8`,
        `Content-Transfer-Encoding: 7bit`,
        `n`,
        html,
        `n`,
        `--${ boundary }--`
    ]
    // Send the actual email
    await ses.sendRawEmail( {
        Destinations: [
            to
        ],
        RawMessage: {
            Data: rawMessage.join( 'n' )
        },
        Source: from_email, // Must be verified within AWS SES
        ConfigurationSetName: configuration_set, // optional AWS SES configuration set for open & click tracking
        Tags: [
            // ... optional email tags
        ]
    } ).promise();
}

这些是用于格式化日期标题的实用工具方法。您也可以像moment().format('ddd, DD MMM YYYY HH:MM:SS ZZ');一样简单地使用moment库,但这并不重要,因为无论如何,日期标头都会被 AWS SES 覆盖。

// Outputs timezone offset in format ZZ
const getOffset = ( date ) => {
    var offset          = - date.getTimezoneOffset();
    var offsetHours     = Math.abs( Math.floor( offset / 60 ) );
    var offsetMinutes   = Math.abs( offset ) - offsetHours * 60;
    var offsetSign      = ( offset > 0 ) ? '+' : '-';
    return offsetSign + ( '0' + offsetHours ).slice( -2 ) + ( '0' + offsetMinutes ).slice( -2 );
}
// Outputs two digit inputs with leading zero
const leadingZero = ( input ) => ( '0' + input ).slice( -2 );
// Formats date in ddd, DD MMM YYYY HH:MM:SS ZZ
const formatDate = ( date ) => {
    var weekdays = [ 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun' ];
    var months = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ];
    var weekday = weekdays[ date.getDay() ];
    var day = leadingZero( date.getDate() );
    var month = months[ date.getMonth() ];
    var year = date.getFullYear();
    var hour = leadingZero( date.getHours() );
    var minute = leadingZero( date.getMinutes() );
    var second = leadingZero( date.getSeconds() );
    var offset = getOffset( date );
    return `${ weekday }, ${ day } ${ month } ${ year } ${ hour }:${ minute }:${ second } ${ offset }`;
}

你应该看看另一个负责撰写带有标头的电子邮件的 npm 包,例如 nodemailer。经过几分钟的谷歌搜索,我在这里找到了一个设置标题和通过SES发送电子邮件的示例,他们正在使用mailcomposer,这是nodemailer的前身

更新:似乎nodemailer不再公开build方法,但是他们还有另一个来自nodemailer-ses-transport的包,它似乎完全可以满足您的需求,自定义标头并通过SES发送。

最新更新