メール操作の成功を追跡する一般的な方法は、電子メールの「Return-Path」ヘッダーを使用することです。
メールとそのヘッダーの例:
Return-Path: server@return.xyz.com
Received: from localhost (mx-1-1 [127.0.0.1])
by mx-1.xyz.com (Postfix) with ESMTP id 3F81556754
for <jbradler@xyz.com>; Wed, 2 May 2012 12:27:18 +0200 (CEST)
To: jbradler@xyz.com
Subject: test mailing
From: Jens <jbradler@xyz.com>
Message-Id: <20120502102717.763ADA88004@xyz.com>
Date: Wed, 2 May 2012 12:27:17 +0200 (CEST)
Hi Folks, ...
ここで、「From」ヘッダーは、読者に見せたい実名と電子メール アドレスの選択です。「Return-Path」の主な目的は、不達またはその他のメール システム障害を示すメッセージの宛先アドレスを指定することです。送信されます ([詳細については RFC 2821 を参照してください][1])。
したがって、基本的にこのヘッダーは、配信不能レポートの取得を開始する適切な位置です。
これを行う方法:
- すべての配信不能レポートを取得するための一意のサブドメインを作成します (例: return.xyz.com)
- 上記のサブドメインに送信されたすべての電子メールを受信するように受信トレイを設定します (電子メール アドレスのローカル部分に関係なく、*@return.xyz.com など)。
- メールを一意にする => 1 人の受信者に 1 つの一意のメール (BCC を使用しない)
- 受信者 ID (例: 受信者データベースの数値 ID) とメールまたはキャンペーン ID を使用して、将来のローカル部分を生成します (例: {campaign_id}-{recipient_id})
- 新しい Return-Path を使用: Return-Path: {campaign_id}-{recipient_id}@return.xyz.com
- 受信メールを取得し、スパムや一時的な通知 (不在メッセージなど) から実際の配信不能レポートを除外するためのツールをいくつか作成します。
一意の Return-Path を使用した例:
Return-Path: 123-456@return.xyz.com
Received: from localhost (mx-1-1 [127.0.0.1])
by mx-1.xyz.com (Postfix) with ESMTP id 3F81556754
for <jbradler@xyz.com>; Wed, 2 May 2012 12:27:18 +0200 (CEST)
To: jbradler@xyz.com
Subject: test mailing
From: Jens <jbradler@xyz.com>
Message-Id: <20120502102717.763ADA88004@xyz.com>
Date: Wed, 2 May 2012 12:27:17 +0200 (CEST)
Hi Folks, ...
それでおしまい。
編集 - phpMailer 経由で実装する方法:
/* define domain name for non-delivery reports */
define('RETURN_PATH_DOMAIN', 'return.xyz.com');
/* get current campaign id */
$campaignId = 123;
/* loop recipient list and send email */
foreach ($array as $userId => $user) {
try{
$mail = new PHPMailer();
$mail->HeaderLine('Return-Path', $userId . '-' $campaignId . '@' . RETURN_PATH_DOMAIN);
$mail->To($user['email'], $user['customerName']);
$mail->AltBody = "To view the message, please use an HTML compatible email viewer!";
$mail->AddReplyTo("noreply@company.com","Company Name");
$mail->SetFrom('noreply@company.com', 'Company Name');
$mail->Subject = "Company| E-Zine";
$mail->MsgHTML($ezineContent);
if(!$mail->Send()) {
// show log
} else {
//show successful msg
}
} catch (Exception $e) {
// show error
}
}
私が覚えている限りでは、ローカルの sendmail を使用する際に問題がありました。ヘッダー Return-Path は、ローカル MTA の一部の構成に置き換えられました。この場合は、代わりに使用可能なリレー ホストへの SMTP を使用してみてください。