PHP Apacheで実行中)を使用してIMAP経由でGmailに接続しようとしています。これはUbuntu 9.04システム上にあります。ある種のPHPこれが機能しないようにする構成の問題最初に、PHPのIMAPをセットアップするために私がしたことは次のとおりです。
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
このコンピュータからimap.gmail.com:993にtelnetで接続できることに注意してください。 Evolution(メールリーダー)をIMAP経由でGmailに接続して、問題なくメールを取得することもできます。したがって、これはファイアウォールの問題ではないと思います。 PHPが正しくセットアップされていないので、何かを持っていると確信しています。
何か案は?
PHPで有効にする必要があるもう1つのことは、 OpenSSL拡張 です。 IMAPクライアントライブラリ(SSL対応)はこれに依存しているようです。
リクエストがPHPに渡される前に処理/処理されるため、ApacheでOpenSSLモジュールが有効になっているかどうかは関係ありません。
次のディスカッションスレッドは、いくつかの光を当てるのに役立ちます。
これは長い努力の後に私にとってうまくいきました:
$ServerName = "{imap.gmail.com:993/imap/ssl/novalidate-cert/norsh}Inbox";
私は同じ問題に直面していました。 Windowsと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);
?>
ベストオブラック。 :)
グーグルアプリの個人ドメインで同じ問題がありました。アプリケーションのアクセスをアカウントに変更することで問題が解決しました。単に リンクで に従い、アカウントへのアクセスをオンにします。
コマンドラインからコードを実行し、phpが他のエラーを吐き出すかどうかを確認します。
php -f gmail.php
私のUbuntuでは私がやった:
Sudo apt-get install php-imap
pHPにimapをインストールし、システムをインストールする場合:libc-client2007b mlock libc-client2007b mlock php-imap
次に、php5をアンインストールしてきれいに再インストールします。
GmailのIMAPサーバーに固有:
Googleは、SNIホスト名を提供しないTLSv13接続に対して無効な証明書を返し始めました。これにより、アップグレードされたOpenSSL(libssl)バージョンに対してphp-imap拡張機能をビルドするときに回帰が発生します。問題はすでにここで報告されています:
後者はごく最近のことであり、LTSバージョンであるUbuntu Bionicに影響を与えるため、Ubuntuのメンテナーに報告して、目に見えるようにして、より多くの人の目を引くようにしています。
より良い可視性を与えるために、それらに投票および/またはコメントしてください。また、この回答が役に立ち、十分に賛成されている場合は、上記の問題がさらに明確になります。
それまでの間、バグが修正されるまでの唯一の回避策は imap_open() を呼び出すときに/novalidate-cert
フラグを使用して証明書の検証を無効にすることであり、これはセキュリティリスクです。
まず、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はメインのimboxです。たとえば、接続でINBOX.Sentを使用して送信済みアイテムにアクセスできます。
Gmailでこれでも問題が解決しない場合は、Googleアカウントのセキュリティ設定ページで[安全性の低いアプリのアクセスを許可する]を有効にしてください。
phpinfo()
で設定を確認し、--with-imap-ssl
記載されています。