WordPress

How to customize WordPress mail sending method

Last week, I suddenly stopped receiving email notifications on this blog hosted on openshift. I came to know after some reading that commonly used cloud hosts such as openshift, aws, etc. are usually blacklisted by most email servers, hence its not a good idea to use them to send mails.

In any case, why should I depend on my hosting provider for email sending. Until now, I had never bothered about how mail sending worked in wordpress as it used to work out of the box. So last week, I pulled up my socks and decided to put my php IDE and debugger to some good work.

I decided to use my sendgrid account to send mails. All that`s needed now is calling the web service with the credentials they’ve provided. But how to integrate this with my wordpress blog?

Once I located where the mail sending functionality is there in wordpress code, adding a new method was a piece of cake!! Turns out that wordpress, by default, just executes the “mail” command which is usually just a symlink on unix boxes actually pointing to /usr/bin/sendmail or something. I found it in a pluggable function wp_mail(). (see /wp-includes/pluggable.php). I also came to know from the codex that pluggable functions can be easily overridden by plugins.

Now all I had to do was write a small plugin in the /wp-content/plugins/sendgrid/ folder and override this wp_mail() function with whatever I want.

Lo and behold! I started receiving notifications for all comments and contact forms filled, by just writing this one plugin. I found the process so simple and easy to integrate with wordpress that I couldn’t help sharing with you. Here are the two php snippets that you need to place in /wp-content/plugins/your-plugin-name/ and activate it. WordPress will do the rest!

(First one is the main plugin php file that displays the plugin in your admin menu and overrides the wp_mail function. The second php file contains the actual custom function that sends mail via sendgrid.)

wp-content/plugins/sendgrid/myplugin.php:

<?php
/**
 * Plugin Name: Sendgrid Plugin
 * Plugin URI:  http://www.prahladyeri.com
 * Description: Mail sending using Sendgrid Web API
 * Version:     0.1
 * Author:      Prahlad Yeri
 * Author URI:  http://www.prahladyeri.com
 * License:     MIT
 */

//namespace MailDemo;
require_once('sendgrid.php');

add_action( 'init', 'plugin_init' );

/**
 * Plugin Name: Prahlad's mail
 * Description: Alternative way to send a mail
 */
if (!function_exists('wp_mail'))
{
	function wp_mail($to, $subject, $message, $headers = '', $attachments = array())
	{
		$sto = '';
		if (is_array($to))
		{
			$sto = implode(',',$to);
		} else {
			$sto = $to;
		}
		sendgridmail('wpadmin@mywebsite.com', $sto, $subject, $message, $headers);
	}
}

function plugin_init()
{
}

wp-content/plugins/sendgrid/sendgrid.php:

<?php
//wp-content/plugins/sendgrid/sendgrid.php
function sendgridmail($from, $to, $subject, $message, $headers) {
$url = 'https://api.sendgrid.com/';
$user='your-sendgrid-username';
$pass='your-sendgrid-password'; 		

$params = array(
'api_user'  => $user,
		'api_key'   => $pass,
		'to'        => $to,
		'subject'   => $subject,
		'html'      => '',
		'text'      => $message,
		'from'      => $from,
	  );

	$request =  $url.'api/mail.send.json';

	// Generate curl request
	$session = curl_init($request);
	// Tell curl to use HTTP POST
	curl_setopt ($session, CURLOPT_POST, true);
	// Tell curl that this is the body of the POST
	curl_setopt ($session, CURLOPT_POSTFIELDS, $params);
	// Tell curl not to return headers, but do return the response
	curl_setopt($session, CURLOPT_HEADER, false);
	curl_setopt($session, CURLOPT_RETURNTRANSFER, true);

	print_r('obtaining the response');
	// obtain response
	$response = curl_exec($session);
	print_r('closing curl session');
	curl_close($session);

	// print everything out
	//print_r($response);
}

//only for testing:
/*$to      = 'prahladyeri@yahoo.com';
$subject = 'Testemail';
$message = 'It works!!';
echo 'To is: ' + $to;
#wp_mail($to, $subject, $message, array() );
sendgridmail($to, $subject, $message, array());
print_r('Just sent!');*/

References:

  1. http://codex.wordpress.org/Pluggable_Functions
  2. http://stackoverflow.com/questions/17583205/sendmail-on-openshift-php-codeigniter/17598537#17598537
  3. http://en.wikipedia.org/wiki/Geany
  4. http://en.wikipedia.org/wiki/Xdebug
  5. https://sendgrid.com
  6. https://sendgrid.com/docs/
  7. https://www.openshift.com/
Reference: How to customize WordPress mail sending method from our WCG partner Prahlad Yeri at the Prahlad Yeri blog.

Prahlad Yeri

Prahlad is a freelance software developer working on web and mobile application development. He also likes to blog about programming and contribute to opensource.
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments
Back to top button