Zendesk APIでプライマリメールアドレスを更新する方法

はじめに

Zendeskを利用しているとき、ユーザーのプライマリメールアドレスを変更する必要が出てくることがあります。特にAPIを使って自動化する場合、少し複雑な手順が必要になります。

今回は、Zendesk APIを使ってユーザーのプライマリメールアドレスを更新する方法についてご紹介します。

なぜ複雑なのか?

Zendeskでは、単純にユーザーのemailプロパティを更新しても、それは自動的にプライマリメールアドレスとして設定されません。代わりに、新しいメールアドレスがセカンダリアドレスとして追加されてしまいます。

例えば、以下のようなコードを実行しても、プライマリメールアドレスは変更されません:

1
2
3
$client->users()->update($userId, [
    'email' => '[email protected]'
]);

これは、Zendeskのシステム設計に起因するもので、セキュリティと整合性を維持するための仕組みです。

正しい方法

Zendeskでプライマリメールアドレスを正しく更新するには、2つのステップが必要です:

  1. 新しいメールアドレスをユーザーのアイデンティティとして追加する
  2. そのアイデンティティを「プライマリ」として設定する

具体的なコード例を見てみましょう:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?php
// Composerのオートロードを読み込む
require 'vendor/autoload.php';

// ZendeskのAPIクライアントを初期化
use Zendesk\API\HttpClient as ZendeskAPI;

// Zendesk APIの認証情報
$subdomain = "your-subdomain";
$username = "[email protected]";
$token = "your-api-token";

// クライアントの初期化
$client = new ZendeskAPI($subdomain);
$client->setAuth('basic', ['username' => $username, 'token' => $token]);

try {
    // ユーザーID
    $userId = 123456;
    
    // 設定したい新しいメールアドレス
    $newEmail = "[email protected]";
    
    // ステップ1: ユーザーのアイデンティティ一覧を取得
    $identities = $client->users($userId)->identities()->findAll();
    
    // 新しいメールアドレスがすでにアイデンティティとして存在するか確認
    $identityId = null;
    foreach ($identities->identities as $identity) {
        if ($identity->type == 'email' && $identity->value == $newEmail) {
            $identityId = $identity->id;
            break;
        }
    }
    
    // メールアドレスがまだ存在しない場合は追加
    if (!$identityId) {
        $newIdentity = $client->users($userId)->identities()->create([
            'identity' => [
                'type' => 'email',
                'value' => $newEmail
            ]
        ]);
        $identityId = $newIdentity->identity->id;
    }
    
    // ステップ2: そのアイデンティティをプライマリに設定
    $response = $client->users($userId)->identities($identityId)->makePrimary();
    
    echo "プライマリメールアドレスを {$newEmail} に更新しました。\n";
    
} catch (Exception $e) {
    echo "エラーが発生しました: " . $e->getMessage() . "\n";
}

createOrUpdateと組み合わせる

ユーザーを作成または更新する際に、同時にプライマリメールアドレスも設定したい場合は、以下のようなコードが有効です:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
try {
    // ユーザー情報
    $targetEmail = "[email protected]";
    $userFields = [
        'name' => 'ユーザー名',
        'email' => $targetEmail, // このメールでユーザーを検索または作成
    ];
    
    // createOrUpdateを実行
    $response = $client->users()->createOrUpdate($userFields);
    $userId = $response->user->id;
    
    // ユーザーのアイデンティティ一覧を取得
    $identities = $client->users($userId)->identities()->findAll();
    
    // 対象のメールアドレスのアイデンティティIDを特定
    $identityId = null;
    foreach ($identities->identities as $identity) {
        if ($identity->type == 'email' && $identity->value == $targetEmail) {
            $identityId = $identity->id;
            break;
        }
    }
    
    // 見つかったアイデンティティをプライマリーに設定
    if ($identityId) {
        $makePrimaryResponse = $client->users($userId)->identities($identityId)->makePrimary();
        echo "メールアドレス " . $targetEmail . " をプライマリに設定しました。\n";
    }
} catch (Exception $e) {
    echo "エラーが発生しました: " . $e->getMessage() . "\n";
}

注意点

  1. メール検証:
    新しく追加されたメールアドレスが検証されていないと、プライマリに設定できない場合があります。

  2. 処理タイミング:
    createOrUpdateidentities()->create()の直後は、Zendeskのシステム内で処理が完了するまで少し時間がかかることがあります。もしアイデンティティが見つからない場合は、短い待機時間を設けてから再試行することも検討してください。

  3. エラーハンドリング:
    makePrimary()で404エラーが発生する場合、指定したユーザーIDまたはアイデンティティIDが存在しない可能性があります。

サードパーティのソリューション

もし大量のユーザーのプライマリメールアドレスを定期的に更新する必要がある場合は、「Knots Change Primary Email」のようなサードパーティのアプリケーションを検討することもできます。これらは、ユーザーがセカンダリメールアドレスからサポートに連絡した場合に、自動的にそのメールアドレスをプライマリに設定する機能を提供しています。

まとめ

Zendesk APIでプライマリメールアドレスを更新するには、単純にユーザーのemailプロパティを更新するだけでは不十分です。正しい方法は、新しいメールアドレスをアイデンティティとして追加し、そのアイデンティティをmakePrimary()メソッドを使ってプライマリに設定することです。

これにより、Zendesk内でのメールコミュニケーションが適切に行われるようになります。ユーザーが複数のメールアドレスを持っていても、すべての通知は常にプライマリメールアドレスに送信されるため、この設定は重要です。

カテゴリ

comments powered by Disqus