Sending emails through Mailgun using Codeigniter (and using Mailgun campaigns)

As a developer and startup founder, I occasionally find myself looking at web apps and thinking either “This is too expensive” or “This doesn’t do exactly what I want.” My solution (for better or worse) is to build what I want myself. And when I’m building a quick app that I’m going to be the primary user of, my framework of choice is Codeigniter. It’s fast to develop in. It’s easy. And, most importantly, it’s stable (so I don’t have to worry about keeping up-to-date with weekly version releases… I’m looking at you, Node.JS).

The past few days I’ve been working on an emailing app. After all, why use something as simple and beautiful as Mailchimp when you can build your own clunky, ugly, Frankenstein version, right?

Anyway, a friend suggested Mailgun, and the free 10,000 emails a month sounded like a good deal, so I figured I’d leave SendGrid behind for a few days.

Overall, I’m unbelievably pleased with Mailgun. It’s a solid system. I might even switch RocketBolt to it. However, troubleshooting it with Codeigniter was a bit more tricky than I’m used to. Turns out not too many people are talking about how to make Mailgun and Codeigniter play nicely together. It’s not difficult. It’s just more difficult than it should be because no one has posted instructions. So I thought I’d give a quick write-up. Future spammers of the world… you’re welcome!

Integrating Mailgun into Codeigniter:

The best way to hook Mailgun into Codeigniter is by using Mailgun’s SMTP integration. Start by creating an email.php file in your application’s “config” folder (if you don’t already have one). In the body, you can paste something like this:

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

  $config['mailtype'] = 'html';
  $config['charset'] = 'utf-8';

  $config['protocol'] = 'smtp';
  $config['smtp_host'] = 'ssl://smtp.mailgun.org';
  $config['smtp_port'] = 465;
  $config['smtp_user'] = '[your Mailgun SMTP username]';
  $config['smtp_pass'] = '[your Mailgun SMTP password]';
  $config['smtp_timeout'] = '4';
  $config['crlf'] = '\n';
  $config['newline'] = '\r\n';

Here’s a little note to future me: the “$config[‘crlf’]” line is needed to fix a Codeigniter bug that prevents subject lines from being more than 75 characters. (Hey… I said Codeigniter is quick, but I didn’t say it was perfect.)

Once you’ve done that, you’re good to go. Send emails through Codeigniter as normal, and you’ll be burning through those 10,000 free Mailgun emails in no time!

Creating Mailgun campaigns with Codeigniter:

This turned out to be a bit more tricky. Mailgun has a slick campaign tracking system. But, in order to use it, you need to add a custom email header. Turns out Codeigniter doesn’t have a pre-built way of doing that, so you’ll need to extend CI’s email class. As I mentioned at the beginning of this post, the Interwebs are a bit lacking for direct answers about sending campaign headers for Mailgun, but I was able to adapt the solution from an answer about how to do a similar thing for Sendgrid. Here’s what you need to know:

Step 1:

Create a file in your application’s “libraries” folder called “MY_Email.php” and then add the following code:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');

  class MY_Email extends CI_Email {

      public function __construct($config = array())
      {
          if (count($config) > 0)
          {
              $this->initialize($config);
          }
          else
          {
              $this->_smtp_auth = ($this->smtp_user == '' AND $this->smtp_pass == '') ? FALSE : TRUE;
              $this->_safe_mode = ((boolean)@ini_get("safe_mode") === FALSE) ? FALSE : TRUE;
          }

          log_message('debug', "Email Class Initialized");
      }

      // this will allow us to add headers whenever we need them
      public function set_header($header, $value)
      {
          $this->_headers[$header] = $value;
      }
  }

Step 2:

Once you’ve done that, adding a Mailgun campaign header is as simple as including the following line of code when you first start constructing your email:

  $this->email->set_header('X-Mailgun-Campaign-Id', [Your Mailgun Campaign ID]);

And that’s it. Just make sure to include that line before setting anything else in the email (for example… if you want an HTML email and are loading a View), otherwise it’ll throw a pleasant “headers already sent” error.

