Custom IMAP Datasource in CakePHP

I searched about custom imap datasource for cakephp all over the internet. I got few things but those are for CakePHP 1.x version that is too old. That’s why I tweaked few things to make it work for CakePHP 2.x version. Here is my modified and upgraded custom IMAP datasource for your cakephp application.

CakePHP IMAP Custom Datasource

Custom datasource for CakePHP (2.x) to interact with your mail server with IMAP functionality.

Go to GitHub repo where I put my codes. Download the ImapSource.php datasource file and place it in your app/Model/Datasource directory and just setup like the following.


class CustomEmail extends AppModel
    // Important:
    public $useDbConfig = 'myCustomEmail';
    public $useTable = false;

    // Whatever:
    public $displayField = 'subject';
    public $limit = 10;

    // Semi-important:
    // You want to use the datasource schema, and still be able to set
    // $useTable to false. So we override Cake's schema with that exception:
    function schema($field = false)
        if (!is_array($this->_schema) || $field === true) {
            $db =& ConnectionManager::getDataSource($this->useDbConfig);
            $db->cacheSources = ($this->cacheSources && $db->cacheSources);
            $this->_schema = $db->describe($this, $field);
        if (is_string($field)) {
            if (isset($this->_schema[$field])) {
                return $this->_schema[$field];
            } else {
                return null;
        return $this->_schema;


Now you need to define credentials in your app/Config/Database.php with the following code.


    public $myCustomEmail = array(
        'datasource' => 'ImapSource',
        'server' => 'YourIMAPServerHost',
        'username' => 'IMAPServerUsername',
        'password' => 'yourIMAPPassword',
        'port' => 'IMAPServerPort',
        'ssl' => true,
        'encoding' => 'UTF-8',
        'error_handler' => 'php',
        'auto_mark_as' => array(
            // 'Answered',
            // 'Flagged',
            // 'Deleted',
            // 'Draft',


Now from your controller just access your email like below:

// app/Controller/MailsController.php

//your controller codes ...
public function index()
  $emails = $this->CustomEmail->find('first');
  var_dump($emails); die();

Now you will get the email. See the debug output. If you have any question please feel free to write comment here. Thanks.

Shaharia is a professional software engineer with more than 10 years of experience in the relevant fields. Digital ad certified, cloud platform architect, Big data enthusiasts, tech early adopters.