PHP TutorialCompile PHP ExtensionsContributing to the PHP CoreContributing to the PHP ManualCreate PDF files in PHPInstalling a PHP environment on WindowsPHP Alternative Syntax for Control StructuresPHP APCuPHP Array iterationPHP ArraysPHP Asynchronous programmingPHP Autoloading PrimerPHP BC Math (Binary Calculator)PHP Built in serverPHP CachePHP Classes and ObjectsPHP ClosurePHP Coding ConventionsPHP Command Line Interface (CLI)PHP CommentsPHP Common ErrorsPHP Compilation of Errors and WarningsPHP Composer Dependency ManagerPHP ConstantsPHP Control StructuresPHP CookiesPHP CryptographyPHP DateTime ClassPHP DebuggingPHP Dependency InjectionPHP Design PatternsPHP Docker deploymentPHP Exception Handling and Error ReportingPHP Executing Upon an ArrayPHP File handlingPHP Filters & Filter FunctionsPHP Functional ProgrammingPHP FunctionsPHP GeneratorsPHP Headers ManipulationPHP How to break down an URLPHP How to Detect Client IP AddressPHP HTTP AuthenticationPHP Image Processing with GDPHP ImagickPHP IMAPPHP Installing on Linux/Unix EnvironmentsPHP JSONPHP LocalizationPHP LoopsPHP Machine learningPHP Magic ConstantsPHP Magic MethodsPHP Manipulating an ArrayPHP mongo-phpPHP Multi Threading ExtensionPHP MultiprocessingPHP MySQLiPHP MySQLi affected rows returns 0 when it should return a positive integerPHP NamespacesPHP Object SerializationPHP OperatorsPHP Output BufferingPHP Outputting the Value of a VariablePHP Parsing HTMLPHP Password Hashing FunctionsPHP PDOPHP PerformancePHP PHPDocPHP Processing Multiple Arrays TogetherPHP PSRPHP Reading Request DataPHP RecipesPHP ReferencesPHP ReflectionPHP Regular Expressions (regexp/PCRE)PHP Secure Remeber MePHP SecurityPHP Sending EmailPHP SerializationPHP SessionsPHP SimpleXMLPHP SOAP ClientPHP SOAP ServerPHP SocketsPHP SPL data structuresPHP SQLite3PHP StreamsPHP String formattingPHP String Parsing


From WikiOD

Connecting to a mailbox[edit | edit source]

To do anything with an IMAP account you need to connect to it first. To do this you need to specify some required parameters:

  • The server name or IP address of the mail server
  • The port you wish to connect on
    • IMAP is 143 or 993 (secure)
    • POP is 110 or 995 (secure)
    • SMTP is 25 or 465 (secure)
    • NNTP is 119 or 563 (secure)
  • Connection flags (see below)
Flag Description Options Default
/service=service Which service to use imap, pop3, nntp, smtp imap
/user=user remote user name for login on the server
/authuser=user remote authentication user; if specified this is the user name whose password is used (e.g. administrator)
/anonymous remote access as anonymous user
/debug record protocol telemetry in application's debug log disabled
/secure do not transmit a plaintext password over the network
/norsh do not use rsh or ssh to establish a preauthenticated IMAP session
/ssl use the Secure Socket Layer to encrypt the session
/validate-cert certificates from TLS/SSL server enabled
/novalidate-cert do not validate certificates from TLS/SSL server, needed if server uses self-signed certificates. USE WITH CAUTION disabled
/tls force use of start-TLS to encrypt the session, and reject connection to servers that do not support it
/notls do not do start-TLS to encrypt the session, even with servers that support it
/readonly request read-only mailbox open (IMAP only; ignored on NNTP, and an error with SMTP and POP3)

Your connection string will look something like this:


Please note that if any of the characters in your connection string is non-ASCII it must be encoded with utf7_encode($string).

To connect to the mailbox, we use the imap_open command which returns a resource value pointing to a stream:

