Skip to main content

IMAP module for PHP in Mac OS X Mountain Lion

So here it comes again. I have recently upgraded to Mountain Lion and for whatever reason, Apple decided to nuked all my previous PHP (among other things) configurations so I have to setup IMAP in PHP again. A simple Google search may point you to this post with detailed instruction for Lion however, some steps have been changed a bit...

Step 1: Install prerequisites

You may choose to download Xcode (FREE) from the App Store then go to menu Xcode > menu item Preferences > tab Downloads, select to install Command Line Tools OR you can go to Apple Developer to get it, you may need to login.

Step 2: Compile IMAP

Get the IMAP source code from University of Washington website. Please do me a favor and check that website for the latest version, it's good practice. If you that lazy, try to click the "y" to get direct link to 2007f version.

Extract the package and open the Terminal to the new directory before executing these command:

  1. make osx EXTRACFLAGS="-arch i386 -arch x86_64 -g -Os -pipe -no-cpp-precomp"
  2. sudo mkdir /usr/local/include/
  3. sudo cp c-client/*.h /usr/local/include/
  4. sudo mkdir /usr/local/lib/
  5. sudo cp c-client/*.c /usr/local/lib
  6. sudo cp c-client/c-client.a /usr/local/lib/libc-client.a

(1) may take a while because the machine need to compile quite a few files for IMAP. Warnings are okie (I got 3 warnings) but if you see some error, that's not good. Please use some Google-fu to figure it out before continuing.
(2) and (4) may tell you the directory has already exists, that's okie and expected.

Step 3: Compile IMAP module for PHP

Following the instruction from PHP: Git Access page to get the source code of PHP. Please note that you should get the same version as the installed PHP engine. By default, Mountain Lion uses PHP 5.3.13 (check this by executing "php -v" in your Terminal).

Basically, you will need to execute 2 commands:
  1. git clone https://github.com/php/php-src.git php-src
  2. cd php-src
  3. git checkout PHP-5.3.13
(1) may take a long time depending on your internet connection because the repo is huge.
(2) will check out the branch for a specific PHP version, because my machine uses PHP 5.3.13, I choose the branch "PHP-5.3.13", switch it to match your system.

In order to compile the IMAP module, execute these commands:
  1. cd ext/imap/
  2. phpize
  3. ./configure --with-imap=/usr/local/imap-2007 --with-kerberos --with-imap-ssl
  4. make
  5. sudo cp modules/imap.so /usr/lib/php/extensions/no-debug-non-zts-20090626/
I don't know why Daniel (the author of the original instruction post) got problem compiling IMAP module for PHP (he said PCRE is missing). Probably the PHP shipped with Mountain Lion got PCRE already so the above 5 commands is all I need. Ivan pointed out that Mountain Lion is not shipped with PCRE so you will need to install it yourself.

Now you only need to modify the php.ini file to include the new imap.so module. Use your favourite editor to open the file /etc/php.ini (sudo is required to save it FYI), and add this at the end of the file:

; added IMAP module at
extension=/usr/lib/php/extensions/no-debug-non-zts-20090626/imap.so


Step 4: Enjoy

You are now good to go. Restart Apache as necessary using this: "sudo apachectl graceful".

That's it. Good luck!

Comments

  1. This comment has been removed by the author.

    ReplyDelete
  2. Hi Dao,

    a few things I noticed:
    - You are copying stuff directly into /usr/local/include and /usr/local/lib. Since the UW IMAP stuff was obviously not very well namespaced, that's a Bad Idea™. Consider copying stuff into /usr/local/imap-2007f/include and /usr/local/imap-2007f/lib.
    - "--with-imap" option is listed with two equals signs in your tutorial, which breaks down horribly.
    - PCRE is not installed by default on Mountain Lion. You probably installed it previously, or perhaps it was installed for you through MacPorts, Fink or some other way. I didn't have it.
    - You could perhaps fetch just a tarball snapshot generated by GitHub instead of cloning the entire repository.

    Here's what I came up, in form of a bash script.
    http://blog.vucica.net/2012/10/installing-imap-extension-for-php-on-mountain-lion.html
    Of course, everyone should check every line before running the script, and perhaps run it manually.

    Thanks for a great tutorial!

    ReplyDelete
  3. Thank you Ivan, I have updated the blog post.

    ReplyDelete
  4. I have a problem. I tried to upgrade php to the latest version and this imap file is missing so the installation fails: clang: error: no such file or directory: 'ext/imap/php_imap.o'

    I see there is a php_imap.lo but not a php_imap.o. The other files I see in the install log also have .o extensions but they are all there.

    ReplyDelete
  5. You may have encounter some error while building php_imap.o, check the output to find out the real culprit then?

    ReplyDelete
  6. After running this cmd : git checkout PHP-5.3.10 (as of my version)
    it says
    fatal: Not a git repository (or any of the parent directories): .git

    And running: cd ext/imap/
    it says: -bash: cd: ext/imap/: No such file or directory

    Any help?

    ReplyDelete
  7. @Shashank Duhan: you have to run `git clone` first. If the `git clone` command failed, you may need to read the message.

    ReplyDelete
  8. @Shashank Duhan: I saw the same behavior. Executing "git clone" created a "php-src" subdirectory within my current working directory. I found I had to cd into that "php-src" directory and then I could execute the subsequent "git checkout" command, you will also find ext/imap within the "php-src" directory. Seems like this would always be the case so perhaps the directions should be updated to include a "cd php-src" step, or at least a note mentioning to cd into the created directory, if the name isn't guaranteed to be "php-src".

    ReplyDelete
  9. I have updated the commands to include change directory. Sorry for any confusion.

    ReplyDelete

Post a Comment

Popular posts from this blog

Flutter: Fixing Firebase header not found with Notification Service Extension

If you follow the FCM tutorial Send an image in the notification payload and encountered this error message: 'FirebaseMessaging/FirebaseMessaging.h' file not found You are on the right place, I'm going to show you how to fix it. My app was working fine but one day it stopped compiling. Apparently Flutter 1.20 changed the way it uses CocoaPod so the service extension no longer has the proper library configured. After some tinkering, I came up with this pod config, it has to be added to ios/Podfile below the main Runner target. target 'FcmImage' do use_frameworks! use_modular_headers! require File.expand_path('../.symlinks/plugins/firebase_core/ios/firebase_sdk_version.rb', __FILE__) firebase_sdk_version = firebase_sdk_version! pod 'Firebase/Messaging', "~> #{firebase_sdk_version}" end FcmImage is my extension name, replace it with yours We can use a hardcoded version for Firebase/Messaging pod but doing so m...

OAuth with Google, Twitter and... Facebook!

This is sick! Just a few days ago, I ran into OAuth as I want to get my GMail feed based on Google Data API . I succeeded. With a little help of an OAuth open source ( here , available in several programming languages). Then I remember that I once heard that Twitter also uses OAuth as an authentication option so I turned into Twitter and had a good read. Finally, I found out that they are basically the same (hehe, it's obvious since OAuth 1.0 is a worldwide standard). I had an idea of writing a universal class which can handle both Google and Twitter OAuth functionalities. It's not too hard. I took most of the idea from the PHP example ( here , PHP only). I also made a small script which accepts URI to send and intercept response from Google & Twitter servers. At that moment, I was so excited with all the ideas but actually it has no real world benefit so I just left it there... Until today, in the F8 (says "fate") conference of Facebook, I was stunned fin...