おさらい!
ユーザ登録に関連して、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社のヘルプを参照して下さい。
機会がありましたら、外部ユーザのApex登録からの様子も検証してみたいと思います。
それでは、また。
ひとりごと:
メールは「通知」が適切なのか、または「送信」なのか。
自信がないため、今回はすべて「通知」で統一しました。詳しい方、教えて下さい。