wp_mail() WP 1.2.1

Надсилає листа на пошту. Схожа на mail() у PHP.

Ім’я відправника за промовчанням: WordPress, а email за промовчанням: [email protected]. Їх можна переписати, змінивши заголовок листа на:

Від: Example User <[email protected]>

Функція використовує фільтри wp_mail_from_name , які впливають на адресу email’a та ім’я відправника, відповідно, при цьому поле From (від кого) збирається заново. Якщо тільки wp_mail_from (email) повертає значення, ім’я вказуватися не буде взагалі: (From: [email protected])

Тип листа за замовчуванням text/plain, а значить в тілі листи не можна використовувати теги html. Змінити тип листа можна через фільтр wp_mail_content_type або вказавши заголовок: content-type: text/html.

Кодування за умовчанням відповідає коду блогу (зазвичай utf-8). Кодування встановлюється через фільтр wp_mail_charset .

Для роботи цієї функції сервер повинен працювати з SMTPта повинен бути встановлений smtp_portу php.ini.

Це init .

Заміна функції (перевизначення) — у плагіні можна створити функцію з такою самою назвою, тоді вона замінить поточну функцію.

Основа для:
wp_new_user_notification()

Хуки з функції

Використання

wp_mail($to, $subject, $message, $headers, $attachments);
$to
(рядок/масив) (обов’язковий)
email одержувача листа. Декілька одержувачів вказуються в масиві або через кому в рядку.
$subject
(рядок) (обов’язковий)
Тема листа (заголовок).
$message
(рядок) (обов’язковий)
Тіло листа (зміст, контент).
$headers
(рядок/масив)

Заголовки листа, що вказують на його атрибути. Для просунутого використання. Може бути:

  • from– від кого. Пр. [email protected]
  • content-typetext/html , text/plain
  • cc[email protected] – точна копія (carbon copy) – вторинні одержувачі листа, яким надсилається копія. Вони бачать та знають про наявність один одного.
  • bcc[email protected] – прихована точна копія (blind carbon copy) – приховані одержувачі листа – їх адреси не показуються іншим одержувачам.
  • reply-to[email protected]
  • та будь-які інші довільні параметри.

За замовчуванням: ”

$attachments
(рядок/масив)
Файли, які потрібно прикріпити до письма. Вказуємо повний шлях до файлу (назва файлу включно). Якщо потрібно прикріпити кілька файлів, вказуємо їх назви в масиві або рядку через перенесення рядка.


За замовчуванням: array()

Приклади

2

#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);
1

#2 Вкажемо свою адресу email у заголовку листа:

add_filter( 'wp_mail_from', 'vortal_wp_mail_from');

function vortal_wp_mail_from( $email_address ){
	return '[email protected]';
}
// Отримаємо заголовок: WordPress <[email protected]>
0

#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] – кому відправляємо.
0

#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';
}
0

#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>');
0

#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.0is_email() is used для email validation, instead of PHPMailer’s default validator.

Код 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;
	}
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *