Надсилає листа на пошту. Схожа на mail() у PHP.
Кодування за умовчанням відповідає коду блогу (зазвичай utf-8). Кодування встановлюється через фільтр wp_mail_charset .
Хуки з функції Використання wp_mail($to, $subject, $message, $headers, $attachments);
$to
(рядок/масив) (обов’язковий)
email одержувача листа. Декілька одержувачів вказуються в масиві або через кому в рядку.
$subject
(рядок) (обов’язковий)
Тема листа (заголовок).
$message
(рядок) (обов’язковий)
Тіло листа (зміст, контент).
$headers
(рядок/масив) Заголовки листа, що вказують на його атрибути. Для просунутого використання. Може бути:
from
– від кого. Пр. [email protected] content-type
– text/html , text/plain cc
– [email protected] – точна копія (carbon copy) – вторинні одержувачі листа, яким надсилається копія. Вони бачать та знають про наявність один одного.bcc
– [email protected] – прихована точна копія (blind carbon copy) – приховані одержувачі листа – їх адреси не показуються іншим одержувачам.reply-to
– [email protected] та будь-які інші довільні параметри. За замовчуванням: ”
$attachments
(рядок/масив)
Файли, які потрібно прикріпити до письма. Вказуємо повний шлях до файлу (назва файлу включно). Якщо потрібно прикріпити кілька файлів, вказуємо їх назви в масиві або рядку через перенесення рядка.
За замовчуванням: array() Приклади #1 Приклад використання масиву для вказівки заголовків листа: // мається на увазі, що $to, $subject, $message вже визначені...
// видалимо фільтри, які можуть змінювати заголовок $headers
// remove_all_filters( 'wp_mail_from');
// remove_all_filters( 'wp_mail_from_name');
$headers = array(
'From: Me Myself <[email protected] >',
'content-type: text/html',
'cc: John Q Codex <[email protected] >',
'cc: John2 Codex <[email protected] >',
'bcc: [email protected] ', // тут можна використовувати лише просту email адресу
);
wp_mail($to, $subject, $message, $headers); #2 Вкажемо свою адресу email у заголовку листа: add_filter( 'wp_mail_from', 'vortal_wp_mail_from');
function vortal_wp_mail_from( $email_address ){
return '[email protected] ';
}
// Отримаємо заголовок: WordPress <[email protected] > #3 Приклад надсилання листа Відправимо листа My Name <[email protected] >
з прикріпленим файлом attach.zip
:
На деяких серверах (хостингах) у полі FROM (у частині email) обов’язково має фігурувати домен сайту, інакше, наприклад, яндекс пошта не отримає листа. Перевіряв на хостингу Бегет.
Тобто. в цьому випадку краще не вказувати від: , а змінити тільки частину цього поля, тільки ім’я, через фільтр:
add_filter( 'wp_mail_from_name', function($from_name){
return 'Моє ім'я, а не WordPress'; // Тут можна зазначити свою пошту: [email protected]
} ); // видалимо фільтри, які можуть змінювати заголовок $headers
// remove_all_filters( 'wp_mail_from');
// remove_all_filters( 'wp_mail_from_name');
$attachments = array(WP_CONTENT_DIR . '/uploads/attach.zip');
$headers = 'Від: My Name <[email protected] >' . "rn";
wp_mail('[email protected] ', 'Тема', 'Зміст', $headers, $attachments);
// [email protected] – кому відправляємо. #4 Відправимо лист двом користувачам відразу і задамо формат листа html: $multiple_to_recipients = array(
'[email protected] ',
'[email protected] '
);
add_filter( 'wp_mail_content_type', 'set_html_content_type' );
wp_mail( $multiple_to_recipients, 'The subject', '<p>The <em>HTML</em> message</p>' );
// Скинемо content-type, щоб уникнути можливого конфлікту
remove_filter( 'wp_mail_content_type', 'set_html_content_type' );
function set_html_content_type() {
return 'text/html';
} #5 Змінимо тип листа на html Цей приклад показує як змінити тип листа на html, використовуючи фільтр wp_mail_content_type
:
add_filter( 'wp_mail_content_type', function( $content_type ){
return "text/html";
} );
wp_mail( '[email protected] ', 'The subject', '<p>The <em>HTML</em> message</p>'); #6 Вкажемо ім’я в заголовку листа: add_filter( 'wp_mail_from_name', 'vortal_wp_mail_from_name' );
function vortal_wp_mail_from_name( $email_from ){
return 'XXX';
}
// Отримаємо заголовок: XXX <[email protected] > Додати свій приклад
нотатки Global. PHPMailerPHPMailerPHPMailer. $phpmailer список змінЗ версії 1.2.1 Введено. З версії 5.5.0 is_email() is used для email validation, instead of PHPMailer’s default validator.
Код wp_mail() wp mail WP 6.0.2 function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() ) {
// Compact the input, apply the filters, і extract them back out.
/**
* Filters the wp_mail() arguments.
*
* @ Since 2.2.0
*
* @param array $args {
* Array of the `wp_mail()` arguments.
*
* @type string|string[] $to Array або comma-separated list of email address to send message.
* @type string $subject Email subject.
* @type string $message Message contents.
* @type string|string[] $headers Additional headers.
* @type string|string[] $attachments Paths to files to attach.
* }
*/
$atts = apply_filters( 'wp_mail', compact( 'to', 'subject', 'message', 'headers', 'attachments' ) );
/**
* Filters whether to preempt sending на email.
*
* Returning a non-null value will short-circuit {@see wp_mail()}, returning
* that value instead. A boolean return value повинен бути використаний для певного whether
* the email was successfully sent.
*
* @ Since 5.7.0
*
* @param null|bool $return Short-circuit return value.
* @param array $atts {
* Array of the `wp_mail()` arguments.
*
* @type string|string[] $to Array або comma-separated list of email address to send message.
* @type string $subject Email subject.
* @type string $message Message contents.
* @type string|string[] $headers Additional headers.
* @type string|string[] $attachments Paths to files to attach.
* }
*/
$pre_wp_mail = apply_filters( 'pre_wp_mail', null, $atts );
if ( null !== $pre_wp_mail ) {
return $pre_wp_mail;
}
if ( isset( $atts['to'] ) ) {
$to = $atts['to'];
}
if ( ! is_array ( $ to ) ) {
$to = explode(',', $to);
}
if ( isset( $atts['subject'] ) ) {
$subject = $atts['subject'];
}
if ( isset( $atts['message'] ) ) {
$message = $atts['message'];
}
if ( isset( $atts['headers'] ) ) {
$headers = $atts['headers'];
}
if ( isset( $atts['attachments'] ) ) {
$attachments = $atts['attachments'];
}
if (! is_array($attachments)) {
$attachments = explode( "n", str_replace( "rn", "n", $attachments ) );
}
global $phpmailer;
// (Re) create it, if it's gone missing.
if ( ! ( $phpmailer instanceof PHPMailer PHPMailer PHPMailer ) ) {
require_once ABSPATH. WPINC. '/PHPMailer/PHPMailer.php';
require_once ABSPATH. WPINC. '/PHPMailer/SMTP.php';
require_once ABSPATH. WPINC. '/PHPMailer/Exception.php';
$phpmailer = новий PHPMailer PHPMailer PHPMailer (true);
$phpmailer::$validator = static function ( $email ) {
return (bool) is_email($email);
};
}
// Headers.
$cc = array();
$bcc = array();
$reply_to = array();
if (empty($headers)) {
$headers = array();
} else {
if ( ! is_array ( $headers ) ) {
// Explode headers out, so this function can take
// both string headers and array of headers.
$tempheaders = explode( "n", str_replace( "rn", "n", $headers ) );
} else {
$ tempheaders = $headers;
}
$headers = array();
// If it's actually got contents.
if ( ! empty( $tempheaders ) ) {
// Iterate through the raw headers.
foreach ((array) $tempheaders as $header) {
if ( strpos( $header, ':' ) === false ) {
if ( false !== stripos( $header, 'boundary=' ) ) {
$parts = preg_split('/boundary=/i', trim($header));
$boundary = trim( str_replace( array( "'", '"' ), '', $parts[1] ) );
}
continue;
}
// Explode them out.
list($name, $content) = explode(':', trim($header), 2);
// Cleanup crew.
$ name = trim ($ name);
$content = trim($content);
switch (strtolower($name)) {
// Mainly for legacy - процес "From:" header if it's there.
case 'from':
$bracket_pos = strpos($content, '<');
if ( false !== $bracket_pos ) {
// Text перед тим, що браузер електронної пошти є "From" name.
if ( $bracket_pos > 0 ) {
$from_name = substr($content, 0, $bracket_pos - 1);
$from_name = str_replace( '"', '', $from_name );
$ from_name = trim ($ from_name);
}
$from_email = substr($content, $bracket_pos + 1);
$from_email = str_replace( '>', '', $from_email );
$ from_email = trim ($ from_email);
// Avoid setting an empty $from_email.
} elseif ( '' !== trim( $content ) ) {
$from_email = trim($content);
}
break;
case 'content-type':
if ( strpos( $content, ';' ) !== false ) {
list($type, $charset_content) = explode(';', $content);
$content_type = trim($type);
if ( false !== stripos( $charset_content, 'charset=' ) ) {
$charset = trim( str_replace( array( 'charset=', '"' ), '', $charset_content ) );
} elseif ( false !== stripos( $charset_content, 'boundary=' ) ) {
$boundary = trim( str_replace( array( 'BOUNDARY=', 'boundary=', '"' ), '', $charset_content ) );
$charset = '';
}
// Avoid setting an empty $content_type.
} elseif ( '' !== trim( $content ) ) {
$content_type = trim($content);
}
break;
case 'cc':
$cc = array_merge((array) $cc, explode(',', $content));
break;
case 'bcc':
$bcc = array_merge((array) $bcc, explode(',', $content));
break;
case 'reply-to':
$reply_to = array_merge((array) $reply_to, explode(',', $content));
break;
default:
// Add it to our grand headers array.
$headers[trim($name)] = trim($content);
break;
}
}
}
}
// Empty out the values that may be set.
$phpmailer->clearAllRecipients();
$phpmailer->clearAttachments();
$phpmailer->clearCustomHeaders();
$phpmailer->clearReplyTos();
// Set "From" name and email.
// If we don't have a name from the input headers.
if ( ! isset ( $ from_name ) ) {
$from_name = 'WordPress';
}
/*
* Якщо ми не маємо електронної пошти з введення headers, default to wordpress@$sitename
* Деякі hosts будуть блокувати outgoing mail з цієї адреси, якщо це немає,
* but there's no easy alternative. Defaulting to admin_email might appear to be
* Інші варіанти, але деякі користувачі можуть відповісти на зв'язок mail з unknown domain.
* See https://core.trac.wordpress.org/ticket/5007.
*/
if ( ! isset ( $ from_email ) ) {
// Get the site domain and get rid of www.
$sitename = wp_parse_url( network_home_url(), PHP_URL_HOST );
$from_email = 'wordpress@';
if ( null !== $sitename ) {
if ( 'www.' === substr( $sitename, 0, 4 ) ) {
$ sitename = substr ($ sitename, 4);
}
$from_email .= $sitename;
}
}
/**
* Filters the email address to send from.
*
* @ Since 2.2.0
*
* @param string $from_email Email address to send from.
*/
$from_email = apply_filters( 'wp_mail_from', $from_email );
/**
* Filters name до поєднань з "від" електронної пошти.
*
* @ Since 2.3.0
*
* @param string $from_name Назви зв'язку з "від" адреса електронної пошти.
*/
$from_name = apply_filters( 'wp_mail_from_name', $from_name );
try {
$phpmailer->setFrom( $from_email, $from_name, false );
} catch ( PHPMailer PHPMailer Exception $ e ) {
$mail_error_data = compact( 'to', 'subject', 'message', 'headers', 'attachments' );
$mail_error_data['phpmailer_exception_code'] = $e->getCode();
/** Цей filter is documented в wp-includes/pluggable.php */
do_action( 'wp_mail_failed', новий WP_Error( 'wp_mail_failed', $e->getMessage(), $mail_error_data ) );
return false;
}
// Set mail's subject and body.
$phpmailer->Subject = $subject;
$phpmailer->Body = $message;
// Set destination address, using appropriate methods for handling address.
$address_headers = compact( 'to', 'cc', 'bcc', 'reply_to' );
foreach ( $address_headers as $address_header => $addresses ) {
if (empty($addresses)) {
continue;
}
foreach ((array) $addresses as $address) {
try {
// Break $recipient в name і address parts if in the format "Foo <[email protected] >".
$recipient_name = '';
if ( preg_match( '/(.*)<(.+)>/', $address, $matches ) ) {
if ( count( $matches ) == 3 ) {
$recipient_name = $matches[1];
$address = $matches[2];
}
}
switch ($ address_header) {
case 'to':
$phpmailer->addAddress( $address, $recipient_name );
break;
case 'cc':
$phpmailer->addCc( $address, $recipient_name );
break;
case 'bcc':
$phpmailer->addBcc( $address, $recipient_name );
break;
case 'reply_to':
$phpmailer->addReplyTo( $address, $recipient_name );
break;
}
} catch ( PHPMailer PHPMailer Exception $ e ) {
continue;
}
}
}
// Set to use PHP mail().
$phpmailer->isMail();
// Set Content-Type and charset.
// If we don't have content-type from the input headers.
if ( ! isset ( $content_type ) ) {
$content_type = 'text/plain';
}
/**
* Filters the wp_mail() content type.
*
* @ Since 2.3.0
*
* @param string $content_type Default wp_mail() content type.
*/
$content_type = apply_filters( 'wp_mail_content_type', $content_type );
$phpmailer->ContentType = $content_type;
// Set whether it's plaintext, depending on $content_type.
if ( 'text/html' === $content_type ) {
$phpmailer->isHTML( true );
}
// If we don't have a charset from the input headers.
if ( ! isset ( $ charset ) ) {
$charset = get_bloginfo( 'charset');
}
/**
* Filters the default wp_mail() charset.
*
* @ Since 2.3.0
*
* @param string $charset Default email charset.
*/
$phpmailer->CharSet = apply_filters( 'wp_mail_charset', $charset );
// Set custom headers.
if ( ! empty( $headers ) ) {
foreach ((array) $headers as $name => $content ) {
// Лише add custom headers не added automatically by PHPMailer.
if ( ! in_array( $name, array( 'MIME-Version', 'X-Mailer' ), true ) ) {
try {
$phpmailer->addCustomHeader( sprintf( '%1$s: %2$s', $name, $content ) );
} catch ( PHPMailer PHPMailer Exception $ e ) {
continue;
}
}
}
if ( false !== stripos( $content_type, 'multipart' ) && ! empty( $boundary ) ) {
$phpmailer->addCustomHeader( sprintf( 'Content-Type: %s; boundary="%s"', $content_type, $boundary ) );
}
}
if ( ! empty( $attachments ) ) {
foreach ( $attachments as $attachment ) {
try {
$phpmailer->addAttachment( $attachment );
} catch ( PHPMailer PHPMailer Exception $ e ) {
continue;
}
}
}
/**
* Fires after PHPMailer is initialized.
*
* @ Since 2.2.0
*
* @param PHPMailer $phpmailer The PHPMailer instance (passed by reference).
*/
do_action_ref_array( 'phpmailer_init', array( &$phpmailer ) );
$mail_data = compact( 'to', 'subject', 'message', 'headers', 'attachments' );
// Send!
try {
$send = $phpmailer->send();
/**
* Fires after PHPMailer has successfully sent an email.
*
* The firing of this action does необов'язково mean that the recipient(s) received the
* Email успішно. It only means that the `send` method above was able to
* process the request without any errors.
*
* @ Since 5.9.0
*
* @param array $mail_data {
* На місці розміщення електронної пошти(s), повідомлень, повідомлень, headers, і пристроях.
*
* @type string[] $to Email address to send message.
* @type string $subject Email subject.
* @type string $message Message contents.
* @type string[] $headers Additional headers.
* @type string[] $attachments Paths to files to attach.
* }
*/
do_action( 'wp_mail_succeeded', $mail_data );
return $send;
} catch ( PHPMailer PHPMailer Exception $ e ) {
$mail_data['phpmailer_exception_code'] = $e->getCode();
/**
* Fires after a PHPMailerPHPMailerException is caught.
*
* @ Since 4.4.0
*
* @param WP_Error $error A WP_Error об'єкт з PHPMailerPHPMailerException message, and an array
* Розміщення електронної пошти, суб'єкта, повідомлення, headers, і пригоди.
*/
do_action( 'wp_mail_failed', новий WP_Error( 'wp_mail_failed', $e->getMessage(), $mail_data ) );
return false;
}
} Зв’язані функції