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
<[email protected]>
- 에서-답장 :
<[email protected]>
- 참고 :
<[email protected]>
세 번째 이메일 :
- 메시지 ID
<[email protected]>
- 인 - 답장 :,723,210
- 참조 :
<[email protected]> <[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를 테스트 스크립트입니다 모든 메일을 올바르게 전송 했음에도 불구하고 스크립트가 정상적으로 종료되지 않습니다.
고맙습니다. 이번 주에 테스트 플랫폼의 모든 보내는 전자 메일을 하나의 전자 메일 계정으로 보낼 때이 동작을 정확히 알았습니다. 그들 중 몇몇은 "X는 Y를했으나"많은 다른 개인의 계좌로 갔을 거라는 동일한 행동이었다. 동일한 Gmail받은 편지함에서 볼 때 그들은 모두 스레드였습니다. 그래서 피사체가 모두 "Re :"와 "Fwd :"와 충분히 유사해야한다고 생각합니다. 다른 cruft는 무시되지만 본질적으로 Subject string matching은 gmail에서 사용됩니까? 그 축을 우리의 계획, 다음 : – Neek
에 연결된 다른 질문에 허용 대답은 "내가"오늘 본 일부 메일 링리스트 스레드를보고 확인할 수있는 "회신 -"헤더도 고려해야 나타냅니다. 한 사람이 답장에 "in-reply-to"헤더를 남겨 둠으로써 여러 번 스레드를 분할합니다. 모든 메시지는 제목이 같았지 만 클라이언트를 고칠 때까지 제대로 스레드되지 않았으므로 "회신 요청"헤더가 포함되었습니다. – TwoD