That’s it for today. By the way… how’d you like my first coding tutorial? Not nearly as fun as everything else I write, huh? I also learned that my original theme was terrible for showing code, but I think I’ve finally fixed that. Lucky you!

Share

I teach in Duke University’s Innovation & Entrepreneurship program and founded RocketBolt. I write about startups, pedagogy, entrepreneurship, engineering, and poetry. They’re all related, I promise.

Leave a Reply

Your email address will not be published. Required fields are marked *

Instagram

  • Dear @dukeinnovation students... pay no attention to the tiger on the chalkboard behind you. #nothingtoseehere #grr
  • Today, the @southwestair Twitter account shared some valuable wisdom with my @dukeinnovation #socialmediamarketing class. I couldn’t agree more 😁
  • Founder of @thestartupfactory and one of my first business mentors, @davenealnc, stopped by the @dukeinnovation Capstone class to discuss #venturecapital and why the #researchtriangle is a great place to build a #startup.
.
.
.
.
.
#entrepreneur #entrepreneurship #entrepreneurlife #startups #startupstories #venturecapitalist #innovation #researchtrianglepark #rtp
  • When Bill Aulet, author of Disciplined Entrepreneurship and managing director of @eshipmit swings by Durham for a day, you cancel your lesson plan and convince him to guest lecture in your @dukeinnovation #entrepreneurship capstone class 😁
.
.
.
.
.
#entrepreneur #startup #startups #entrepreneurlife #startuplife #innovation #business #guestlecture #disciplinedentrepreneurship
  • Lucky to have @youtube #tech personality, #entrepreneur, and #startup founder @matt_schaefer_ swing by my #socialmediamarketing class today to talk about strategies for building audiences online.
.
.
.
.
.
#videomarketing, #influencermarketing, #startups, #entrepreneurship, #marketing, #fearthealgorithm
  • Thanks to Bill Walker, founder of #medtech startup Hemosonics and @dukeengineering director of #entrepreneurship, for speaking with my @dukeinnovation capstone class.
.
.
.
#entrepreneurship #startup #startups #innovation #inspirationalquotes #knowledgebomb
  • In today’s #socialmediamarketing class for @dukeinnovation, I agreed to give students extra credit if they could convince any celebrities to follow them on Twitter. One of my students was a bit more successful than I’d expected 😳
.
.
.
#entrepreneur #innovation #startup #marketing #hustle #impressive
  • Giving a 3 hour lecture to a wonderful group of Chinese students from Yangtze University visiting @dukeuniversity. We’ll be taking about #marketing #sales #startups #entrepreneurship  #innovation #socialmediamarketing and lots of other stuff that’ll probably put them to sleep. 😴.
.
P.S. It’s really hot in this room and we’re all sweating.
  • ‪“In a business, you can hire to solve almost any problem, but nobody can replace discovering the problem and finding the path toward solving it. That’s what an entrepreneur does.” ‬- Sam Fox, a brilliant young #entrepreneur and @dukeuniversity alum who came back to talk with my @dukeinnovation capstone class about his journey into healthcare innovation.
.
.
.
#entrepreneur #startup #innovation #healthtech #healthcare #guestspeaker
  • Some #boomerang shots from the first day of classes including the first failure challenge of the year: a one hour game of tic tac toe with students, faculty, and staff from across @dukeuniversity. Because why not? 🤷‍♂️
.
A special thanks to my new partner in #failure, @star.gould, for jumping in as my #learningtofail co-teacher. It’s going to be a fun semester.
.
.
.
.
.
#startup #startups #entrepreneur #entrepreneurship #innovation #highereducation #highered
  • Torturing my @dukeinnovation #socialmediamarketing students because it’s the #firstdayofschool at @dukeuniversity 😈🤑🤐
.
.
.
.
.
#innovation #entrepreneur #marketing #mystudentshateme
  • Snuck into the back of today’s @dukefuqua Program for Entrepreneurs kickoff event. Maybe if I attend enough classes I can convince someone to give me a free #MBA 😁
.
.
.
#p4e #entrepreneur #startup #entrepreneurlife #freeMBA

Follow Me!