Можно ли уведомлять пользователей по электронной почте при получении личного сообщения, за исключением случаев, когда конкретный пользователь отправляет сообщение?


Я также открыл поток на этом Drupal.org но так как прошло уже некоторое время, я подумал, что попробую спросить здесь.

Пример использования: В общем, я хочу, чтобы пользователи получали уведомления о новых личных сообщениях. Я могу сделать это, используя прилагаемый подмодуль для отправки личных сообщений по электронной почте.

Чтобы во входящих личных сообщениях было сообщение, когда пользователи входят в систему в первый раз, я использовал модуль правил для автоматической отправки личного сообщения "добро пожаловать" при регистрация от имени учетной записи администратора. Однако это вызывает поведение "отправить электронное письмо в личном сообщении". Поскольку пользователи уже получают электронное письмо "пожалуйста, подтвердите свой адрес электронной почты", я не хочу, чтобы они получали второе электронное письмо с уведомлением о том, что они получили личное сообщение "Добро пожаловать".

Существует ли способ предотвратить отправку уведомлений по электронной почте от определенных пользователей (или, наоборот, определенных сообщений)?

Я также изучил реализация этого с использованием правил вместо включенного подмодуля, но это означало бы, что я не смогу использовать функциональность для уменьшения количества уведомлений (в настоящее время у меня настроено не отправлять дополнительные электронные письма, если пользователь еще не вошел в систему и не прочитал первое электронное письмо в потоке от данного пользователя).

Author: Patrick Kenny, 2012-05-17

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;
    }
  }
}
 4
Author: kalabro, 2012-05-22 15:45:05

С помощью hook_mail_alter вы можете остановить отправку с помощью $message['send'] = FALSE.

К сожалению, это не дает прямого способа узнать, что почта является "первой почтой" или "от uid 1". Я считаю, что это должно было бы совпадать непосредственно с основным текстом. Вызов $module, однако, доступен, поэтому вы можете ограничить манипуляции таким образом.

 3
Author: Letharion, 2012-05-20 13:51:15

Это может потребовать некоторого реинжиниринга, но я бы написал пользовательский модуль, который добавляет строку в таблицу PM (и любые другие связанные таблицы, у меня нет схемы базы данных PM передо мной).

Вы можете использовать правила для запуска модуля после события "учетная запись создана".

Хотя это может быть больше ручного кодирования, чем вы хотите.

 0
Author: Aaron Ortega, 2012-05-20 15:44:26