ユーザ情報の登録・更新におけるメール通知について(その3) Apexで内部ユーザ編

おさらい! 

ユーザ登録に関連して、Salesforceからユーザに対してメールが通知されるパターンは以下があります。

  • システム管理者権限ユーザによる、パスワードリセット実行時
  • メールアドレスの変更時
  • システム管理者権限ユーザによる、ユーザ名変更時


・本番環境、テスト環境(Sandbox)を問わず。
・組織のメール設定が「アクセス権限なし」の場合は、メール通知されない。

の前提を踏まえたうえで、Apexからの処理について検証してみたいと思います。
検証環境のメール設定はデフォルト値のままです。(「すべてのメール」)

Apexから内部ユーザの登録 

まず、ここでいう内部ユーザとは、外部ユーザ以外の、Salesforce組織のユーザと思って下さい。
外部ユーザとは、コミュニティライセンス、ポータル系ライセンスを持つユーザを指しています。

結論からいうと、Apexからユーザ情報を登録しても、ユーザにリセットパスワード等のメールは通知されません。
(自動的に、何らかのメールが通知されそうなイメージがありますが。。)

ここで検証した登録方法は、Userオブジェクト型の変数に値を詰めて、DMLを発行する(insert())一般的な方法です。
手動登録で確認してみると「パスワードをリセットしてユーザに通知する」のチェックを外した状態で登録するとメール通知されないので、納得のいく挙動です。

予期していないメールが通知されないのは良いことですが、かといって、パスワードリセットのメールがないと、ユーザはいつまで経ってもログインできません。

では、Apexからのユーザ登録において、ユーザへのリセットパスワードのメールを、自動で処理するにはどうすれば良いのでしょうか?

Systemクラスに、resetPasswordというメソッドが用意されていました。
resetPassword(ID userId, Boolean sendUserEmail)
※第2引数)sendUserEmail:boolean型でtrueの場合、リセットパスワードメールを通知する仕様。

実務的な使いどころでは、
ユーザ情報を登録するVisualforceページを用意して、コントローラ側(Apex)でユーザ情報を登録する。
そして、ユーザオブジェクトのAfterトリガで resetPasswordメソッドを利用して、ユーザにパスワードリセットのメールを通知する
ような仕掛けを用意する、といったところでしょうか。

実際、検証環境にて、この仕組みでメール通知をコントロールすることができました。

ちなみに、SystemクラスにsetPasswordというメソッドもあります。
setPassword(ID userId, String password)
第2引数で指定したパスワードでユーザがログインすると、新しいパスワードを作成するように求められない仕様。
ユーザのパスワードを、管理者側で決める運用の場合、こちらのメソッドを利用するのですね。私の担当顧客では、見掛けたことがありませんが。。

Apexからユーザ名の変更 

Apexで、既存ユーザのユーザ名のみを変更してみます。
結果は、メール通知されます。
「ユーザ名が変更されました。」と変更結果をお知らせするメールです。

Salesforceのユーザ名は、ログインIDですので、クラウドのシステムとしてログインIDが変更された以上、変更を通知するのは当然の仕組みと思います。

ちなみに、組織のメール設定を変えて検証してみました。

  • 「アクセス権限なし」:通知されない。
  • 「システムメールのみ」:通知される!!

Apexでも、手動時と同じ結果になりました。

参考:ユーザ名が変更されたときにメール通知を無効にできますか?|Salesforceヘルプ
参考:ユーザ名・メールアドレスを変更する際の注意点|Salesforceヘルプ

Apexからメールアドレスの変更 

Apexで、既存ユーザのメールアドレスのみを変更してみます。
結果は、メール通知されます。

  • 変更前のメールアドレスには、「メールアドレスが変更されました」の変更要求があった旨をお知らせするメールが通知されます。
  • 変更後のメールアドレスには、「メールアドレスの変更完了」と題して、リンクが記載されたメールが通知されます。
    (完了と題していますが、メール記載のリンクをクリックするまでは変更は完了しません。しかも72時間の有効期限つきで。)

こちらも、変更したメールアドレスの正しさを確認する上で、このようなお知らせメールが通知されるのは当然の挙動と思います。

こちらも、組織のメール設定を変えて検証してみました。

  • 「アクセス権限なし」:通知されない。
  • 「システムメールのみ」:通知される!!

このメールアドレス変更時も、ユーザ名変更時と同様に、Apexでも手動時と同じ結果になりました。

参考:ユーザのメールアドレス変更時の動作|Salesforceヘルプ
参考:メールの変更通知を無効化する方法について|Salesforceヘルプ

おわりに 

このように、メールが通知されるシーンを検証してみると、あるべき姿であると思います。

一方で、実運用において、メール通知させたくない状況もあるかと思います。
あくまで、個人の見解ですが、組織のメール設定によるコントロールが1番リスクが少ないと考えます。

ユーザを無効化すれば、ユーザ名の変更、メールアドレスの変更、いずれもメール通知されません。
ですが、ユーザを無効化した場合の影響度を考慮する必要があります。(データの所有や、共有など)
条件によっては、無効化できないユーザもいますので、既に運用が開始されている組織においては、この方法はリスクが高いと思っています。詳細はSFDC社のヘルプを参照して下さい。

参考:ユーザの無効化の考慮事項|Salesforceヘルプ

機会がありましたら、外部ユーザのApex登録からの様子も検証してみたいと思います。
それでは、また。

ひとりごと:
 メールは「通知」が適切なのか、または「送信」なのか。
  自信がないため、今回はすべて「通知」で統一しました。詳しい方、教えて下さい。