2014-04-11 7 views
7

http://www.jwz.org/doc/threading.html과 같은 훌륭한 온라인 리소스를 읽었으며 어떤 이메일도 Message-ID 헤더와 함께 전송 된 것처럼 보입니다. ID에 이라는 이름을 가진 In-Reply-To이 포함되며 전자 메일 클라이언트는 스레드보기에서 전자 메일 목록을 볼 때이 정보를 사용하여 스레드를 구성합니다.보낸 메일을 Message-ID, In-Reply-To 및 References가 포함 된 Gmail 수신자보기에 표시하는 방법

제 질문은 : 가짜 헤더가있는 수신자에게 일련의 이메일을 보내어받는 사람이 답장하지 않고 대화 목록에 나타나게 할 수 있습니까? 그렇다면 왜 내 시도가 효과가 없습니까?

Google 시스템의 특정 항목과 관련된 여러 이메일을 보내는 시스템이 있습니다. 각 위젯에 대해 위젯과 이메일 사용자를 여러 번 판매한다고 가정 해 보겠습니다. 특정 위젯 ID에 대한 모든 이메일을 사용자의 이메일 클라이언트에 이메일 스레드로 표시하려고합니다.

여기의 여행은 보통 이메일이 전송 된 다음에 답장을 보낸 것으로 보입니다. 우리 시스템은 여러 개의 전자 메일을 보내고 In-Reply-To 및 References 헤더를 가짜로 만들어 전자 메일 클라이언트가 속임수로 트리에 표시하도록합니다.

I가 사용하고 메시지-ID 형식은 '는 foobar'+ + 서열은 widgetid

  • 은 widgetid = 고유 번호, 예를 들어 각 위젯 1234
  • 순서는 우리가 이메일을 보낼 때마다 증가 일련 번호를 =

첫 번째 이메일 :

  • 메시지 ID
  • 가 인 - 회신하려면 <[email protected]> :
  • 참고 자료를 제공하지 : 제공되지 않음

두 번째 전자 메일 :

세 번째 이메일 :

(또한, 메시지 ID의 @server.com 부분을 포함하여 중요한 것으로 보인다. 그것없이, 예를 들면. foobar-123-0, 우리의 SMTP 서버는 단순히 그것을 무시하고 자체 생성 된 메시지 ID를 사용했습니다.)

이메일은 Thunderbird에서 나무로 표시되지만 Gmail에는 표시되지 않고받은 편지함에 차례로 나열됩니다. 그 옆에 제대로 스레드.내가 잘못 이해하고 있는지, 썬더 버드가 나쁜 데이터로 할 수있는 최선을 다하고 있는지, Gmail이 비표준 설탕을 추가로 필요로하는지 잘 모르겠다. Q.all를 사용하여 내 시도가 보이지 않는 이유, 힌트하십시오 보너스 포인트

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

:

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

이 같은 conf의 파일이 필요합니다 : 여기

내 Node.js를 테스트 스크립트입니다 모든 메일을 올바르게 전송 했음에도 불구하고 스크립트가 정상적으로 종료되지 않습니다.

답변

5

Gmail 스레딩이 수행되지 않는 이유는 Gmail에서 스레딩되지 않은 이유입니다. e 메시지의 제목에 따라 (헤더의 "회신 요청"또는 "참조"필드를 기반으로하지 않음).

Gmail에서 스레딩 않는 방법에 대한 자세한 내용은 stackexchange에이 질문에 대한 답변을 참조하십시오 : https://webapps.stackexchange.com/questions/965/how-does-gmail-decide-to-thread-email-messages .. 귀하의 경우

대상자는, "이것은 테스트 전자 메일 2" "이것은 테스트 이메일 1"과 "이것은 테스트 이메일 3"이며 Gmail에서 사용하는 규칙에 따라 스레딩을 일으키지 않습니다.

+0

고맙습니다. 이번 주에 테스트 플랫폼의 모든 보내는 전자 메일을 하나의 전자 메일 계정으로 보낼 때이 동작을 정확히 알았습니다. 그들 중 몇몇은 "X는 Y를했으나"많은 다른 개인의 계좌로 갔을 거라는 동일한 행동이었다. 동일한 Gmail받은 편지함에서 볼 때 그들은 모두 스레드였습니다. 그래서 피사체가 모두 "Re :"와 "Fwd :"와 충분히 유사해야한다고 생각합니다. 다른 cruft는 무시되지만 본질적으로 Subject string matching은 gmail에서 사용됩니까? 그 축을 우리의 계획, 다음 : – Neek

+2

에 연결된 다른 질문에 허용 대답은 "내가"오늘 본 일부 메일 링리스트 스레드를보고 확인할 수있는 "회신 -"헤더도 고려해야 나타냅니다. 한 사람이 답장에 "in-reply-to"헤더를 남겨 둠으로써 여러 번 스레드를 분할합니다. 모든 메시지는 제목이 같았지 만 클라이언트를 고칠 때까지 제대로 스레드되지 않았으므로 "회신 요청"헤더가 포함되었습니다. – TwoD