Можно ли уведомлять пользователей по электронной почте при получении личного сообщения, за исключением случаев, когда конкретный пользователь отправляет сообщение?
Я также открыл поток на этом Drupal.org но так как прошло уже некоторое время, я подумал, что попробую спросить здесь.
Пример использования: В общем, я хочу, чтобы пользователи получали уведомления о новых личных сообщениях. Я могу сделать это, используя прилагаемый подмодуль для отправки личных сообщений по электронной почте.
Чтобы во входящих личных сообщениях было сообщение, когда пользователи входят в систему в первый раз, я использовал модуль правил для автоматической отправки личного сообщения "добро пожаловать" при регистрация от имени учетной записи администратора. Однако это вызывает поведение "отправить электронное письмо в личном сообщении". Поскольку пользователи уже получают электронное письмо "пожалуйста, подтвердите свой адрес электронной почты", я не хочу, чтобы они получали второе электронное письмо с уведомлением о том, что они получили личное сообщение "Добро пожаловать".
Существует ли способ предотвратить отправку уведомлений по электронной почте от определенных пользователей (или, наоборот, определенных сообщений)?
Я также изучил реализация этого с использованием правил вместо включенного подмодуля, но это означало бы, что я не смогу использовать функциональность для уменьшения количества уведомлений (в настоящее время у меня настроено не отправлять дополнительные электронные письма, если пользователь еще не вошел в систему и не прочитал первое электронное письмо в потоке от данного пользователя).
3 answers
Примечание: это ответ для Drupal 7.
Как сказал Летарион, вы можете использовать hook_mail_alter()
, но вы должны каким-то образом определить, является ли это приветственным сообщением от администратора или нет.
Я предлагаю модуль Контекст для этой задачи, но вы действительно можете просто сравнить тему сообщения в этом крючке.
Обновление
Сначала я предложил использовать модуль контекста, но установить контекст в правилах не так просто. Если вас интересует этот способ, вы можете посмотреть историю ответ.
Текущий код использует информацию об идентификаторе автора и теме сообщения:
/**
* Implements hook_mail_alter().
*/
function YOURMODULE_mail_alter(&$message) {
$WELCOME_USER_ID = 1; // PM author from your rule
$WELCOME_SUBJECT = 'Welcome to the site'; // PM subject from your rule
// 'pm_email_notify_notice' is an ID for message notifications
// from Privatemsg Email Notification module
if($message['id'] == 'pm_email_notify_notice') {
$privatemsg = $message['params']['message'];
if ($privatemsg->author->uid == $WELCOME_USER_ID && $privatemsg->subject == $WELCOME_SUBJECT) {
// If special context is set it means that we don't want to send an email
//if(context_isset('context', 'my_privatemsg_stop_email')) {
// Stop email
$message['send'] = FALSE;
}
}
}
С помощью hook_mail_alter вы можете остановить отправку с помощью $message['send'] = FALSE
.
К сожалению, это не дает прямого способа узнать, что почта является "первой почтой" или "от uid 1". Я считаю, что это должно было бы совпадать непосредственно с основным текстом. Вызов $module
, однако, доступен, поэтому вы можете ограничить манипуляции таким образом.
Это может потребовать некоторого реинжиниринга, но я бы написал пользовательский модуль, который добавляет строку в таблицу PM (и любые другие связанные таблицы, у меня нет схемы базы данных PM передо мной).
Вы можете использовать правила для запуска модуля после события "учетная запись создана".
Хотя это может быть больше ручного кодирования, чем вы хотите.