2014-04-11 14 views
7

Thread angezeigt werden, habe ich einige gute Online-Ressourcen wie http://www.jwz.org/doc/threading.html gelesen, und es scheint, dass jede E-Mail mit einem Message-ID Header gesendet wird , dann enthalten alle Antworten In-Reply-To Benennung dieser ID und Refences, die eine Liste der übergeordneten Nachrichten-IDs benennen können, und E-Mail-Clients verwenden diese Informationen zum Erstellen von Threads beim Anzeigen einer Liste von E-Mails in der Threadansicht.Wie sendete E-Mails in der Ansicht von GMail Empfänger mit Message-ID, In-Reply-To und Referenzen

Meine Frage ist: Kann eine Reihe von E-Mails an einen Empfänger mit gefälschten Kopfzeilen gesendet werden, damit sie in einem Thread erscheinen, ohne dass der Empfänger antwortet? Wenn ja, warum funktioniert mein Versuch unten nicht?

Wir haben ein System, das mehrere E-Mails sendet, die sich auf eine bestimmte Entität in unserem System beziehen. Nehmen wir an, wir verkaufen Widgets und mailen Nutzer mehrmals über jedes Widget. Wir möchten, dass alle E-Mails für eine bestimmte Widget-ID als E-Mail-Thread in den E-Mail-Clients unserer Nutzer angezeigt werden.

Die Reise hier scheint, dass normalerweise E-Mails gesendet werden, dann antwortete. Unser System möchte einfach mehrere E-Mails verschicken und die Header "In-Reply-To" und "References" fälschen, um E-Mail-Clients dazu zu bringen, sie in einer Baumstruktur anzuzeigen.

Die Message-ID-Format Ich verwende ist: 'foobar' + widgetId + Sequenz

  • widgetId = eine Zahl, die einmalig für jedes Widget z.B. 1234
  • Sequenz = eine laufende Nummer jedes Mal erhöht wir eine E-Mail

Erste E-Mail:

  • Message-ID <[email protected]>
  • In-Reply-To: nicht
  • Referenzen zur Verfügung gestellt : nicht zur Verfügung gestellt

Zweite E-Mail:

Dritte E-Mail:

(nebenbei bemerkt, einschließlich der @server.com Teil einer Nachricht ID erscheint wichtig zu sein. Ohne das würde z.B. foobar-123-0 ignorierte unser SMTP-Server es einfach und verwendete seine eigene automatisch generierte Nachrichten-ID)

E-Mails erscheinen korrekt in Thunderbird, als Baum, aber nicht in Gmail, sie werden nur im Posteingang nacheinander aufgelistet, während andere Konversationen sind richtig eingefädelt direkt neben ihnen.Ich bin mir nicht sicher, ob ich es falsch mache und Thunderbird tut das Beste, was es mit schlechten Daten kann, oder wenn Gmail etwas zusätzlichen Nicht-Standard-Zucker benötigt, den ich nicht bereitstelle.

Hier ist mein node.js Testskript:

/*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, //'[email protected]', 
       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 = '[email protected]'; 

    // 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 
}); 

Erfordert eine conf-Datei wie:

{ 
    "ourEmail": "[email protected]", 
    "smtp": { 
     "service": "Gmail", 
     "user": "[email protected]", 
     "pass": "ilikecheese" 
    } 
} 

Für Bonuspunkte erhalten Sie andeuten, warum mein Versuch Q.all verwenden nicht scheinen fire und das Skript wird nicht sauber beendet, obwohl alle E-Mails korrekt gesendet wurden :)

Antwort

5

Die Antwort darauf, warum sie in Google Mail nicht eingefädelt sind, liegt daran, dass das Threading von Google Mail nicht erfolgt e entsprechend dem Thema der Nachrichten (es basiert nicht auf dem Feld "in-reply-to" oder "references" im Header).

Siehe die Antworten auf diese Frage auf Stack, um weitere Informationen darüber, wie Google Mail nicht Einfädeln: https://webapps.stackexchange.com/questions/965/how-does-gmail-decide-to-thread-email-messages ..

Die Themen in Ihrem Fall sind „Dies ist Test E-Mail-1“, „Dies ist Test E-Mail 2“ und "Dies ist Test-E-Mail 3", die kein Threading nach den Regeln von Google Mail verursacht.

+0

Vielen Dank. Genau dieses Verhalten haben wir diese Woche bemerkt, als wir alle ausgehenden E-Mails von unserer Testplattform an ein E-Mail-Konto weitergeleitet haben. Einige von ihnen waren die gleiche Aktion "X hat Y", aber normalerweise wäre sie zu vielen verschiedenen individuellen Konten gegangen. Wenn sie im selben Posteingang von gmail angesehen wurden, wurden sie alle gefädelt. Also stelle ich mir vor, dass die Themen alle ausreichend ähnlich sein müssen, d. H. "Re:" und "Fwd:" und andere Fehler würden ignoriert werden, aber im Wesentlichen wird das Subject-String-Matching in Google Mail verwendet? Das bedeutet unseren Plan, dann :) – Neek

+2

Die angenommene Antwort in der anderen Frage, die mit verbunden wird, zeigt an, dass der "in-reply-to" Header auch betrachtet wird, was ich bestätigen kann, indem ich einige Mailinglisten-Threads sehe, die ich heute gesehen habe. Eine Person teilt den Thread mehrmals auf, indem sie den Header "in-reply-to" in seinen Antworten weglässt. Alle Nachrichten hatten das gleiche Thema, wurden aber nicht richtig verkettet, bis er seinen Client reparierte, so dass er den Header "in-reply-to" enthielt. – TwoD