$mailbox = imap_open("{}", "username", "password");
if ($mailbox === false) {
    echo "Failed to connect to server";

Install IMAP extension[edit | edit source]

To use the IMAP functions in PHP you'll need to install the IMAP extension:

Debian/Ubuntu with PHP5

sudo apt-get install php5-imap
sudo php5enmod imap

Debian/Ubuntu with PHP7

sudo apt-get install php7.0-imap

YUM based distro

sudo yum install php-imap

Mac OS X with php5.6

brew reinstall php56 --with-imap

List all folders in the mailbox[edit | edit source]

Once you've connected to your mailbox, you'll want to take a look inside. The first useful command is imap_list. The first parameter is the resource you acquired from imap_open, the second is your mailbox string and the third is a fuzzy search string (* is used to match any pattern).

$folders = imap_list($mailbox, "{}", "*");
if ($folders === false) {
    echo "Failed to list folders in mailbox";
} else {

The output should look similar to this

    [0] => {}INBOX
    [1] => {}INBOX.Sent
    [2] => {}INBOX.Drafts
    [3] => {}INBOX.Junk
    [4] => {}INBOX.Trash

You can use the third parameter to filter these results like this:

$folders = imap_list($mailbox, "{}", "*.Sent");

And now the result only contains entries with .Sent in the name:

    [0] => {}INBOX.Sent

Note: Using * as a fuzzy search will return all matches recursively. If you use % it will return only matches in the current folder specified.

Finding messages in the mailbox[edit | edit source]

You can return a list of all the messages in a mailbox using imap_headers.

$headers = imap_headers($mailbox);

The result is an array of strings with the following pattern:


Here's a sample of what each line could look like:

A     1)19-Aug-2016 Message Subject (1728 chars)
D     2)19-Aug-2016 RE: Message Subject (22840 chars)
U     3)19-Aug-2016 RE: RE: Message Subject (1876 chars)
N     4)19-Aug-2016 RE: RE: RE: Message Subje (1741 chars)
Symbol Flag Meaning
A Answered Message has been replied to
D Deleted Message is deleted (but not removed)
F Flagged Message is flagged/stared for attention
N New Message is new and has not been seen
R Recent Message is new and has been seen
U Unread Message has not been read
X Draft Message is a draft

Note that this call could take a fair amount of time to run and may return a very large list.

An alternative is to load individual messages as you need them. Your emails are each assigned an ID from 1 (the oldest) to the value of imap_num_msg($mailbox).

There are a number of functions to access an email directly, but the simplest way is to use imap_header which returns structured header information:

$header = imap_headerinfo($mailbox , 1);

stdClass Object
    [date] => Wed, 19 Oct 2011 17:34:52 +0000
    [subject] => Message Subject
    [message_id] => <04b80ceedac8e74$51a8d50dd$0206600a@user1687763490>
    [references] => <>
    [toaddress] => Some One Else <>
    [to] => Array
            [0] => stdClass Object
                    [personal] => Some One Else
                    [mailbox] => someonelse
                    [host] =>
    [fromaddress] => Some One <>
    [from] => Array
            [0] => stdClass Object
                    [personal] => Some One
                    [mailbox] => someone
                    [host] =>
    [reply_toaddress] => Some One <>
    [reply_to] => Array
            [0] => stdClass Object
                    [personal] => Some One
                    [mailbox] => someone
                    [host] =>
    [senderaddress] => Some One <>
    [sender] => Array
            [0] => stdClass Object
                    [personal] => Some One
                    [mailbox] => someone
                    [host] =>
    [Recent] =>  
    [Unseen] =>  
    [Flagged] =>  
    [Answered] =>  
    [Deleted] =>  
    [Draft] =>  
    [Msgno] =>    1
    [MailDate] => 19-Oct-2011 17:34:48 +0000
    [Size] => 1728
    [udate] => 1319038488