Wp mail

by Shahzad Saeed on Jul 3, 2018

Have you noticed that you’re not receiving WordPress contact form notifications? You might be wondering why WPForms isn’t sending you emails when someone fills out your forms, or why you aren’t seeing any WordPress notifications.

In this tutorial, we’ll walk you through how to fix email delivery issues by sending WordPress emails with Mailgun using WP Mail SMTP.

Why Email Notifications Don’t Work

Maybe you’ve noticed that WordPress isn’t sending you email notifications because form entries are piling up in your WordPress dashboard, or frustrated visitors start to reach out to you using social media or other methods.

The most common reason for missing these emails is due to your WordPress hosting server. Usually it isn’t configured to use the PHP mail() function, which WordPress uses by default to send emails generated by WordPress or any contact plugin like WPForms.

Thankfully, you can work around this issue by using SMTP.

SMTP (Simple Mail Transfer Protocol) is the industry standard for sending emails. Unlike PHP mail function, SMTP uses proper authentication which increases email deliverability. That’s why we recommend using SMTP to send emails in WordPress.

In this article we’ll show one of the SMTP services we recommend: Mailgun.

How to Fix Your Form Notifications

Mailgun is a popular email service provider that allows website owners to send large quantities of emails. You can send your first 10,000 emails for free every month (or 100 emails per hour), though beyond that it’s a paid service. But that’s more than enough for most small websites.

Let’s get started setting up your site to send WordPress emails with Mailgun using WP Mail SMTP.

1. Sign up for a Mailgun account

First you need to sign up for an account on the Mailgun website.

Sign up for a Mailgun account

After completing the short signup form, you’ll have a couple of additional verification steps to complete. Multiple levels of verification is what allows Mailgun to better ensure email deliverability for all of their users.

First, you should receive an email to verify your Mailgun account. After clicking the verification link, you’ll then need to enter a mobile number to receive a text verification code.

Verify Mailgun account

Once you’ve completed these steps, you’ll be taken to the login page. Go ahead and log into your new Mailgun account.

After logging in, you’ll be taken to your Mailgun dashboard. If you didn’t enter credit card details earlier, you’ll be prompted for that information again here. Otherwise, you’ll see a graph that can later show some statistics about the emails you send.

When you’re ready, click on Domains in the main menu.

Go to Domains in Mailgun dashboard

On the Domains page, you’ll need to click the Add New Domain button.

Add new domain to Mailgun

Next, you’ll need to enter a subdomain of your website’s domain name.

What does that mean, exactly? A subdomain replaces the “www” part of your website’s address; for example: “subdomain.yourwebsite.com.” Subdomains can be used to add separate sections or directories to your website (like how some sites have their blogs on a subdomain such as blog.example.com).

In this case, the subdomain we’ll create will be used by Mailgun to send emails.

We’ll create the actual subdomain in the next step. For now, you can just enter a subdomain such as mail.yourwebsite.com or mg.yourwebsite.com. (It doesn’t really matter what you name it, but using “mail” or “mg” makes it more clear what its purpose is.)

Add a domain to Mailgun

As we continue into the next step, be sure to keep this tab or window open as we’ll return to this page later.

2. Verify Your Domain

As a way of both protecting site owners and their visitors, some SMTP services like Mailgun require that you verify your domain by adding records to your site’s DNS. You can find more information on the benefits of verifying your domain in Mailgun’s guide.

First, you’ll need to open your site’s DNS settings. If you’re not sure how to find these, Mailgun will provide you with some helpful links shown on their setup page when you’re adding a new domain.

Mailgun Domains page

Once your DNS settings are open, you should see an option to add a new record.

TXT Records

To make it possible for Mailgun to verify your domain, you’ll need to add two TXT records to your site’s DNS. Be sure to copy them carefully, as you’ll need the exact values from your Mailgun account for the verification to work.

Wp mail

In your site’s DNS settings you may also see a TTL field, or Time To Live, field for the record. You can leave this blank to allow the default TTL value to be used.

MX Records

The next step is to add MX, or Mail Exchanger, records.

Mailgun’s MX records are the same for everyone:

First MX record:

  • Type: MX
  • Priority: 10
  • Value: “mxa.mailgun.org”

Second MX record:

  • Type: MX
  • Priority: 10
  • Value: “mxb.mailgun.org”

Once you’ve completed these steps, your DNS settings are all set.

3. Check your Mailgun Verification Status

Now Mailgun will need to verify that your domain has proper DNS records. This verification can take a while (sometimes 24-48 hours) because DNS records may take some time to update.

You can check the status of your domain verification any time by visiting the Domains page in your Mailgun account. Once Mailgun can verify the DNS changes you made, it will show active status next to your domain name.

View active domain on Mailgun

