当前位置: 首页 > 知识库问答 >
问题:

如何使发送的电子邮件在GMail收件人的视图中显示为带有消息ID、回复和参考的线程

谢英光
2023-03-14

我读过一些很棒的在线资源,比如http://www.jwz.org/doc/threading.html,任何电子邮件似乎都是以消息ID标题发送的,然后对它的任何回复都包括回复命名该ID和引用,它们可以命名父消息ID的列表,电子邮件客户机在线程视图中查看电子邮件列表时使用此信息构建线程。

我的问题是:一系列邮件是否可以通过伪造的邮件头发送给收件人,使其出现在一个线程中,而不需要收件人回复?如果是这样,为什么我下面的尝试不起作用?

我们有一个系统,可以发送几封与系统中特定实体有关的电子邮件。假设我们销售小部件,并多次向用户发送有关每个小部件的电子邮件。我们希望特定小部件ID的所有电子邮件在用户的电子邮件客户端中显示为电子邮件线程。

这里的问题似乎是,通常电子邮件是发送,然后回复的。我们的系统只是想发送几封电子邮件,并伪造回复和引用标题,以欺骗电子邮件客户端将它们显示在树上。

我正在使用的Message-ID格式是:'ftbar'WidgetId序列

  • widgetId=每个部件唯一的数字,例如1234
  • 序列=每次发送电子邮件时递增的序列号

第一封电子邮件:

  • 消息ID

第二封电子邮件:

  • 消息ID

第三封电子邮件:

  • 消息ID

(顺便说一句,包含邮件ID的@server.com部分似乎至关重要。如果没有这一点,使用例如foobar-123-0,我们的SMTP服务器就会忽略它,并使用它自己的自动生成邮件ID)

电子邮件在Thunderbird中以树的形式正确显示,但在Gmail中却没有,它们只是在收件箱中一个接一个地列出,而其他对话则正确地在它们旁边。我不确定我是否弄错了,雷鸟是否在处理坏数据时尽了最大努力,或者Gmail是否需要一些我没有提供的额外非标准糖。

这是我的节点。js测试脚本:

/*jshint dojo:true */
/*global console:true */
'use strict';
var Q = require('q'),
    nconf = require('nconf'),
    optimist = require('optimist'),
    nodemailer = require('nodemailer');

console.log('Started to run.');
var argv = optimist.argv,
    config = nconf.argv().env().file('conf.json'),
    smtpConfig = config.get('smtp'),
        smtpTransport = nodemailer.createTransport('SMTP', {
            service: smtpConfig.service, // 'Gmail',
            auth: {
                user: smtpConfig.user, //'blah@gmail.com',
                pass: smtpConfig.pass //'xyz'
            }
        }),
    rand = Math.floor(Math.random() * 5000), // a random enough unique id
    messageIdPrefix = 'foobar-' + rand + '-';

var promises = [],
    references = '';

for (var i = 0 ; i < 3 ; i ++) {
    // Prepare email content
    var subject = 'This is test email ' + i,
        htmlMessage = '<h1>Am I threaded? Email ' + i + '</h1><p>???</p>',
        textMessage = 'Am I threaded? Email ' + i + '\n\n???';

    var recipients = 'recipient@server.com';

    // Each email in this sequence has a common prefix
    // In Reply To should be the single immediate parent message id
    // References should list all parents, top most first
    var messageId = messageIdPrefix + i + '@server.com',
        inReplyTo = (i > 0) ? ('<' + (messageIdPrefix + (i-1)) + '@server.com>') : false;

    // setup e-mail data with unicode symbols
    var mailOptions = {
        from: config.get('ourEmail'),
        to: recipients,
        subject: subject,
        text: textMessage,
        html: htmlMessage,
        messageId: messageId,
        inReplyTo: inReplyTo,
        references: references,
        headers: {
            // 'in-Reply-To': inReplyTo
        }
    };

    // send mail with defined transport object
    var q = Q.defer();
    promises.push(q.promise);
    smtpTransport.sendMail(mailOptions, function (error, response) {
        if (error) {
            console.error(error);
            q.reject('error');
        } else {
            console.log('Message sent: ' + response.message);
            q.resolve('yay!');
        }
    });

    // next time round loop, if any, includes this id in the references list
    references = (references ? (references + ' ') : '') + messageId;
}

Q.all(promises).then(function (results) {
    console.log('All done, closing mail connection: ', results);
    smtpTransport.close(); // shut down the connection pool, no more messages
});

需要一个conf文件,如:

{
    "ourEmail": "me@server.com",
    "smtp": {
        "service": "Gmail",
        "user": "me@server.com",
        "pass": "ilikecheese"
    }
}

为了获得额外积分,请提示我为什么尝试使用Q.all似乎没有触发,并且脚本没有干净地退出,尽管正确发送了所有电子邮件:)


共有1个答案

姜博
2023-03-14

Gmail中没有线程的原因是,Gmail的线程是根据消息的主题完成的(它不是基于标题中的“回复”或“引用”字段)。

有关Gmail如何处理线程的更多详细信息,请参阅stackexchange上对该问题的回答:https://webapps.stackexchange.com/questions/965/how-does-gmail-decide-to-thread-email-messages..

您案例中的主题是“这是测试电子邮件1”、“这是测试电子邮件2”和“这是测试电子邮件3”,这不会导致Gmail使用规则中出现线程。

 类似资料:
  • 问题内容: 问题答案: $config = Array( ‘protocol’ => ‘smtp’, ‘smtp_host’ => 'ssl://smtp.googlemail.com’, ‘smtp_port’ => 465, ‘smtp_user’ => ‘xxx’, ‘smtp_pass’ => ‘xxx’, ‘mailtype’ => ‘html’, ‘charset’ => ‘iso-8

  • 我正在为我的一个项目使用cakephp。我用cakeEmail发送电子邮件。为此,我创建了一个用于发送电子邮件的gmail帐户(即用于从该帐户发送邮件的代码)。邮件发送正常,但发送的邮件出现在收件人的垃圾邮件文件夹中。< br >此外,在gmail帐户中,邮件不会出现在“已发送邮件”文件夹中。 代码如下: 在/app/Config/email中。php文件是: 电子邮件配置类{ } 我的控制器文件

  • 我在我的网站上创建了一个联系表单,并且,为了向网站帐户发送电子邮件(contact@mywebsite.com),我正在使用gmail smtp,使用与接收邮件相同的电子邮件。 所以,用户进入我的网站,点击联系页面,填写表格:姓名,电子邮件,信息。 比我发送以下代码的电子邮件: 电子邮件将进入“我的收件箱”contact@mywwebsite.com“,我可以正常阅读邮件,但是。。。当我点击“回复

  • 我已经在Gmail中的Check mail from other accounts(使用POP3)和Send mail as(使用TLS在587端口通过mail.mydomain.com安全连接发送邮件)下设置了我的cpanel电子邮件地址 看着Roundcube,我可以看到里面有收到的邮件,但没有发送的邮件——尽管Gmail是通过我的域服务器发送的。 有没有办法查看通过Gmail收发的邮件?

  • 我试图从我的应用程序发送电子邮件,我在android上的电子邮件客户端中看到了应有的链接,但当我检查电子邮件接收器时,没有链接。 这是我的代码: “文本”是html。 谢谢你。

  • 问题内容: 我找到了这个库,并设法以空电子邮件发送附件,但没有将文本和附件组合在一起。 https://github.com/sloonz/go-mime-message 如何做呢? 问题答案: 我最终自己实现了它:https : //github.com/scorredoira/email 用法很简单: