¿Cómo enviar un correo electrónico mediante programación?

45

Me gustaría utilizar el sistema de correo electrónico de Drupal para enviar un correo electrónico mediante programación desde mi módulo personalizado. ¿Es eso posible?

Naoise Golden
fuente
esta pregunta está vinculada a: drupal.stackexchange.com/questions/84268/…
pinueve

Respuestas:

63

Usando hook_mail y drupal_mail puedes crear y enviar un correo electrónico.

Implemente un correo electrónico use 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;
  }
}

Para enviar un correo use drupal_mail:

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

Obviamente reemplace los parámetros: $ key debería ser igual a 'mymail'

Un correo electrónico se envía en unos pocos pasos:

  1. drupal_mail se llama
  2. Drupal construye el correo electrónico
  3. Se llama a hook_mail por los detalles (implementación)
  4. Se llama a hook_mail_alter para que otros módulos puedan modificarlo
  5. Se llama a drupal_send_mail
Bart
fuente
55
Tiene razón, pero para aclarar un poco, hook_mail le proporciona una forma de estructurar y asignar un tema a un correo electrónico basado en una clave arbitraria que usted defina. drupal_mail () es lo que llamas para enviar un correo electrónico. Pase la clave de la estructura que le gustaría usar. (y el módulo que responde a esa clave)
Jason Smith
99
En este ejemplo $message['to']está codificado [email protected]. Omita esto y el mensaje se enviará al destinatario que se especifica cuando drupal_mail()se llama.
pfrenssen
12

Si desea una forma más sencilla de enviar correos electrónicos, consulte Correo simple ; es un módulo en el que estoy trabajando para hacer que el envío de correos electrónicos con Drupal 7+ sea mucho más fácil, y no requiere implementaciones de gancho adicionales ni conocimiento de MailSystem. Enviar un correo electrónico es tan simple como:

simple_mail_send($from, $to, $subject, $message);
geerlingguy
fuente
... y también funciona con Drupal 8, con exactamente la misma API :)
geerlingguy
1

Puede utilizar una forma más sencilla de enviar correos electrónicos, verifique el sistema de correo ; Es un módulo.

<?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
fuente
Funciona perfectamente.
WM
0

Puede usar este código en un gancho de su elección dentro de su módulo personalizado:

 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;
            }
        }

Entonces puede usar la función anterior de esta manera:

        $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
fuente