However, you can skip to the next step while you wait for this verification to complete. Just be sure to keep this tab or window open, as we’ll need it a little later.

4. Configure WordPress to Send Emails

Now that you’ve set up your DNS, you can prepare your WordPress site to start using Mailgun with WP Mail SMTP for sending emails.

The first thing you need to do is install and activate the WP Mail SMTP plugin. For more details, see our step by step guide on how to install a WordPress plugin.

After installing and activating this plugin, you need to visit Settings » WP Mail SMTP to configure plugin settings.

At the top of this page, you can set the From Email and From Name. By default, these will fill with your site’s admin email and site name.

For the From Email, be sure this is set to the same email address used to set up your Mailgun account.

We also recommend that you check the box labeled Force From Email. Since you will need the From Email in all plugins that send email to match this email address (a requirement in order for SMTP to work), this option will save you the trouble of editing the email settings throughout your site (in all form emails, etc).

Enable the Force From Email option in WP Mail SMTP

You may add any From Name you’d like, and you can also choose to Force From Name to apply this setting site-wide. Unlike From Email, having a specific From Name is not critical to the plugin’s functionality. However, it will help email recipients to easily see where these emails are coming from.

Set a From Name in WP Mail SMTP settings

Next, in the Mailer field you’ll need to select the Mailgun option.

We also recommend checking the optional Return Path checkbox to Set the return-path to match the From Email. With this enabled, you’ll be emailed if any messages bounce as a result of issues with the recipient’s email.

WP Mail SMTP Mailer settings for Mailgun

After selecting Mailgun as your mailer, a new Mailgun section will appear. Here, you’ll need to enter API and domain information.

Even if your domain is still waiting to be verified, Mailgun will provide the information you need here. To access this, you’ll need to return to the tab or window with your Mailgun domain details.

If you look at the bottom the section named Domain Information, you should see the API Key.

Copy Mailgun API key

Once you’ve copied the text for the full key (including key- at the start), return to the WP Mail SMTP settings and paste it into the API Key field.

Then for the Domain Name, enter the subdomain you created in Mailgun. If needed, you can find this at the top of the Mailgun page with your API key.

Domain name for Mailgun

Once this information is complete, go ahead and save your settings.

Enter Mailgun settings in WP Mail SMTP


Понятие E-mail

Перед тем, как мы углубимся в то, что WordPress API может предложить для отсылки писем, редактирования их настроек и подобных вещей, важно знать пару важных моментов об e-mail.
А именно, важно понять, как работают компоненты, которые создают само письмо, а это нечто большее, чем только адрес, тема и содержание.  Существуют некоторые технические нюансы, которые следует уяснить, прежде чем приступать к созданию собственных писем.

Оглавление (Headers)

«Шапка» электронного письма содержит минимум информации: от кого и кому письмо было отправлено. Также можно встретить и другие сведения. Например, время, когда письмо было послано или получено.

Когда мы работаем с программой WordPress, отправитель письма назначается по умолчанию. Если он не указан, то адрес отправителя принимает вид «wordpress@domain.com»

Если вы хотите установить другой адрес «ответа», например «name@domain.com», то такая возможность доступна в настройках.

Лучше всего работать с оглавлениями, используя массивы.


Когда придет время указывать формат отправки письма, вы, вероятно, увидите два альтернативных формата:

  • Plain text
  •  HTML

Вы привыкли видеть HTML в большинстве современных e-mail клиентов, однако, если у вас упрощенный клиент, или он настроен на отображение только обычного текста, или вы читаете письмо на дисплее старого телефона, то содержимое будет отображаться в Plain text.

Программа WordPress соответственно позволяет отправлять письма как в формате HTML, так и в формате Plain Text.

После того, как мы взглянем на пример, где показано, как программно отправлять электронные письма, нами будет тщательно изучено все происходящее. Вкратце, существует определенный «хук», который значительно все упрощает, однако мы не увидим его в действии, пока не разберемся со всеми необходимыми фрагментами письма.

Вложения (Attachments)

Как известно, вложением является любой файл, прикрепленный к основному письму, отправленный получателю вместе с текстом.

Дело в том, что существуют некоторые нормы и правила отсылки электронного письма с вложением, и они не обязательно предусмотрены в приложении. Вместо этого, сервера, почтовые клиенты устанавливают свои ограничения на определенные виды входящих файлов.


  • Некоторые клиенты не допускают отправку/получение файлов формата ZIP и EXE (т.е. архивы и исполнительные файлы)
  • Большинство сервисов имеют лимит по размеру прикрепленного файла.
  • Определенные типы писем могут быть помечены как спам автоматически (основываясь на вложениях и содержимом тексте)

