開封とクリックのトラッキング
`emails->getTracking` と `tracking` 名前空間全体。
1 通のメッセージ
$report = $client->emails->getTracking('msg_3f9a1c07d2b84e6a9c5b1f20'); echo $report['openCount'], ' opens from ', count($report['recipients']), ' recipients', PHP_EOL; foreach ($report['links'] as $link) { echo $link['url'], ' ', $link['clickCount'], PHP_EOL;}トラッキングされなかったメッセージは、空のレポートではなく NotFoundException をスローし、その isNotFound() は true です。「何も記録していない」と「誰も開封しなかった」は別の答えであり、同じレスポンスを共有してはいけません。テストキーで送られたメッセージは決してトラッキングされないため、常にこれをスローします。
メールボックス全体
$unopened = $client->tracking->list(opened: false, days: 7, limit: 100);$stats = $client->tracking->getStats(days: 30, offsetMinutes: intdiv((int) date('Z'), 60));$report = $client->tracking->get('msg_3f9a1c07d2b84e6a9c5b1f20');$opens = $client->tracking->listOpens('msg_3f9a1c07d2b84e6a9c5b1f20', includeMachine: true);$clicks = $client->tracking->listClicks('msg_3f9a1c07d2b84e6a9c5b1f20'); echo count($unopened), ' unopened, ', $stats['openRate'], '% opened', PHP_EOL;echo count($opens), ' opens and ', count($clicks), ' clicks on ', $report['id'], PHP_EOL;list、listOpens、listClicks は 1 つの OpenEmail\Result\Page を返し、listAll、iterate、listAllOpens、iterateOpens、listAllClicks、iterateClicks はすべてのページを自動的にたどります。get、listOpens、listClicks は、msg_… の送信 id とトラッキングレコード自身の tmsg_… のどちらも受け取ります。
emails のメソッドではなく独立した名前空間になっているのは、網羅性のためです:emails が一覧にする送信レコードは、この API が扱ったメールにしか存在しません。コンポーザー、MCP ツール、アシスタントはどれも送信レコードなしで送信するため、emails に基づくレポートはメールボックスではなく API のトラフィックについてのレポートになってしまいます。
数字を正直に読む
| 組 | 意味 |
|---|---|
| opens と clicks | 適用されたもの。メッセージがピクセル付きで、あるいは書き換えられたリンク付きで出ていったかどうかです。 |
| opened と clicked | 実際に起きたこと。 |
| openCount | カウント対象のヒット。スキャナーとプライバシープロキシは除外されます。 |
| openCountRaw | すべてのヒット。これをエンゲージメントとして引用すると、開封率が 100% を超えます。 |
| attributable | 読まれたことを、そもそも特定の受信者に結び付けられるかどうか。 |
tracking->getStats の率は「トラッキングされた」メッセージに対するもので、送信したすべてに対するものではありません。そうでなければ、10 通に 1 通をトラッキングするメールボックスは、率が急落したように見えてしまいます。openRate と clickRate は 42.5 のように小数点以下 1 桁に丸めたパーセンテージで、0 から 1 の間の割合ではありません。
パラメーター:tracking->list
openedbool- `true` はカウント対象の開封が 1 件以上あるメッセージを、`false` は開封のないトラッキング済みメッセージを選びます。どちらも既定ではなく、`false` が未トラッキングのメールを意味することはありません。それらはこの一覧にまったく現れません。
clickedbool- カウント対象のクリックについての同じフィルターで、`opened` とは独立に適用されます。両方を指定することもでき、その場合メッセージは両方を満たす必要があります。
daysint- 現在から何日さかのぼるかで、1〜365、既定値は 30。範囲外は 422 になります。期間はトラッキングレコードが作られた時刻で測られ、送信が実際に送り出されたレコードだけが一覧に含まれます。
minutesint- 代わりに分単位で指定する期間で、1〜527040。両方を指定すると `days` より優先されます。1 日より短い期間には、より細かい `grain` が必要です。
grainstring- `minute`、`hour`、`day` のいずれかで、既定値は `day`。期間の始まりを切り捨てるだけなので、この一覧は同じ粒度で読んだ `getStats` と一致し、レスポンスの形には何も影響しません。
limitint- 1 ページあたりのレポート数で、1〜200、既定値は 50、新しい順です。次のページを取得するには、同じフィルターと一緒にページの `nextCursor` を `cursor:` として渡し返すか、`listAll` と `iterate` に期間全体をたどらせてください。
cursorstring- 前のページの `nextCursor` で、`tmsg_` の id です。
apiKeystring- クライアントのキーではなく、このキーで一覧を取得します。
レスポンス:トラッキングレポート
emails->getTracking と tracking->get は 1 つのレポートを camelCase のキーを持つ配列として返し、tracking->list はそれらのページを返します。
objectstring- `tracking->get`、`tracking->list`、`emails->getTracking` を通じて単独で取得したレポートでは常に `tracking`。`emails->get` から得たメッセージに `tracking` として入れ子になった同じレポートには、このキーがありません。そこではレポートは取得されたものではなく、そのメッセージの一部だからです。
idstring- トラッキングレコード自身の id で、`tmsg_…` です。`listOpens` と `listClicks` はこれをキーとし、これらに `msg_…` を渡すと、まずそれに対応するこの id が検索されます。
sendIdstring or null- これに対応する `msg_…` の送信で、送信レコードが書き込まれなかった場合は null です。コンポーザー、MCP の `sendEmail`、アシスタントはどれも送信レコードなしで送信します。トラッキングは API のトラフィックだけでなく、メールボックス全体を対象とします。
threadIdstring or null- 閲覧 UI がメッセージを再び見つけられるよう、送信後に設定される。ドライバーが何も返さなかった場合は null。必須ではなく、この値が null のレコードでも集計の対象になる。
messageIdstring or null- RFC 5322 の Message-ID であり、OpenEmail の id ではない。これも送信後に設定され、トランスポートが値を返さなかった場合は null。
subjectstring or null- 送信時点の件名。件名なしで記録されたメッセージでは null です。
fromstring- 送信元アドレス。送信レコードから結合するのではなく、このレコードにコピーして保持する。レポートは事後かなり経ってから読まれるものであり、そうしなければ、その後に修正または削除されたアドレスが過去の記録を書き換えてしまう。
sourcestring- どの経路から送信されたか。`composer`、`api`、`mcp`、`ai`、`queue` のいずれかです。このパッケージがまだ名前を知らない経路が現れることもあるため、未知の値はエラーではなく情報として扱ってください。
sentAtstring or null- メッセージが送り出された時刻で、ISO 8601 形式です。送信が完了しなかったレコードでは null です。`tracking->list` はそれらを除外しますが、`get` は除外しません。
opensbool- このメッセージにピクセルが実際に適用されたかどうか。現在のアカウント設定ではなく、実行時に何が行われたかを表す。
clicksbool- このメッセージのリンクが書き換えられたかどうか。ボディにリンクがなかった場合は false です。そのときは何も変更されておらず、そうでないと主張するレコードは実際のバイト列と整合しないからです。
openedbool- コピーにわたってカウント対象の開封が 1 件でも記録されたかどうか。`opens` と併せて読んでください。収集していないからデータがないことと、誰もメッセージを読まなかったことは別の事実です。
clickedbool- カウント対象のクリックが 1 件でも記録されたかどうか。開封より強い証拠です。画像がブロックされる頻度は、リンクがたどられない頻度よりはるかに高いからです。
attributablebool- ここでのすべての閲覧を、特定の受信者に結び付けられるかどうか。帰属できないコピーにカウント対象の活動が現れた瞬間に false になります。これは複数宛先の場合で、1 つの本文が 1 つのトークンでリスト全体に届くケースです。「Bob はこれを開いていない」と書く前に確認してください。
openCountint- 人によるものと考えられる開封を、コピーにわたって合計したもの。機械的なヒットは除外され、30 秒以内の繰り返しは 1 件にまとめられるので、読み手の前に出すべき数字はこれです。
clickCountint- カウント対象のクリックを、コピーにわたって合計したもの。メッセージ単位ではなくリンク単位で重複排除するので、数秒差でたどられた異なる 2 本のリンクは 2 クリックです。
openCountRawint- スキャナーやプライバシープロキシを含む、すべてのピクセル取得。`openCountRaw` から `openCount` を引いた数が除外された件数で、機械による取得と 30 秒以内の繰り返しを合わせたものです。フィルタリングが行われたことを示す唯一の証拠でもあります。
clickCountRawint- 書き換えられたリンクへのすべての訪問。機械的なヒットと繰り返しを含みます。
firstOpenAtstring or null- コピーにわたる、カウント対象の最も早い開封。なければ null です。機械的なヒットでこれが動くことはありません。
lastOpenAtstring or null- 各コピーを通じて最も新しいカウント対象の開封。存在しない間は null。
firstClickAtstring or null- 各コピーを通じて最も古いカウント対象のクリック。存在しない間は null。
lastClickAtstring or null- 各コピーを通じて最も新しいカウント対象のクリック。存在しない間は null。
recipientsarray- トラッキング対象のコピーごとに 1 エントリ。トランスポートが人ごとにバイト列を変えられる場合は受信者ごとに、そうでない場合は共有エントリが 1 つだけ入る。共有エントリは実際に何らかのヒットが記録された場合にのみ残るため、何も起きていない「誰か」の行が実名の隣に並ぶことはない。
linksarray- このメッセージ内で書き換えられたすべてのリンク。本文中の位置順に並ぶ。書き換えが行われなかった場合は空になる。`clicks` を無効にして送信したメッセージや、本文にリンクが 1 つもなかったメッセージがこれにあたる。
recipients の各エントリ
emailstring or null- このコピーの送り先で、送信時点のアドレスを小文字にしたものです。`attributed` が false のときに限って null です。
kindstring or null- `to`、`cc`、`bcc` のいずれかで、アドレスがどのヘッダーに現れたかを示します。そのためレポートはメッセージと同じように読めます。どの 1 つのアドレスにも属さない共有コピーでは null です。
attributedbool- この行が個人を特定しているかどうか。`email` より先にこの値を読むこと。false は共有コピーであり、ヒットが 1 件でも記録された時点で一覧に現れる。受信者が 1 人だけのメッセージであっても、そのヒットに名前を付けることは、この仕組みが提供できない唯一の事実を捏造することになる。
openCountint- このコピー単独でのカウント対象の開封数。除外条件はメッセージ全体の合計と同じで、マシンによるヒットは除外され、30 秒以内の繰り返しは 1 件にまとめられる。
clickCountint- このコピー単独でのカウント対象のクリック数。重複排除はコピー単位ではなくリンク単位で行われる。
firstOpenAtstring or null- このコピーで最も古いカウント対象の開封。存在しない間は null。
lastOpenAtstring or null- このコピーで最も新しいカウント対象の開封。存在しない間は null。
firstClickAtstring or null- このコピーで最も古いカウント対象のクリック。存在しない間は null。
lastClickAtstring or null- このコピーで最も新しいカウント対象のクリック。存在しない間は null。
links の各エントリ
idstring- リンク自身の id で、`lnk_…` です。クリックの行の `linkId` が示す値なので、`listClicks` から得たアクセスをここのエントリと照合できます。
urlstring- リンクの実際の行き先で、書き換え前のメッセージにあったとおりのものです。リダイレクターは id からこれを引き当て、訪問者をそこへ送ります。
labelstring or null- メッセージに現れたとおりのアンカーテキスト。画像や URL だけのリンクのようにテキストがない場合は null です。レポートが、トラッキング用のパラメーターが 3 つ付いた URL を引用する代わりに「料金のリンク」と言えるようにするためのもので、`url` の代わりになることはありません。
clickCountint- このリンクへのカウント対象の訪問数を、全コピーで合計したもの。メッセージの `clickCount` と同じ、リンク単位の 30 秒ウィンドウが適用される。
clickCountRawint- このリンクへのすべての訪問。マシンによるヒットと繰り返しも含む。