Hook_mail_alterフックを使用して、ユーザーに手動で電子メールを送信しようとしています。以下は、全体としての私の機能です:
function custom_module_mail_alter(&$message) {
$email = '[user:name],
A site administrator at [site:name] has created an account for you. You may now log in by clicking this link or copying and pasting it to your browser:
[user:one-time-login-url]
This link can only be used once to log in and will lead you to a page where you can set your password.
After setting your password, you will be able to log in at [site:login-url] in the future using:
username: [user:name]
password: Your password
-- [site:name] team';
$account = $message['params']['account'];
$uid = $account->uid;
$_user = user_load($uid);
dpm(token_replace($email, array('user'=>$_user)));
}
出力は次のようになります。
Peter,
A site administrator at Website has created an account for you. You may now log in by clicking this link or copying and pasting it to your browser:
[user:one-time-login-url]
This link can only be used once to log in and will lead you to a page where you can set your password.
After setting your password, you will be able to log in at http://localhost/website/user in the future using:
username: Peter
password: Your password
-- Website team
ご覧のとおり、[user:name]、[site:name]、[site:login-url]などが適切に処理されています。処理されない唯一のトークンは[user:one-time-login-url]です。なぜこれが起こっているのですか?
編集:参考までに、トークンdoesはシステムによって自動的に送信されるウェルカム電子メールで処理されるため、トークンモジュールはアクティブですand機能しています... token_replace()を手動で呼び出しても処理されないようです。
そのトークンを置き換えるには、token_replace()
をtoken_replace($email, array('user' => $_user), array('callback' => 'user_mail_tokens', 'sanitize' => FALSE))
として呼び出す必要があります。
関数 ser_mail_tokens() は、ドキュメントでは次のように説明されています。
ユーザーのメールに安全でないトークンを追加するためのトークンコールバック。
この関数は token_replace() の最後に _ user_mail_text() の呼び出しで使用され、 によって生成される電子メールメッセージで使用できる追加のトークンを設定します。 user_mail() 。
_user_mail_text()
がそのコールバックを呼び出すために使用するコードは次のコードです。
// We do not sanitize the token replacement, since the output of this
// replacement is intended for an e-mail message, not a web browser.
return token_replace($text, $variables, array('language' => $language, 'callback' => 'user_mail_tokens', 'sanitize' => FALSE));
Drupal 7.では、トークンモジュールはトークンを置き換える必要はありません。トークンを置き換えるコードは、Drupal 7コアコードの一部です。 Drupal 7は、Drupalコアモジュールが定義しない追加のトークンを定義します。