Разумеется, правила изменить мы не можем. Но стоит знать ограничения тех, кому мы отправляем письма, и оставаться в установленных рамках. Но не стоит волноваться! Отправить е-мейл в соответствии с данными условиями и заданными целями в программе WordPress не составит труда!

Возможно, вам и не потребуются вложения, но и не исключено, что вы захотите прикрепить к письму один или даже несколько дополнительных файлов. В программе это можно реализовать как с помощью строки, так и с помощью массива. Однако мы не будем рассматривать этот случай прямо сейчас, но мы обязательно затронем его, когда будем разбираться с примером.

«Кому», «Тема», «Сообщение»

В большинстве случаев e-mail состоит из трех основных пунктов: «кому» (адрес электронной почты получателя), «Тема» и «Сообщение» (основной текст).

В WordPress достаточно легко работать с данной информацией. Достаточно всего лишь обеспечить каждую «графу» своей строчкой.

Разумеется, если вы хотите отправить сразу несколько писем, то можно как повторять отсылку е-мейла желаемое количество раз, отправляя по одному письму каждому пользователю, так и использовать массив из адресов получателей в WordPress Mail API, тогда письмо отправиться всем, кто был включен в этот массив.

И запомните! Если вы хотите изменить стандартный reply-to(ответный) адрес на свой, загляните в «Оглавление».

Использование WordPress Email API

Мы рассмотрели все основные моменты и готовы приступить к основной части статьи, а то есть, к изучению WordPress Email API.

Если разобраться, весь функционал по этой теме сосредоточен в функции wp_mail, однако существуют еще некоторые «хуки», о которых нам тоже следует знать, если мы хотим использовать все преимущества системы.

Основные «Хуки»

  • wp_mail_content_type позволяет установить тип MIME исходящего письма
  • wp_mail_from – это фильтр, с помощью которого можно установить электронный адрес отправителя, не прибегая к массиву $headers.
  • wp_mail_from_name – фильтр с аналогичной функцией, но для указания имени отправителя (также без использования массива $headers.)
  • wp_login – Хук, который мы будем использовать для демонстрации, посылая е-мейл человеку, когда тот авторизируется в приборной панели WordPress.

Для полноты картины, я поделюсь своим кодом ниже, и вы сможете увидеть все, что мы сейчас разобрали, в действии, тем самым изучить, как это все работает.

// Generate the password Генерируем пароль

// Email the user that they're profile was created = Отправляем письмо пользователю, аккаунт которого был создан

// NOTE: replace [at] with @. This was causing problems with the syntax highlighter = Обратите внимание! Надо замените [at] на «@». (Это бы вызывало проблемы с выделением синтаксиса)

Разбор кода должен все прояснить. После написания основной информации мы, используя плюсы предусмотренных в программе «хуков», создаем «strings» (строки) как аргументы и, в конце концов, вызываем саму функцию wp_mail.

Однако заметьте, что мы допускаем использование пустых массивов для некоторых аргументов $headers. А все потому, что у нас есть пользовательский фильтр для указания «From Name»(Имени отправителя) и “From Address”(Адреса отправителя)

Этот метод не является однозначно лучше, чем альтернативный. Однако теперь мы видим, что существует несколько способов осуществить поставленную задачу.


Почему не работает контактная форма WordPress?

Неподходящая тема или ошибка в теме

Частая проблема, из-за которой не работает контактная форма WordPress – неподходящая тема или же ошибки в Javascript-е темы. Для того чтобы понять, по этой ли причине у вас не работает форма обратной связи WordPress, нужно зайти в админку и выбрать вкладку «Темы». Там поменять шаблон на «тему по умолчанию» и после этого проверить работу отправки сообщений и внешний вид контактной формы. Если после этого сообщения отправляются, и почта работает – значит, нужно править ошибки в выбранной вами теме, так как из-за нее и не отправляется сообщение.

Несоответствие плагинов с Contact Form 7

Плагин для WordPress Contact Form 7 может не работать из-за того, что другие плагины на вашем сайте конфликтуют с ним, и в результате Вордпресс не отправляет почту. Чтобы исключить данную проблему – поочередно отключаем остальные плагины один за одним, каждый раз обновляя страницу обратной связи. Если после отключения одного из плагинов, контактная форма заработала, значит вы нашли корень проблемы. Ищите, чем заменить конфликтующий плагин. Если же вы отключили все плагины, а Contact Form 7 так и не работает, ищем ошибку дальше.

Письма попадают в спам

Возможен вариант, что письма попадают в спам. Если писем ежедневно приходит достаточно большое количество, спам-фильтр может начать их блокировать. Чтобы избежать этого, нужно зайти в настройки почты, которую вы используете для Вордпресс-блога, и отметить важные письма как не спам (если вы все-таки нашли их в папке со спамом). После того, почтовый сервис должен впредь их распознавать как не спамные.

