【问题标题】:Send image with node mailer via async/await通过 async/await 使用节点邮件程序发送图像
【发布时间】:2021-04-25 15:52:20
【问题描述】:

如何在 triggerExample.ts 中正确获取 mailOptions?

mail.ts:

export const sendNewMail = async (html: string, emails: string[]) => {
  let smtpTransport = nodemailer.createTransport({
    service: "Gmail",
    auth: {
      user: "...",
      pass: "...",
    },
  });
  };

triggerExample.ts:

import { sendNewMail  } from "../../mail.ts";

const ordersExample = await getExample();
    ordersExample.forEach(async order => {
      const email = order.sentEmails.email
let html = ` ...
         <img src="cid:image" width="100%" />

`;

      await sendNewMail (html,[email]);

如何正确地将这个带有 async/await 的 mailOptions 放入 triggerExample.ts 中:

  var mailOptions = {
    from: "@gmail.com",
    to: emails,
    subject: "subject",
    html: html,
    attachments: [{
      path: __dirname + '/image.jpg',
      cid: 'image' 
  }],
  };
  return smtpTransport.sendMail(
    mailOptions,
    function (error: Error, response: Response) {
      if (error) {
        errors.logError(error);
      } else {
        console.log(`Message sent to ${errors}`);
      }
    }
  );

【问题讨论】:

  • 您好,您可以使用 try/catch 块来获取等待接收您的选项作为参数的 sendmail 的错误?等待 sendmail 函数的结果会为您提供响应中的信息/元数据。如果你需要一个例子,请告诉我。想知道为什么要将图片作为附件包含在内,但您有一个特定的要求,以便您不只是链接到托管在某处的图片?
  • 是的,请,如果你能展示一个例子,那就太好了。是的,我需要它在附件中,只是链接对我不起作用
  • a) 你cannot use forEach for asynchronous code。 b)那个``方法似乎没有返回一个承诺,你need to promisify it
  • 我不太明白你问题中的三个sn-ps是如何相互关联的。

标签: javascript node.js typescript async-await nodemailer


【解决方案1】:

您似乎了解如何发送电子邮件,也了解如何将图像附加到电子邮件中。你真正不明白的是如何在 promise 的范围内使用 this?

为了帮助您更好地理解代码流程及其布局方式,我创建了一个示例,您可以通过添加自己的内容和邮件选项来自定义它,您还可以在必要时将其转换为 typescript:

send.js:

const nodemailer = require('nodemailer')
const config = {
  port: 'your smtp port',
  host: 'your smtp host',
  user: 'your username',
  pass: 'your password',
  from: {
    name: 'Sender Name',
    email: 'Sender Email Address'
  }
}
module.exports = {
  send(payload) {
    return new Promise(async (resolve, reject) => {
      try {
        const { subject, name, email } = payload
        // The plaintext version
        const text = 'Hello World!'
        // The html version
        const html = '<p>Hello World!</p>'
        // create reusable transporter object using the default SMTP transport
        const transporter = nodemailer.createTransport({
          port: config.port,
          host: config.host,
          auth: {
            user: config.user,
            pass: config.pass
          },
          secure: true
        })
        // setup email options here
        const mailOptions = {
          from: `"${config.from.name}" <${config.from.email}>`, // sender address
          to: `"${name}" <${email}>`, // comma seperated list of receivers
          subject, // Subject line
          text, // plain text body
          html // html body
        }
        // send mail with defined transport object
        const info = await transporter.sendMail(mailOptions)
        // Success
        return resolve(info)
      } catch (err) {
        return reject(err)
      }
    })
  },
};

main.js:

const { send } = require('./send.js');

(async () => {
  try {
    const payload = {
      subject: 'Test Email',
      name: 'Some Person',
      email: 'Their Email Address'
    }
    const info = await send(payload)
    console.log('successfully sent the email:')
    console.log(info)
  } catch (err) {
    console.log('failed to send the email:')
    console.log(err)
  }
})();

在结果成功的情况下:

{ accepted: [ 'name@domain.tld' ],
  rejected: [],
  envelopeTime: 605,
  messageTime: 596,
  messageSize: 620,
  response:
   '250 Ok someidortheother',
  envelope:
   { from: 'sender@senderdomain.tld',
     to: [ 'name@domain.tld' ] },
  messageId: '<messageidblah@senderdomain.tld>' }

我也可以建议您始终包含电子邮件的纯文本版本,以便它可以在不支持或已配置为不显示 html 正文内容的电子邮件客户端中呈现。

【讨论】:

    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 2022-08-18
    • 2018-09-20
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多