5.x common.inc drupal_mail($mailkey, $to, $subject, $body, $from = NULL, $headers = array())
6.x mail.inc drupal_mail($module, $key, $to, $language, $params = array(), $from = NULL, $send = TRUE)
7.x mail.inc drupal_mail($module, $key, $to, $language, $params = array(), $from = NULL, $send = TRUE)

Send an e-mail message, using Drupal variables and default settings. More information in the PHP function reference for mail()


$mailkey: A key to identify the mail sent, for altering.

$to: The mail address or addresses where the message will be send to. The formatting of this string must comply with RFC 2822. Some examples are: user@example.com user@example.com, anotheruser@example.com User <user@example.com> User <user@example.com>, Another User <anotheruser@example.com>

$subject: Subject of the e-mail to be sent. This must not contain any newline characters, or the mail may not be sent properly.

$body: Message to be sent. Drupal will format the correct line endings for you.

$from: Sets From to this value, if given.

$headers: Associative array containing the headers to add. This is typically used to add extra headers (From, Cc, and Bcc). <em>When sending mail, the mail must contain a From header.</em>

Return value

Returns TRUE if the mail was successfully accepted for delivery, FALSE otherwise.

Related topics

4 calls to drupal_mail()
contact_mail_page_submit in modules/contact/contact.module
Process the site-wide contact page form submission.
contact_mail_user_submit in modules/contact/contact.module
Process the personal contact page form submission.
user_pass_submit in modules/user/user.module
user_register_submit in modules/user/user.module


includes/common.inc, line 2081
Common functions that many Drupal modules will need to reference.


function drupal_mail($mailkey, $to, $subject, $body, $from = NULL, $headers = array()) {
  $defaults = array(
    'MIME-Version' => '1.0',
    'Content-Type' => 'text/plain; charset=UTF-8; format=flowed',
    'Content-Transfer-Encoding' => '8Bit',
    'X-Mailer' => 'Drupal',

  // To prevent e-mail from looking like spam, the addresses in the Sender and
  // Return-Path headers should have a domain authorized to use the originating
  // SMTP server.  Errors-To is redundant, but shouldn't hurt.
  $default_from = variable_get('site_mail', ini_get('sendmail_from'));
  if ($default_from) {
    $defaults['From'] = $defaults['Sender'] = $defaults['Return-Path'] = $defaults['Errors-To'] = $default_from;
  if ($from) {
    $defaults['From'] = $from;
  $headers = array_merge($defaults, $headers);

  // Custom hook traversal to allow pass by reference
  foreach (module_implements('mail_alter') as $module) {
    $function = $module . '_mail_alter';
    $function($mailkey, $to, $subject, $body, $from, $headers);

  // Allow for custom mail backend
  if (variable_get('smtp_library', '') && file_exists(variable_get('smtp_library', ''))) {
    include_once './' . variable_get('smtp_library', '');
    return drupal_mail_wrapper($mailkey, $to, $subject, $body, $from, $headers);
  else {

    // Note: if you are having problems with sending mail, or mails look wrong
    // when they are received you may have to modify the str_replace to suit
    // your systems.
    //  - \r\n will work under dos and windows.
    //  - \n will work for linux, unix and BSDs.
    //  - \r will work for macs.
    // According to RFC 2646, it's quite rude to not wrap your e-mails:
    // "The Text/Plain media type is the lowest common denominator of
    // Internet e-mail, with lines of no more than 997 characters (by
    // convention usually no more than 80), and where the CRLF sequence
    // represents a line break [MIME-IMT]."
    // CRLF === \r\n
    // http://www.rfc-editor.org/rfc/rfc2646.txt
    $mimeheaders = array();
    foreach ($headers as $name => $value) {
      $mimeheaders[] = $name . ': ' . mime_header_encode($value);
    return mail($to, mime_header_encode($subject), str_replace("\r", '', $body), join("\n", $mimeheaders));