Подтвердить что ты не робот

Подключение к Gmail через IMAP с использованием PHP-SSL

Я пытаюсь подключиться к Gmail через IMAP с PHP, работающим в Apache. Это находится на системе Ubuntu 9.04. У меня есть какая-то проблема с настройкой PHP, которая не позволяет этому работать. Во-первых, вот что я сделал для настройки IMAP для PHP:

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

Когда я запускаю phpinfo(), я получаю следующие значения imap:

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

Вот мой пример кода:

<?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);
?>

Когда я выполняю этот код, я получаю следующий вывод:

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

Обратите внимание, что я могу использовать telnet для imap.gmail.com:993 с этого компьютера. Я также могу подключить Evolution (mail reader) к Gmail через IMAP и получать почту без проблем. Итак, я не думаю, что это проблема межсетевого экрана. Я уверен, что у меня есть что-то в PHP, неправильно настроенное.

Любые идеи?

4b9b3361

Ответ 1

Еще одна дополнительная вещь, которую нужно включить в PHP, - это расширение OpenSSL. По-видимому, от этого зависит библиотека клиента IMAP (с SSL).

Не имеет значения, включен ли в Apache модуль OpenSSL, поскольку он обрабатывается/обрабатывается до того, как запрос передается на PHP.

Следующий поток обсуждений может помочь пролить свет:

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

Ответ 2

Это сработало для меня после долгих усилий:

$ServerName = "{imap.gmail.com:993/imap/ssl/novalidate-cert/norsh}Inbox";

Ответ 3

У меня была такая же проблема. Я использую окна и wamp, и расширение wamp openSSl включено.

Я удалил эту проблему, выполнив следующие шаги. Я надеюсь, что это тоже сработает для вас.

1) Вход в систему через браузер для учетной записи gmail.

2) Откройте этот url " https://www.google.com/settings/security/lesssecureapps"

3) Нажмите "Включить"

4) попробуйте выполнить код

<?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 = '[email protected]';
$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);


?>

ЛУЧШИЙ УДАЧ.:)

Ответ 4

была та же проблема с личным доменом в приложениях Google. Проблема была решена путем изменения доступа к учетной записи. Просто следуйте по ссылке и включите доступ к учетной записи.

Ответ 5

Запустите ваш код из командной строки и посмотрите, не выводит ли php наши другие ошибки:

php -f gmail.php

На своей Ubuntu я сделал:

sudo apt-get install php-imap

установить imap на php и установить систему: libc-client2007b mlock libc-client2007b mlock php-imap

Тогда как насчет удаления php5 и переустановки чисто.

Ответ 6

Проверьте настройки с помощью phpinfo() и убедитесь, что вы видите --with-imap-ssl.

Ответ 7

Если у вас все еще есть проблемы с этим в gmail, включите "Разрешить доступ для менее безопасных приложений" на странице настроек безопасности учетных записей google.

Ответ 8

  • Сначала включите менее безопасные приложения в своей учетной записи Gmail: https://myaccount.google.com/lesssecureapps введите описание изображения здесь

  • Используйте эту конфигурацию для создания соединения IMAP:

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

Примечание. INBOX - это ваш основной почтовый ящик, например, вы можете получить доступ к сообщениям с помощью: INBOX.Sent в вашем соединении.

Ответ 9

Специфично для серверов Gmail IMAP:

Google начал возвращать недействительные сертификаты для соединений TLSv13, которые не предоставляют имя хоста SNI. Это вызывает регресс при построении расширения php-imap для обновленной версии OpenSSL (libssl). О проблемах уже сообщалось здесь:

Последний довольно недавний, и я подал его в Ubuntu, чтобы надеяться привлечь больше глаз, так как это влияет на Ubuntu Bionic, который является версией LTS.

Пожалуйста, проголосуйте и/или прокомментируйте их, чтобы улучшить видимость. Также помните: если вам этот ответ полезен, и за него достаточно проголосовали, вышеупомянутые проблемы станут еще более заметными.

Между тем, мне кажется, что единственный обходной путь до исправления ошибки - отключить проверку сертификата с помощью /novalidate-cert при вызове imap_open(), что представляет угрозу безопасности.