20

I'm trying to connect to Gmail through IMAP with PHP running in Apache. This is on an Ubuntu 9.04 system. I've got some sort of PHP configuration issue that is keeping this from working. First, here's what I did to setup IMAP for PHP:

sudo apt-get install libc-client2007b libc-client2007b-dev
sudo apt-get install php5-imap
sudo /etc/init.d/apache2 start

When I run phpinfo(), I get the following imap values:

IMAP c-Client Version: 2004
SSL Support: enabled
Kerberos Support: enabled

Here's my sample code:

<?php
$connect_to = '{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX';
$user = 'my gmail address';
$password = 'my gmail password';

$connection = imap_open($connect_to, $user, $password)
  or die("Can't connect to '$connect_to': " . imap_last_error());

imap_close($connection);
?>

When I execute this code, I get the following output:

Warning: imap_open() [function.imap-open]: Couldn't open stream {imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX in /var/www/clint/gmail/gmail.php on line 10
Can't connect to '{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX': TLS/SSL failure for imap.gmail.com: SSL context failed

Note that I can telnet to imap.gmail.com:993 from this computer. I can also hookup Evolution (mail reader) to Gmail through IMAP and fetch mail without problems. So, I don't think this is a firewall issue. I'm pretty sure I've got something in PHP not setup correctly.

Any ideas?

Clint Miller
  • 15,173
  • 4
  • 37
  • 39
  • NOTE: Author solved his problem in the discussion linked by Jordan, see http://groups.google.com/group/comp.lang.php/browse_thread/thread/241e619bc70a8bf4/bd3ae0c6a82409bc#e820c4fc3ee78ee3 – Henrik Opel Aug 23 '09 at 13:06
  • 2
    @Clint: Please answer or edit your own question according to the solution you found – Henrik Opel Aug 23 '09 at 13:14

10 Answers10

11

One more additional thing you need enabled in PHP, is the OpenSSL extension. It appears that the IMAP Client library (with SSL) depends on this.

It doesn't matter if Apache has the OpenSSL module enabled as this is processed/handled before the request is handed off to PHP.

The following discussion thread may help shed some light:

http://groups.google.com/group/comp.lang.php/browse_thread/thread/241e619bc70a8bf4/bd3ae0c6a82409bc?lnk=raot&pli=1

Jordan S. Jones
  • 13,703
  • 5
  • 44
  • 49
10

This has worked for me after a long effort:

$ServerName = "{imap.gmail.com:993/imap/ssl/novalidate-cert/norsh}Inbox";
Ben
  • 54,723
  • 49
  • 178
  • 224
Supriya
  • 101
  • 1
  • 4
  • Windows Ultimate x64, Apache 2.2, PHP 5.2.8: `{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX` works. – Ben Dec 29 '10 at 05:20
  • Windows Vista x64, Apache 2.2, PHP 5.2.8: `{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX` works. – Ben Dec 29 '10 at 05:21
8

I was facing same problem. I am using windows and wamp and my wamp "openSSl" extension is enabled.

I removed this issue by using following steps.I hope this will work for you too.

1) Logged in via browser to gmail account.

2) Open this url "https://www.google.com/settings/security/lesssecureapps"

3) Click at "turn on"

4) try following code

<?php

set_time_limit(4000);


// Connect to gmail
//$imapPath = '{imap.gmail.com:993/imap/ssl}INBOX';
$imapPath = '{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX';
$username = 'your-emai-address@gmail.com';
$password = 'Your-password';

// try to connect
$inbox = imap_open($imapPath,$username,$password) or die('Cannot connect to Gmail: ' . imap_last_error());
   /* ALL - return all messages matching the rest of the criteria
    ANSWERED - match messages with the \\ANSWERED flag set
    BCC "string" - match messages with "string" in the Bcc: field
    BEFORE "date" - match messages with Date: before "date"
    BODY "string" - match messages with "string" in the body of the message
    CC "string" - match messages with "string" in the Cc: field
    DELETED - match deleted messages
    FLAGGED - match messages with the \\FLAGGED (sometimes referred to as Important or Urgent) flag set
    FROM "string" - match messages with "string" in the From: field
    KEYWORD "string" - match messages with "string" as a keyword
    NEW - match new messages
    OLD - match old messages
    ON "date" - match messages with Date: matching "date"
    RECENT - match messages with the \\RECENT flag set
    SEEN - match messages that have been read (the \\SEEN flag is set)
    SINCE "date" - match messages with Date: after "date"
    SUBJECT "string" - match messages with "string" in the Subject:
    TEXT "string" - match messages with text "string"
    TO "string" - match messages with "string" in the To:
    UNANSWERED - match messages that have not been answered
    UNDELETED - match messages that are not deleted
    UNFLAGGED - match messages that are not flagged
    UNKEYWORD "string" - match messages that do not have the keyword "string"
    UNSEEN - match messages which have not been read yet*/

