9

I need to send an e-mail from my custom php code using the Drupal service.

In other words, I've noticed Drupal can easily send emails so I would like to know how can I use drupal libraries to send the emails, instead of using external libraries.

kiamlaluno
  • 24,790
  • 16
  • 70
  • 85
aneuryzm
  • 55,858
  • 96
  • 259
  • 471

3 Answers3

8

You need to use drupal_mail(), and define hook_mail() in your module.

You'll then call the first one, and the e-mail information will be set by the second one. (See the example on the documentation page for drupal_mail().)

kiamlaluno
  • 24,790
  • 16
  • 70
  • 85
Pascal MARTIN
  • 374,560
  • 73
  • 631
  • 650
  • if I have my php code in a script how do I invoke the correct hook. In other words, if I invoke drupal_mail(), how can I refer to the right hook_mail() ? – aneuryzm Jul 14 '10 at 18:55
  • Read the documentation page Pascal referred to. Quote: `// example_mail() will be called based on the first drupal_mail() parameter.` – marcvangend Jul 14 '10 at 19:37
7
$message = array(
  'to' => 'example@mailinator.com',
  'subject' => t('Example subject'),
  'body' => t('Example body'),
  'headers' => array('From' => 'example@mailinator.com'),
);

drupal_mail_send($message);

Caveats:

  • Because drupal_mail() isn't called, other modules will not be able to hook_mail_alter() your output, which can cause unexpected results.
  • drupal_mail_send() is ignorant about which language to send the message in, so this needs to be figured out beforehand.
  • You'll have to manually specify any other e-mail headers that are required ('Content-Type', etc.). These are normally taken care of for you by drupal_mail(). In the case where your module sends several different types of emails, and you want those email templates to be editable (for example, user module's various registration notification/password reset/etc. e-mails), using hook_mail() is still the best way to go.

This is what reported in a comment in the documentation for drupal_mail(). If the caveats are not important in your case, then you can use the reported snippet.

kiamlaluno
  • 24,790
  • 16
  • 70
  • 85
4

I would recommend to use mimemail. It's a contrib module that will allow you to send HTML mails (+ attachments) or plaintext-only messages with ease. Here is an excerpt from the readme file:

the mimemail() function:

  • $sender - a user object or email address
  • $recipient - a user object or email address
  • $subject - subject line
  • $body - body text in html format
  • $plaintext - boolean, whether to send messages in plaintext-only (default false)

This module creates a user preference for receiving plaintext-only messages. This preference will be honored by all calls to mimemail()

Link: http://drupal.org/project/mimemail

I hope this will help you!

mikewink
  • 519
  • 3
  • 8
  • thanks for this tip. Although the solution to the question was simply drupal_mail, I'm now using mimemail because I need to send attachments. Please check this my new question if you have time: http://stackoverflow.com/questions/3258760/drupal-mimemail-e-mails-without-attachment – aneuryzm Jul 15 '10 at 18:41