send mail

drupal8发送mail方法

注册SMTP server

email.png
1
2
3
4
5
'host' => 'smtp.126.com',
'port' => 25,
'username' => 'li_yang_1224_1@126.com',
'password' => 'xxxx',
'transport' => 'Smtp'

配置SMTP server

  1. 安装SMTP Authentication Support模块
  2. 配置SMTP
    admin/config/system/smtpconfig.png

    drupal实现

    EmailExampleController.php
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    public function submitForm(array &$form, FormStateInterface $form_state) {
    $form_values = $form_state->getValues();
    // All system mails need to specify the module and template key (mirrored
    // from hook_mail()) that the message they want to send comes from.
    $module = 'email_example';
    $key = 'contact_message';
    // Specify 'to' and 'from' addresses.
    $to = $form_values['email'];
    $from = $this->config('system.site')->get('mail');
    // "params" loads in additional context for email content completion in
    // hook_mail(). In this case, we want to pass in the values the user entered
    // into the form, which include the message body in $form_values['message'].
    $params = $form_values;
    // The language of the e-mail. This will one of three values:
    // - $account->getPreferredLangcode(): Used for sending mail to a particular
    // website user, so that the mail appears in their preferred language.
    // - \Drupal::currentUser()->getPreferredLangcode(): Used when sending a
    // mail back to the user currently viewing the site. This will send it in
    // the language they're currently using.
    // - \Drupal::languageManager()->getDefaultLanguage()->getId: Used when
    // sending mail to a pre-existing, 'neutral' address, such as the system
    // e-mail address, or when you're unsure of the language preferences of
    // the intended recipient.
    //
    // Since in our case, we are sending a message to a random e-mail address
    // that is not necessarily tied to a user account, we will use the site's
    // default language.
    $language_code = $this->languageManager->getDefaultLanguage()->getId();
    // Whether or not to automatically send the mail when we call mail() on the
    // mail manager. This defaults to TRUE, and is normally what you want unless
    // you need to do additional processing before the mail manager sends the
    // message.
    $send_now = TRUE;
    // Send the mail, and check for success. Note that this does not guarantee
    // message delivery; only that there were no PHP-related issues encountered
    // while sending.
    $result = $this->mailManager->mail($module, $key, $to, $language_code, $params, $from, $send_now);
    if ($result['result'] == TRUE) {
    drupal_set_message(t('Your message has been sent.'));
    }
    else {
    drupal_set_message(t('There was a problem sending your message and it was not sent.'), 'error');
    }
    }

email_example.module

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
function email_example_mail($key, &$message, $params) {
// Each message is associated with a language, which may or may not be the
// current user's selected language, depending on the type of e-mail being
// sent. This $options array is used later in the t() calls for subject
// and body to ensure the proper translation takes effect.
$options = array(
'langcode' => $message['langcode'],
);
switch ($key) {
// Send a simple message from the contact form.
case 'contact_message':
$from = \Drupal::config('system.site')->get('mail');
$message['subject'] = t('E-mail sent from @site-name', array('@site-name' => $from), $options);
// Note that the message body is an array, not a string.
$account = \Drupal::currentUser();
$message['body'][] = t('@name sent you the following message:', array('@name' => $account->getUsername()), $options);
// Because this is just user-entered text, we do not need to translate it.
// Since user-entered text may have unintentional HTML entities in it like
// '<' or '>', we need to make sure these entities are properly escaped,
// as the body will later be transformed from HTML to text, meaning
// that a normal use of '<' will result in truncation of the message.
$message['body'][] = SafeMarkup::checkPlain($params['message']);
break;
}
}
/**
* Implements hook_mail_alter().
*
* This function is not required to send an email using Drupal's mail system.
*
* hook_mail_alter() provides an interface to alter any aspect of email sent by
* Drupal. You can use this hook to add a common site footer to all outgoing
* email, add extra header fields, and/or modify the email in anyway. HTML-izing
* the outgoing email is one possibility.
*/
function email_example_mail_alter(&$message) {
// For the purpose of this example, modify all the outgoing messages and
// attach a site signature. The signature will be translated to the language
// in which message was built.
$options = array(
'langcode' => $message['langcode'],
);
$signature = t("\n--\nMail altered by email_example module.", array(), $options);
if (is_array($message['body'])) {
$message['body'][] = $signature;
}
else {
// Some modules use the body as a string, erroneously.
$message['body'] .= $signature;
}
}

修改drupal8 bug

PHPMailer.php

参考资料

MailManager::mail
Managing Mail Handling for Development or Testing
How to Configure SMTP in Drupal 8