// search and get unseen emails, function will return email ids
$emails = imap_search($inbox,'UNSEEN');

$output = '';

foreach($emails as $mail) {

    $headerInfo = imap_headerinfo($inbox,$mail);

    $output .= $headerInfo->subject.'<br/>';
    $output .= $headerInfo->toaddress.'<br/>';
    $output .= $headerInfo->date.'<br/>';
    $output .= $headerInfo->fromaddress.'<br/>';
    $output .= $headerInfo->reply_toaddress.'<br/>';

    $emailStructure = imap_fetchstructure($inbox,$mail);
    //var_dump($emailStructure->parts);
    if(isset($emailStructure->parts)) {
         $output .= imap_body($inbox, $mail, FT_PEEK);
    } else {
        //    
    }
   echo $output;
   $output = '';
}

// colse the connection
imap_expunge($inbox);
imap_close($inbox);


?>

BEST OF LUCK. :)

Adnan Ahmad
  • 848
  • 1
  • 13
  • 12
3

had the same problem with personal domain on google apps. Problem was solved by changing application access to account. Simply follow by link and turn ON access to account.

2

Specific to Gmail's IMAP servers:

Google has started returning invalid certificates for TLSv13 connections which do not provide SNI hostname. This causes a regression when building php-imap extension against an upgraded OpenSSL (libssl) version. The issues have already been reported here:

The later is quite recent, and I've filed it to Ubuntu maintainers to make it visible to them and hopefully attract more eyes, since it affects Ubuntu Bionic which is a LTS version.

Please, vote and/or comment on them to give better visibility. Also remember: if you this answer useful and it is also upvoted enough, the above issues will get still more visibility.

In the meantime, looks like to me that the only workaround until the bug is fixed is to disable certificate validation by using the /novalidate-cert flag when calling imap_open(), which is a security risk.

amontero
  • 39
  • 3
1

Run your code from the command line and see if php spits our any other errors:

php -f gmail.php

On my Ubuntu I did:

sudo apt-get install php-imap

to install imap on php and the system installed: libc-client2007b mlock libc-client2007b mlock php-imap

Then how about uninstalling php5 and re-installing cleanly.

Siong Thye Goh
  • 3,518
  • 10
  • 23
  • 31
Derick Schoonbee
  • 2,971
  • 1
  • 23
  • 39
1
  1. First, enable less secure apps in your Gmail account: https://myaccount.google.com/lesssecureappsenter image description here

  2. Use this configuration to create IMAP connection:

    $imap_connection = imap_open('{imap.gmail.com:993/imap/ssl/novalidate-
    cert}INBOX', 'YOUR GMAIL USER', 'YOUR GMAIL PASSWORD');
    

Note: INBOX is your main imbox, for example you can acces to sent items with: INBOX.Sent in your connection.

Esteban
  • 25
  • 1
  • 6
0

Check your setup with phpinfo() and ensure you see --with-imap-ssl listed.

ayman
  • 1,341
  • 12
  • 22
  • I'm not building PHP myself. I've installed it with apt-get. All the blogs I've read indicate that if I do "apt-get install php5-imap" then it will work. Maybe I have to give up on that approach and compile PHP myself. I'll try that tonight. – Clint Miller Aug 14 '09 at 21:42
  • checking phpinfo() will tell you if SSL is enabled. It sounds like it may no longer be included by default. – TheJacobTaylor Aug 20 '09 at 04:57
  • You should have openssl in phpinfo (I believe that is what IMAP is using): openssl OpenSSL support enabled OpenSSL Version OpenSSL 0.9.7i 14 Oct 2005 – TheJacobTaylor Aug 20 '09 at 04:59
0

If you're still having issues with this on gmail, make sure to enable "Allow access for less secure apps" in your google accounts security settings page.

abdul01
  • 89
  • 3
  • He was having ssl issues, 6 years ago, not login issues. – Max Sep 24 '15 at 04:32
  • i was having a similar problem recently and even after trying all d solutions listed here it wasn't until when i enabled "Allow access for less secure apps" in my google accounts security settings page that d issue was resolved – abdul01 Sep 24 '15 at 10:04
0

I am Arvind Gondaliya, You are right but if Less secure area off then to get gmail mail.

user3076732
  • 88
  • 1
  • 8