电子邮件已打开/未从nodejs nodemailer跟踪

时间:2015-01-22 06:03:51

标签: node.js email email-attachments amazon-ses nodemailer

我所知道的

我想在我的某个网站中实施已打开/未跟踪的电子邮件。搜索后我发现电子邮件打开/不跟踪是通过发送嵌入图像和电子邮件(通常是1像素透明)来完成的。当有人打开电子邮件,如果他们允许图像,那么我们得到图像的请求,我们跟踪它。

我用什么来实现我所知道的

我正在为项目使用MEAN堆栈,而节点制作者使用amazon ses作为发送服务发送电子邮件。

问题

我能够使用上述技术发送嵌入的图像,但问题出在节点邮件程序中,您必须将图像作为电子邮件附件附加到嵌入图像。所以,没有来自邮件客户端的调用返回到我在图像文件中提到的callback-url(因为电子邮件客户端已经有了该文件)。我如何实现它来跟踪打开/不打开的邮件。如果使用nodemailer无法做到这一点,请指出正确的方向。

我的专业知识

我仍然是初学者,如果上面的内容错了,请原谅并纠正我。

5 个答案:

答案 0 :(得分:3)

我不是百分百确定我发布的内容是否正确,但我找到了一种方法让它发挥作用。由于这篇文章一直没有得到任何有效答案,我看到有人看到它我正在回答我自己的问题

如果您使用节点邮件发送1px pic和电子邮件作为附件,则无法跟踪电子邮件的打开,因为它会自动呈现并随邮件一起发送文件。(没有外部调用服务器=您无法检测到) 。像往常一样使用节点邮件程序渲染HTML,并将带有源的图片输入到服务器中的路径,如下所示

<html>
   <body>
      <img src="http://YOUR_SITE.com/track/this/image/UNIQUE_ID_FOR_THIS_IMAGE.jpg">
   </body>
</html>

现在您的节点邮件程序中没有附件,并且该文件不会随电子邮件一起发送,但会在有人打开电子邮件时提取以进行呈现。

您可以使用网址中的唯一键跟踪谁打开了电子邮件。

P.S。不要忘记为请求发送(1x1)px img文件。这样客户端就不会发生404错误。

答案 1 :(得分:0)

在包含该邮件的电子邮件正文后面注入一个html行。 您也可以将文件附加到SES出站电子邮件,但建议不要这样做。

答案 2 :(得分:0)

编辑:这个答案没用,因为在发送电子邮件之前,网址由邮件管理员解析。仍然会留在这里,因为它可能指向某人正确的方向。

从nodemailer 1.3.4版开始,您可以将URL用作附件,例如:

attachments: [
{
  filename: 'receipt.png',
  path: 'http://example.com/email-receipt?id=1\&email=ex@ample.com',
  cid: 'receipt@example.com'
}
//...

然后,您只需将其嵌入HTML:

<img src="cid:receipt@example.com">

这样就可以了。 可能有用的是,在我的例子中,URL返回文件下载。

我仍然无法理解网址是否由网络邮件程序,包装或电子邮件客户端解析。但有些事情正在发生,因为我已经测试了Thunderbird和Geary(桌面),Gmail和Rainloop(浏览器)以及它的工作。

不能保证在每种情况下都能正常工作。

答案 3 :(得分:0)

我回答这个问题的时间已经很晚了。我也想跟踪邮件,所以经过一些研究后得出了以下解决方案。可能不是最好的,但我想它会正常工作。

    var mailOptions = {
        from: 'Name <email@gmail.com>', // sender address
        to: 'email2@gmail.com', // list of receivers
        subject: 'Hello', // Subject line
        text: 'Hello world', // plaintext body
        html: {
          path : 'mail.html'
        }, // html body
        attachments: [{
          filename : "fileName.txt",
          path : 'fileName.txt'
        }]
    };

以上是nodeMailer的邮件选择代码。

    <p>
      Hello User,
        What is required to do the above things?
    </p>

    <img src="http://localhost:8080/" alt="" />

以上是mail.html

我设置了一个处理请求的服务器。然后我写了一个用于分析的中间件。

    var express = require('express');
    var app = express();

    app.use(function (req, res, next) {
      console.log("A request was made for the image");
      next();
    });

    app.get('/', function (req, res) {
      var fs = require('fs');
      fs.readFile('image.jpeg',function(err,data){
        res.writeHead('200', {'Content-Type': 'image/png'});
        res.end(data,'binary');
      });
    });

    var server = app.listen(8080, function () {
      var host = server.address().address;
      var port = server.address().port;
    });

因此,当我们向图像请求时,我们将记录&#34;请求图像&#34;。对上述代码段进行更改以使工作正常。我做过和失败的一些事情是将图像作为静态服务。这确实渲染了图像,但是在访问图像时它没有记录。这就是图像被阅读和服务的原因。

由于我的服务器是localhost,因此图像未在邮件中呈现。但我认为如果所有内容都托管在服务器上,它应该可以正常工作。

编辑:获取请求也可以是

    app.get('/', function (req, res) {
      var buf = new Buffer([
        0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x01, 0x00, 0x01, 0x00,
        0x80, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x2c,
        0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x02,
        0x02, 0x44, 0x01, 0x00, 0x3b]);
        res.writeHead('200', {'Content-Type': 'image/png'});
        res.end(buf,'binary');
    });

答案 4 :(得分:0)

In send mail option you can pass the ConfigurationSetName field for tracking.

Exmaple :

 var opt = {
  to : '',
 from : '',
 ses: {
  ConfigurationSetName: 'your configuration key'
 },
 subject: '',
  html: ``
}
transporter.sendMail(opt)
                .then((res) => {
                  console.log("Successfully sent");
                })
                .catch((err) => console.log("Failed ", err))

This code works for me using nodemailer