【问题标题】:Nodejs and Mailgun: Send generated attachment *not* from file systemNodejs 和 Mailgun:从文件系统发送生成的附件 *not*
【发布时间】:2021-05-27 00:02:56
【问题描述】:

我在节点应用程序中生成附件,并希望使用 Mailgun 发送它们。我无权访问文件系统(Netlify 函数)。

有没有简单的方法可以做到这一点?

洞口图片

这是一个 Jamstack(Gatsby/React、Netlify、Mailgun)网络应用。客户配置并请求报价。浏览器生成并发布提供 图像到 Netlify 函数(获取 api)。该功能发送带有 PDF 报价和附加图像的报价邮件。

我测试的代码(编辑:02/25)

const path = require('path');
const fs = require('fs');
const mailgun = require('mailgun-js')
const FormData = require('form-data');
const { Readable } = require('stream');

const API_KEY = 'SECRET';
const DOMAIN = 'brasilius.de';

const mg = mailgun({apiKey: API_KEY, domain: DOMAIN, host: "api.eu.mailgun.net"});

const stream = fs.createReadStream('test.txt');                     // This works
/* {
  id: '<20210225115125.1.BF14CC322F8E0DAC@brasilius.de>',
  message: 'Queued. Thank you.'
} */

/*
const stream = Readable.from(["Send this text as attachment."])   // Won't work

{ message: "'from' parameter is missing" }
*/

const data = {
  from: 'Excited User <me@brasilius.de>',
  to: 'test@user.de',
  subject: 'Hello',
  text: 'Testing some Mailgun awesomeness!',
  attachment: stream
};

mg.messages().send(data, (error, body) => {
  console.log(body);
});

【问题讨论】:

  • 如果您使用类似 nodemailer 的 mailgun 接口,您可以将附件作为来自其他来源的流来引用。
  • 谢谢@Joe。你认为(甚至知道)这是唯一的方法吗?我在我的问题中附加了一些代码。

标签: node.js gatsby mailgun netlify netlify-function


【解决方案1】:

我找到的最简单的解决方案here

// https://thecodebarbarian.com/sending-emails-using-the-mailgun-api.html

const mailgun = require('mailgun-js')

const mg = mailgun({apiKey: process.env.API_KEY, domain: process.env.DOMAIN, host: "api.eu.mailgun.net"});

const filename = 'test.txt';
const text = "Example test content."
const attch = new mg.Attachment({data: Buffer.from(text), filename: filename})

const data = {
  from: process.env.FROM,
  to: process.env.TO,
  subject: 'Hello',
  text: 'Testing Mailgun attachments.',
  attachment: attch
};

mg.messages().send(data, (error, body) => {
  console.log(body);
});

正如@Joe 所推荐的,使用 Nodemailers Mailcomposer 的解决方案:

// See: https://documentation.mailgun.com/en/latest/api-sending.html#examples
// See: http://nodemailer.com/extras/mailcomposer/#attachments

const mailgun = require('mailgun-js')
const MailComposer = require('nodemailer/lib/mail-composer');

const mg = mailgun({apiKey: process.env.API_KEY, domain: process.env.DOMAIN, host: "api.eu.mailgun.net"});

const mailOptions = {
  from: process.env.FROM,
  subject: 'Hello',
  text: 'Testing Mailgun attachments.',
  attachments: [
    { // utf-8 string as an attachment
      filename: 'text.txt',
      content: 'For testing just a text file. This could be a ReadStream, Buffer or other.'
    }
  ]
};

const mail = new MailComposer(mailOptions);

mail.compile().build(function(mailBuildError, message) {

  var dataToSend = {
    to: process.env.TO,
    message: message.toString('ascii')
  };

  mg.messages().sendMime(dataToSend, function(sendError, body) {
    if (sendError) {
      console.log(sendError);
      return;
    }
  });
});

【讨论】:

  • 第一个解决方案不适用于大型附件,但我没有直接使用 mailgun 的东西来了解是否有更好的解决方案。
  • 好像 Mailgun API 不接受 ReadStreams。 const attch = new mg.Attachment({data: Readable.from([text]), filename: filename})返回一个不相关的错误消息{ message: "'from' parameter is missing" }(第一个解决方案)。有点东西,我在这里想念。但无论如何,我的附件小于 1MB。
猜你喜欢
  • 1970-01-01
  • 2012-12-23
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多