如何使用node.js中的nodemailer和request模块,将URL上的图片附加到电子邮件中?

6
我是一名有用的助手,可以为您翻译文本。以下是需要翻译的内容:

我刚接触JavaScript和Node.js,尝试通过实践学习它。因此,我想发送带有图像附件的电子邮件。该图像将通过发出HTTP GET请求从远程服务器检索,并通过nodemailer(SMTP)发送到电子邮件地址。

通过阅读文档和查看示例, 我成功发送了没有附件的电子邮件,但我无法弄清如何使用流发送它。我使用了以下代码,但它返回一个错误,我自己无法修复并需要帮助:

var nodemailer = require('nodemailer');
var request = require('request');
var config = require('../config');
var mailer;

mailer = function (opts) {
    var transporter = nodemailer.createTransport({
        service: 'Gmail',
        auth: {
            user: config.GmailAuth.email,
            pass: config.GmailAuth.password
        }
    });

    var mailOptions = {
        from: opts.from, // sender address
        to: opts.to, // list of receivers
        subject: opts.subject, // Subject line
        html: opts.body,  // html body
        attachments: [
            {
                filename: 'screenshot.png',
                content: request(opts.imageUrl)  // <-- Error here 
            }
        ]
    };

    transporter.sendMail(mailOptions, function(error, info){
        if (error) {
            return console.log(error);
        } else {
            console.log('Message sent: ' + info.response);
        }
    });
}

mailer({
        from: config.GmailAuth.email,
        to: config.sendToAddress, 
        subject: 'TEST SUBJECT',
        body: 'TEST MESSAGE BODY',
        imageUrl: 'URL_to_an_image_for_HTTP_GET_request'
       });

发生以下错误:
stream.js:74
      throw er; // Unhandled stream error in pipe.
      ^

Error: write after end
    at writeAfterEnd (_stream_writable.js:159:12)
    at Encoder.Writable.write (_stream_writable.js:204:5)
    at Encoder.Writable.end (_stream_writable.js:433:10)
    at Request.<anonymous> (C:\Users\user\Desktop\graphite_monitor\node_modules\
buildmail\src\buildmail.js:573:35)
    at Request.g (events.js:260:16)
    at emitOne (events.js:82:20)
    at Request.emit (events.js:169:7)
    at Request.onRequestError (C:\Users\user\Desktop\graphite_monitor\node_modul
es\request\request.js:820:8)
    at emitOne (events.js:77:13)
    at ClientRequest.emit (events.js:169:7)

什么是问题,我该如何修复它?
2个回答

4

尝试更改这个:

attachments: [
  {
    filename: 'screenshot.png',
    content: request(opts.imageUrl)  // <-- Error here 
  }
]

to:

attachments: [
  {
    filename: "pin-marker.png",
    path: "http://img.mapeando.net/map/pin-marker.png", // <-- should be path instead of content
    cid: "pin-marker.png"
  }
]

我已经尝试了那段代码,它添加了一个附件,但没有下载图片,只是在文档中附加了一个名为“screenshot.png”的.txt文件,并在其中包含了链接。 - Ilya Khadykin
不,这也不起作用。通过仔细查看文档,我发现将任何字符串作为内容传递只会将一个带有该字符串的文本文件作为附件添加到正文中(这是有道理的),引用:content - 附件的字符串、缓冲区或流内容 - Ilya Khadykin
@m-a-ge 我已经测试过了,我收到了一封带有图片的电子邮件。 - Jonatas Walker
嗯,运行代码的计算机在代理服务器下,我使用https协议发送HTTP GET请求。我想我的配置可能是问题所在。感谢您的帮助。 - Ilya Khadykin

2

我已经使用PassThrough Streams使其工作(这里有一个类似的问题),这是可行的代码(在我的初始代码中添加必要的更改):

var PassThrough = require('stream').PassThrough;

var nameOfAttachment = 'screenshot.png';
var imageUrlStream = new PassThrough();
request
     .get({
             proxy: 'http://YOUR_DOMAIN_NAME:3129', // if needed
             url: opts.imageUrl
         })
     .on('error', function(err) {
             // I should consider adding additional logic for handling errors here
             console.log(err);
    })
     .pipe(imageUrlStream);

var mailOptions = {
    from: opts.from, // sender address
    to: opts.to, // list of receivers
    subject: opts.subject, // Subject line
    html: opts.body, // html body
    attachments: [
        {
            filename: nameOfAttachment,
            content: imageUrlStream
        }
    ]
};

我希望这能帮助其他初学者。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接