Wie kann ich programmatisch eine E-Mail senden?

45

Ich möchte das E-Mail-System von Drupal verwenden, um programmgesteuert eine E-Mail von meinem benutzerdefinierten Modul aus zu senden. Ist das möglich?

Naoise Golden
quelle
Diese Frage ist verknüpft mit: drupal.stackexchange.com/questions/84268/…
pinueve

Antworten:

63

Mit hook_mail und drupal_mail können Sie eine E-Mail erstellen und versenden.

Implementiere eine E-Mail mit hook_mail:

function MODULENAME_mail ($key, &$message, $params) {
  switch ($key) {
    case 'mymail':
      // Set headers etc
      $message['to'] = '[email protected]';
      $message['subject'] = t('Hello');
      $message['body'][] = t('Hello @username,', array('@username' => $params['username']));
      $message['body'][] = t('The main part of the message.');
      break;
  }
}

Um eine Mail zu senden, benutze drupal_mail:

drupal_mail($module, $key, $to, $language, $params = array('username' => 'John Potato'), $from = NULL, $send = TRUE)

Offensichtlich ersetzen Sie die Parameter: $ key sollte gleich 'mymail' sein

Eine E-Mail wird in wenigen Schritten versendet:

  1. drupal_mail wird aufgerufen
  2. Drupal erstellt die E-Mail
  3. hook_mail wird für die Besonderheiten aufgerufen (Implementierung)
  4. hook_mail_alter wird aufgerufen, damit andere Module es ändern können
  5. drupal_send_mail wird aufgerufen
Bart
quelle
5
Er hat Recht, aber um ein bisschen klarer zu werden, bietet hook_mail Ihnen die Möglichkeit, eine E-Mail anhand eines von Ihnen definierten beliebigen Schlüssels zu strukturieren und zu gestalten. drupal_mail () ist das, was Sie anrufen, um eine E-Mail zu senden. Übergeben Sie den Schlüssel für die Struktur, die Sie verwenden möchten. (und das Modul, das auf diesen Schlüssel reagiert)
Jason Smith
9
In diesem Beispiel $message['to']ist hart zu codieren [email protected]. Wenn Sie dies weglassen, wird die Nachricht an den Empfänger gesendet, der beim Anruf angegeben drupal_mail()wird.
Pfrenssen
12

Wenn Sie E-Mails einfacher versenden möchten, lesen Sie Simple Mail . Es ist ein Modul, an dem ich arbeite, um das Versenden von E-Mails mit Drupal 7+ viel einfacher zu machen, und es erfordert keine zusätzlichen Hook-Implementierungen oder MailSystem-Kenntnisse. Das Senden einer E-Mail ist so einfach wie:

simple_mail_send($from, $to, $subject, $message);
Geerlingguy
quelle
... und es funktioniert auch mit Drupal 8 mit genau der gleichen API :)
geerlingguy
1

Sie können eine einfachere Methode zum Versenden von E-Mails verwenden, indem Sie das Mailsystem auschecken . Es ist ein Modul.

<?php
$my_module = 'foo';
$from = variable_get('system_mail', '[email protected]');
$message = array(
  'id' => $my_module,
  'from' => $from,
  'to' => '[email protected]',
  'subject' => 'test',
  'body' => 'test',
  'headers' => array(
    'From' => $from, 
    'Sender' => $from, 
    'Return-Path' => $from,
  ),
);

$system = drupal_mail_system($my_module, $my_mail_token);
if ($system->mail($message)) {
  // Success.
}
else {
  // Failure.
}
?>
rahulkumar.it
quelle
Funktioniert perfekt.
WM
0

Sie können diesen Code in einem Hook Ihrer Wahl in Ihrem benutzerdefinierten Modul verwenden:

 function yourmodulename_mail($from = 'default_from', $to, $subject, $message) {
            $my_module = 'yourmodulename';
            $my_mail_token = microtime();
            if ($from == 'default_from') {
                // Change this to your own default 'from' email address.
                $from = variable_get('system_mail', '[email protected]');
            }
            $message = array(
                'id' => $my_module . '_' . $my_mail_token,
                'to' => $to,
                'subject' => $subject,
                'body' => array($message),
                'headers' => array(
                    'From' => $from,
                    'Sender' => $from,
                    'Return-Path' => $from,
                ),
            );
            $system = drupal_mail_system($my_module, $my_mail_token);
            $message = $system->format($message);
            if ($system->mail($message)) {
                return TRUE;
            } else {
                return FALSE;
            }
        }

Dann können Sie die obige Funktion wie folgt verwenden:

        $user = user_load($userid); // load a user using its uid
        $usermail = (string) $user->mail; // load user email to send a mail to it OR you can specify an email here to which the email will be sent 
        customdraw_mail('default_from', $usermail, 'You Have Won a Draw -- this is the subject',  'Congrats! You have won a draw --this is the body');
Nadeem Khan
quelle