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

Javascript 如何为Amazon SES sendRawEmail创建邮件正文,javascript,node.js,amazon-web-services,aws-sdk,amazon-simple-email-service,Javascript,Node.js,Amazon Web Services,Aws Sdk,Amazon Simple Email Service,我试图在使用AWS Node.js SDK时自定义标题 和似乎不支持自定义标题 因此,合适的方法是 不幸的是,我找不到好的信息,也找不到真正有助于编写原始电子邮件的软件包。这意味着发送纯文本和html格式,并根据RFC 2822和RFC 5322创建消息正文和标题 用JavaScript编写原始正文的简单方法是什么样子的?您应该看看另一个负责编写带有标题的电子邮件的npm包,例如。在谷歌搜索了几分钟后,我发现了一个通过SES设置邮件头和发送电子邮件的例子,他们使用的是mailcomposer,它

我试图在使用AWS Node.js SDK时自定义标题

和似乎不支持自定义标题

因此,合适的方法是

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


用JavaScript编写原始正文的简单方法是什么样子的?

您应该看看另一个负责编写带有标题的电子邮件的npm包,例如。在谷歌搜索了几分钟后,我发现了一个通过SES设置邮件头和发送电子邮件的例子,他们使用的是mailcomposer,它是nodemailer的前身


更新:nodeEmailer似乎不再公开
build
方法,但他们提供了另一个包,它似乎可以完全满足您的需要,定制标题并通过SES发送。

我提出了一个简单的函数,它只依赖于
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();

}

谢谢,nodemailer看起来是个不错的方法,但我认为在云功能中使用它有很大的依赖性。(我知道我在第一个问题中没有提到这个细节)。
// 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 }`;

}