Проверить работу обратной связи без плагина

Вы можете протестировать отправку почты на своем блоге без участия плагина. Вот статья о том, как это сделать – «Форма обратной связи WordPress с плагином и без него». Это верный способ узнать, где спряталась ошибка – в самом плагине Contact Form, либо же она возникает непосредственно при отправке почты в WordPress.

Проблема вызвана хостингом

Чаще всего это выглядит так: сообщение отправляется, но не приходит на почту.

Бывает, что по какой-то причине (например, в случае атаки на сервер или же массовой рассылки писем) хостинг перестал отправлять письма. В этом случае настройка отправки почты на WordPress без участия вашего провайдера не обойдется. Необходимо связаться с технической поддержкой вашего хостинг-провайдера и выяснить причины проблемы. В данном случае вы не будете получать письма не только из контактной формы WordPress, но и сообщения о новых комментариях на блоге.

Но чаще всего подобные проблемы возникают при переезде на новый хостинг. В данном случае вам нужно обратить внимание на настройку почты на WordPress.


Помогите пожалуйста разобратся. не могу понять, как мне в этом коде сделать что бы файлы улетали на почту тоже.

if (isset($_POST['subject-form'])) {  	 if (isset($_POST['name'])) { 		 $name = $_POST['name']; 		 if ($name == '') { 			 unset($name); 		 } 	 }  	if (isset($_POST['surname'])) { 		$surname = $_POST['surname']; 		if ($surname == '') { 			unset($surname); 		} 	}  	if (isset($_POST['street'])) { 		$street = $_POST['street']; 		if ($street == '') { 			unset($street); 		} 	}  	if (isset($_POST['area'])) { 		$area = $_POST['area']; 		if ($area == '') { 			unset($area); 		} 	}  	if (isset($_POST['appointment'])) { 		$appointment = $_POST['appointment']; 		if ($appointment == '') { 			unset($appointment); 		} 	}  	if (isset($_POST['metro'])) { 		$metro = $_POST['metro']; 		if ($metro == '') { 			unset($metro); 		} 	}  	if (isset($_POST['phone'])) { 		$phone = $_POST['phone']; 		if ($phone == '') { 			unset($phone); 		} 	}  	$file_bti = ' Файл бти не прикрепили'; 	$file_treaty = 'Файл договоа не прикрепили'; 	if (isset($_POST['file_treaty'])) { 		$file_treaty = $_POST['file_treaty']; 	} 	if (isset($_POST['file_bti'])) { 		$file_bti = $_POST['file_bti']; 	}  	if (isset($_POST['subject-form'])) { 		$subject = $_POST['subject-form']; 		if ($subject == '') { 			unset($subject); 		} 	}  	if(isset($_FILES['file_treaty'])){ 		$file_treaty=$_FILES['file_treaty']['name']; 		$filepath_treaty = $_FILES['file_treaty']['tmp_name'];  	}else{ 		$file_treaty = 'Файл договоа не прикрепили'; 		$filepath_treaty = ''; 	}  	if(isset($_FILES['file_bti'])){ 		$file_bti=$_FILES['file_bti']['name']; 		$filepath_bti = $_FILES['file_bti']['tmp_name']; 	}else{ 		$file_bti = 'Файл договоа не прикрепили'; 		$filepath_bti = ''; 	}  	$attachments = array(WP_CONTENT_DIR.$filepath_bti); 	if (isset($name) && isset($surname) && isset($street) && isset($area) && isset($appointment) && isset($metro) && isset($phone) && isset($subject)) { 		$address = "sined007@gmail.com"; 		$message = "Имя: $name nФамилия: $surname nАдрес недвижимости: $street nПлощадь: $area nНазначение: $appointment nМетро: $metro nТелефон: $phone"; // Договор аренды: $file_treaty $filepath_treaty , План БТИ: $file_bti $filepath_bti ;  		$send = mail($address, $subject, $message, $attachments); 		if ($send == 'true') { 			?> 			<div style="display: block; position: absolute; top: 0px; left:0px; background: rgba(255, 255, 255, 0.8);width: 100%; height: 150px;"> 				<h2 class="aligncenter" style="text-align: center">Спасибо! Ваша заявка отправлена.</h2></div> 			<script type="text/javascript"> 				function loads(){ 					window.location="../"; 				} 				setTimeout(loads, 3000); 			</script> 			<?php 		} else { 			?> 			<div style="display: block; position: absolute; top: 0px; left:0px; background: rgba(255, 255, 255, 0.8);width: 100%; height: 150px;"> 				<h2 class="aligncenter" style="text-align: center">Ошибка, сообщение не отправлено!</h2></div> 			<script type="text/javascript"> 				function loads(){ 					window.location="../"; 				} 				setTimeout(loads, 3000);  			<?php 		} 	} else { 		?> 		<div style="display: block; position: absolute; top: 0px; left:0px; background: rgba(255, 255, 255, 0.8);width: 100%; height: 150px;"> 		<h2 class="aligncenter" style="text-align: center">Вы заполнили не все поля, необходимо вернуться назад!</h2></div> 		<script type="text/javascript"> 		function loads(){ 		window.location="../"; 		 } 		setTimeout(loads, 3000); 		</script>  	 <?php  	 } ?>  	<?php } ?>


function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() ) { 	// Compact the input, apply the filters, and extract them back out  	/** 	 * Filters the wp_mail() arguments. 	 * 	 * @since 2.2.0 	 * 	 * @param array $args A compacted array of wp_mail() arguments, including the "to" email, 	 * subject, message, headers, and attachments values. 	 */ 	$atts = apply_filters( 'wp_mail', compact( 'to', 'subject', 'message', 'headers', 'attachments' ) );  	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 ) ) { 		require_once ABSPATH . WPINC . '/class-phpmailer.php'; 		require_once ABSPATH . WPINC . '/class-smtp.php'; 		$phpmailer = new PHPMailer( true ); 	}  	// Headers 	$cc = $bcc = $reply_to = array();  	if ( empty( $headers ) ) { 		$headers = array(); 	} else { 		if ( !is_array( $headers ) ) { 			// Explode the headers out, so this function can take both 			// string headers and an 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 -- process a From: header if it's there 					case 'from': 						$bracket_pos = strpos( $content, '<' ); 						if ( $bracket_pos !== false ) { 							// Text before the bracketed email is the "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();  	// From email and name 	// If we don't have a name from the input headers 	if ( !isset( $from_name ) ) 		$from_name = 'WordPress';  	/* If we don't have an email from the input headers default to wordpress@$sitename 	 * Some hosts will block outgoing mail from this address if it doesn't exist but 	 * there's no easy alternative. Defaulting to admin_email might appear to be another 	 * option but some hosts may refuse to relay mail from an unknown domain. See 	 * https://core.trac.wordpress.org/ticket/5007. 	 */  	if ( !isset( $from_email ) ) { 		// Get the site domain and get rid of www. 		$sitename = strtolower( $_SERVER['SERVER_NAME'] ); 		if ( substr( $sitename, 0, 4 ) == 'www.' ) { 			$sitename = substr( $sitename, 4 ); 		}  		$from_email = 'wordpress@' . $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 the name to associate with the "from" email address. 	 * 	 * @since 2.3.0 	 * 	 * @param string $from_name Name associated with the "from" email address. 	 */ 	$from_name = apply_filters( 'wp_mail_from_name', $from_name );  	try { 		$phpmailer->setFrom( $from_email, $from_name, false ); 	} catch ( phpmailerException $e ) { 		$mail_error_data = compact( 'to', 'subject', 'message', 'headers', 'attachments' ); 		$mail_error_data['phpmailer_exception_code'] = $e->getCode();  		/** This filter is documented in wp-includes/pluggable.php */ 		do_action( 'wp_mail_failed', new 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 addresses, using appropriate methods for handling addresses 	$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 into name and address parts if in the format "Foo <bar@baz.com>" 				$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 ( phpmailerException $e ) { 				continue; 			} 		} 	}  	// Set to use PHP's mail() 	$phpmailer->isMail();  	// Set Content-Type and charset 	// If we don't have a 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' );  	// Set the content-type and 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 ) { 			$phpmailer->addCustomHeader( sprintf( '%1$s: %2$s', $name, $content ) ); 		}  		if ( false !== stripos( $content_type, 'multipart' ) && ! empty($boundary) ) 			$phpmailer->addCustomHeader( sprintf( "Content-Type: %s;nt boundary="%s"", $content_type, $boundary ) ); 	}  	if ( !empty( $attachments ) ) { 		foreach ( $attachments as $attachment ) { 			try { 				$phpmailer->addAttachment($attachment); 			} catch ( phpmailerException $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 ) );  	// Send! 	try { 		return $phpmailer->send(); 	} catch ( phpmailerException $e ) {  		$mail_error_data = compact( 'to', 'subject', 'message', 'headers', 'attachments' ); 		$mail_error_data['phpmailer_exception_code'] = $e->getCode();  		/** 		 * Fires after a phpmailerException is caught. 		 * 		 * @since 4.4.0 		 * 		 * @param WP_Error $error A WP_Error object with the phpmailerException message, and an array 		 * containing the mail recipient, subject, message, headers, and attachments. 		 */ 		do_action( 'wp_mail_failed', new WP_Error( 'wp_mail_failed', $e->getMessage(), $mail_error_data ) );  		return false; 	} } 


Почему email не доставляются и пропадают

Письма могут пропадать в силу нескольких причин. Первая и самая главная — ваш email приняли за спам. Любой серьёзный почтовый сервис имеет свой мощный антиспам-модуль c эвристическим анализом содержимого email, не говоря уже о чёрном списке адресов. Поэтому, не переусердствуйте с рассылкой, чтобы не попасть в чёрный список спамеров.
Также, в спам попадут не подписанные электронной подписью письма. То есть, любой может отправить фишинговое письмо, скажем, от имени [email protected], однако, это будет безуспешно, т.к. отправитель вряд ли сможет подтвердить, что оно было отправлено с этого адреса. Для проверки легитимности используются подписи DKIM (DomainKeys Identified Mail) и SPF (Sender Policy Framework) записи.

Что сделать, чтобы письма доходили до адресата

Не переусердствуйте с рассылкой и настройте свой SMTP-сервер, чтобы исходящие email подписывались DCIM- и SPF-подписями. Вы можете настроить свой SMTP сервер, но чтобы не заморачиваться с настройкой, можно привязать домен к Яндекс.ПДД или Google Apps for Business и отправлять email через их сервис, и тогда все нужные заголовки будут прописываться автоматом. Но тут есть 2 оговорки

  1. Ваш хостинг-провайдер должен разрешать исходящие соединения, чтобы была возможность подключиться к внешнему SMTP серверу
  2. Объём рассылки не превышает 2000 писем в день. Это лимит Google, у Yandex вряд ли больше

Если вы укладываетесь в вышеуказанные рамки, тогда вперёд, настроим подключение

Как настроить подключение SMTP

Чтобы настроить нормальную отправку писем, нужно установить плагин WP Mail SMTP. Он позволяет переконфигурировать стандартный PHP Mailer так, чтобы была возможность подключаться к SMTP серверу. Также, советую использовать его, если вы пользуетесь локальным сервером.

Настройка будет происходить под Яндекс. Гугл отметается, так как теперь там нет бесплатных тарифов

Настройка WP Mail SMTP

Подключаем WP Mail SMTPПодключаем WP Mail SMTP
А вот описание опций

  • From Email — email отправителя. Вводим логин от почты полностью как на изображении вверху
  • From Name — Имя отправителя. Можете поставить сюда что хотите, например, адрес вашего сайта
  • Mailer — выбираем Send all WordPress emails via SMTP
  • Return Path — оставляем пустым
  • SMTP Host — адрес SMTP сервера. Вводим smtp.yandex.ru
  • SMTP Port — порт SMTP сервера. Вводим 465
  • Encryption — тип шифровки писем. Вводим Use SSL encryption
  • Authentication — авторизация. Выбираем Yes: Use SMTP authentication
  • Username — логин от почты. Значение должно совпадать с From Email

    Если логин вида [email protected], то нужно вписывать просто login, без @yandex.ru

    Если SSL не сработал, можно попробовать следующие настройки:

    • Сервер smtp.yandex.com
    • Шифрование TLS
    • Порт 587
  • Password — пароль от почты

Когда всё настроите, можете проверить, как получилось. Для этого введите в разделе ниже Send a Test Email ваш email, отправьте тестовое письмо и проверьте почту. Если всё в порядке, оно должно находиться там.

Настройка Contact Form 7

Допустим, мы зарегистрировали email [email protected] и внесли его в настройки WP Mail SMTP, тогда его нужно прописать в форме Contact Form 7 в разделе Письмо в поле От кого:
contact form 7 через smtp yandex

Не обращайте внимания на ошибку: Электронный адрес отправителя не принадлежит домену сайта., email будут отправляться верно с этого адреса.

Установка и настройка почтового сервера

Если лимиты внешнего SMTP-сервера не устраивают, можно использовать свой серверный вариант: установить Postifx или Sendmail. Оба отвечают за работу с email, в частности, их отправку и пересылку.

Установка происходит с помощью введения команд в консоль SSH. Инструменты: Far Manager или putty. Если работа не под root, не забываем перед командами давать sudo

Установка Postfix

apt-get update && apt-get install postfix

В процессе установки будут заданы вопросы относительно настройки. Важно выбрать тип Internet Site. Это необходимо сделать для того, чтобы Postfix сгенерировал файл main.cf и сразу начал работу. В противном случае, Вам необходимо будет настраивать его вручную.

Установка Sendmail

Sendmail устанавливается примерно так же

apt-get update && apt-get install sendmail

Потом его сконфигурировать


После всего этого перезагрузить сервер


Что делать, если email не доходит

  1. Проверить правильность адреса, куда почта должна придти;
  2. Проверить папку Спам;
  3. Выждать пару минут.

Если по истечению времени письмо таки не дошло в почтовый ящик, хотя плагин просигнализировал об успешной отправке сообщения, возможно, хостинг не настроен должным образом.
Возможно, php просто не может отправлять письма.

Как проверить отправку email в PHP

3 команды, которые нужно ввести в консоль SSH последовательно:

php -a  mail ('[email protected]', "Test Mailer", "Test mail from php mailer");  exit;

[email protected] — это адрес, куда надо доставить тестовое письмо.
Если PHP не настроен на работу в консоли, можно попробовать следующее:

  1. Создать файл test_email.php;
  2. Прописать туда:
    <?php mail ('[email protected]', "Test Mailer", "Test mail from php mailer");
  3. Запустить файл командой
    php -f test_email.php

Если на данном этапе возникает ошибка, попробуйте переустановить и правильно сконфигурировать Postfix или Sendmail.

Как вариант, ещё стоит попробовать проверить sendmail_path в php.ini.


В чем проблема с WordPress PHP Mail?

Если вам повезло, то никакой проблемы нет. PHP mail работает в большинстве случаев. Стандартные уведомления, которые рассылает сам WordPress практически всегда успешно доставляются во Входящие. Проблемы могут начаться, когда уведомления рассылают установленные плагины.

Также ограничивать работу PHP mail могут некоторые хостинг сервисы. А еще конфликт может возникнуть при работе определенных security-плагинов.

В любом случае, если у вас хоть раз были проблемы с недоставкой email писем со своего WordPress сайта, есть повод задуматься и попробовать перейти на SMTP отправку.

Что такое SMTP?

SMTP (Simple Mail Transfer Protocol) — это стандартный почтовый протокол для передачи электронных писем, который уже очень давно и успешно используется.

Главное преимущество, которое вы получите при использовании SMTP — это практически 100% гарантия того, что письмо будет доставлено по адресу, и почтовые службы вроде Gmail не пометят его как спам, в отличие от писем, отправленных через PHP mail.

Все потому, что почта, отправленная через SMTP, подвергается определенной аутентификации, в отличие от PHP mail.

Еще одно преимущество SMTP на WordPress — это более персонализированная и брендовая почта.

Как отправлять WordPress почту через SMTP

Уже много времени стандартным плагином для работы с SMTP на WordPress считался WP Mail SMTP. Это популярный и хорошо зарекомендовавший себя плагин.

Но сегодня мы поговорим о другом плагине — Postman SMTP. И вот почему:

  • Postman SMTP использует очень простой мастер настройки
  • Вам не придется хранить пароль от почты в незашифрованном виде (!)
  • Плагин заменяет PHPMailer с Zend_Mail
  • Весь почтовый трафик записывается в логи, так что будет проще отследить проблему
  • Postman SMTP умеет отправлять почту через HTTPS, если ваш хост блокирует SMTP порты

Так что, мы считаем Postman SMTP более толковым и безопасным вариантом, чем WP Mail SMTP.

Шаг 1. Установите и активируйте Postman SMTP

Вы можете скачать бесплатно плагин Postman SMTP с официального каталога плагинов WordPress:

Postman SMTP — как отправлять Email с WordPress с помощью протокола SMTP» />

После активации перейдите в меню Настройки → Postman SMTP.

Шаг 2. Настройка параметров SMTP

У Postman SMTP есть удобный мастер по конфигурации, о чем мы уже упоминали. Просто нажмите на кнопку и выполните все шаги по очереди.

Postman SMTP — как отправлять Email с WordPress с помощью протокола SMTP» />

Мы покажем, как все сделать для настройки SMTP вашего сервера. Но вы также можете использовать сторонние SMTP службы, например Gmail или SendGrid.

В первую очередь вы должны указать email адрес, с которого будет происходить отправка, этот же email будет автоматически указываться в поле «From:»

Postman SMTP — как отправлять Email с WordPress с помощью протокола SMTP» />

Затем укажите hostname сервера для исходящей почты:

Postman SMTP — как отправлять Email с WordPress с помощью протокола SMTP» />

Чтобы найти outgoing hostname, вы можете зайти в cPanel вашего хостинга. В разделе Email Accounts найдите ваш email, который вы хотите использовать, и выберите Set Up Mail Client. Если вы еще не создали свой почтовый аккаунт, вы можете сделать это тут же в cPanel:

Postman SMTP — как отправлять Email с WordPress с помощью протокола SMTP» />

Затем опуститесь ниже к разделу Manual Settings и найдите блок настроек Secure SSL/TLS Settings. Ваш hostname исходящей почты будет указан как URL для Outgoing Server:

Postman SMTP — как отправлять Email с WordPress с помощью протокола SMTP» />

Как только вы укажете outgoing hostname, плагин выполнит дальнейшую конфигурацию и выдаст вам список доступных вариантов для выбора Socket:

Postman SMTP — как отправлять Email с WordPress с помощью протокола SMTP» />

Убедитесь, что вы выбрали вариант с правильным номером порта. Номер порта можно посмотреть там же в cPanel.

На следующем шаге вам нужно указать username и пароль. Опять таки, вся эта информация берется из cPanel в разделе настроек почтового аккаунта. По умолчанию, в качестве username выступает сам email.

Postman SMTP — как отправлять Email с WordPress с помощью протокола SMTP» />

На этом все, вы настроили Postman SMTP!

Шаг 3. Отправка тестового Email

Чтобы убедиться, что все настройки сделаны правильно, вы можете отправить тестовое письмо из админки Postman SMTP:

Postman SMTP — как отправлять Email с WordPress с помощью протокола SMTP» />

И если все прошло удачно, вы получите email на адрес, который вы указали. Если вы получили письмо, значит SMTP настроен и работает!

Postman SMTP — как отправлять Email с WordPress с помощью протокола SMTP» />

Postman SMTP и сторонние Email службы

Как мы сказали ранее, можно использовать Postman SMTP вместе со сторонними Email службами, например Gmail. Вы сможете использовать Gmail и отправлять до 500 писем в сутки, для этого только потребуется создать API ключ.

Или можно использовать SendGrid, цены на который стартуют от $9.95 в месяц.

Мастер настройки Postman SMTP поможет вам настроить оба эти варианта.

Не используйте для почтовых рассылок!

Хотя SMTP протокол отлично подходит для отсылки почты со своего сайта на WordPress, не стоит использовать его для массовой почтовой рассылки. С этим у вас могут возникнуть проблемы.

Для почтовых рассылок лучше использовать сторонние сервисы, например MailChimp.


Если вы единственный пользователь своего сайта на WordPress, и никогда не испытывали проблем с отправкой почты с сайта, пожалуй, лучше все оставить как есть.

Но если на сайте много пользователей, и к тому же вы используете плагины, которые рассылают почтовые уведомления, переход на SMTP может улучшить стабильность отправки и доставки ваших писем, потому как отправка через PHP Mail частенько может закончиться попаданием в Спам.


Поскольку PHP-почта отключена на моем сервере, она перестала работать с интегрированной формой контакта.

Тема называется Boldy, и у нее есть собственный файл sendmail.php, который использует mail() вместо wp_mail() .

  • Хотите перезаписать функции, написанные в файле woocommerce-functions.php
  • Как перейти к изменению WordPress «Страницы Добавить новый экран»
  • wordpress 3.8.1 категория страница 2 ошибка 404 не найден / пользовательский тип сообщения
  • как передать параметр в плагине wordpress
  • Нужна помощь с remove_action ()

Изменение mail() на wp_mail() не работает, но я не уверен, почему?

 <?php if (isset($_POST['submit'])) { error_reporting(E_NOTICE); function valid_email($str) { return ( ! preg_match("/^([a-z0-9+_-]+)(.[a-z0-9+_-]+)*@([a-z0-9-]+.)+[az]{2,6}$/ix", $str)) ? FALSE : TRUE; } if ($_POST['name'] != '' && $_POST['email'] != '' && valid_email($_POST['email']) == TRUE && strlen($_POST['comment']) > 1) { $to = preg_replace("([rn])", "", $_POST['receiver']); $from = preg_replace("([rn])", "", $_POST['email']); $subject = "Website contact message from ".$_POST['name']; $message = $_POST['comment']; $match = "/(bcc:|cc:|content-type:)/i"; if (preg_match($match, $to) || preg_match($match, $from) || preg_match($match, $message)) { die("Header injection detected."); } $headers = "From: ".$from."rn"; $headers .= "Reply-to: ".$from."rn"; if (mail($to, $subject, $message, $headers)) { echo 1; //SUCCESS } else { echo 2; //FAILURE - server failure } } else { echo 3; //FAILURE - not valid email } } else { die("Direct access not allowed!"); } ?> 

  • Вызов функции в пользовательском шаблоне php в WordPress
  • Каковы различные способы обнаружения домашней страницы в WordPress?
  • WordPress Admin: при размещении пользовательского типа сообщения в качестве подменю родительского меню ссылка родительского меню переопределяется CPT
  • WordPress Theme Customizer — добавление области для перемещения пользователей и организации виджетов
  • Перенаправление, когда поисковый запрос является точным заголовком в WordPress

Related of «Использование wp_mail () вместо mail () в WordPress не работает»


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.