Google dropped the support of user/password authentication as of 30 may 2022.
imap_open can not be used anymore, without the support of xoauth2.
https://support.google.com/accounts/answer/6010255
There is a ToDo from 2020 that didn't make it.
https://wiki.php.net/todo/ext/imap/xoauth2
The only way is to switch to a third party lib. "php-imap"
This is so sad.imap_open
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
imap_open
Референца за `function.imap-open.php` со подобрена типографија и навигација.
imap_open
(PHP 4, PHP 5, PHP 7, PHP 8)
imap_open — Отвори IMAP поток до поштенско сандаче
= NULL
string
$mailbox,string
$user,string
$password,int
$flags = 0,int
$retries = 0,array
$options = []): IMAP\Connection|false
Отвора IMAP поток до mailbox.
Оваа функција може да се користи и за отворање потоци до POP3 and NNTP сервери, но некои функции и опции се достапни само на IMAP servers.
Параметри
mailbox-
Името на поштенското сандаче се состои од сервер и патека на поштенското сандаче на овој сервер. Специјалното име
INBOXзначи лично поштенско сандаче на тековниот корисник. Имињата на поштенските сандачиња што содржат меѓународни знаци освен оние во печатениот ASCII простор мора да бидат кодирани со imap_utf7_encode().Ги ескејпува специјалните знаци во стринг за употреба во SQL изјаваПроследувањето на недоверливи податоци на овој параметар е insecure, освен ако imap.enable_insecure_rsh е оневозможено.
Делот за серверот, кој е затворен во '{' и '}', се состои од името или IP адресата на серверот, опционален порт (претставен со ':'), и опционална спецификација на протоколот (претставен со '/').
Делот за серверот е задолжителен во сите параметри за поштенско сандаче.
Сите имиња што започнуваат со
{се оддалечени имиња, и се во форма"{" remote_system_name [":" port] [flags] "}" [mailbox_name]Интернетот домен име или IP адреса на серверот во загради.-
remote_system_nameопционален TCP порт број, стандардно е стандардниот порт за таа услуга -
portопционални знаменца, види следната табела. -
flagsоддалечено име на поштенско сандаче, стандардно е INBOX -
mailbox_nameОпционални знаменца за имиња
услуга за пристап до поштенско сандаче, стандардно е "imap" Знаменце = NULL /service=serviceоддалечено корисничко име за најавување на серверот /user=userremote user name for login on the server /authuser=userкорисник за далечинска автентикација; ако е наведено, ова е корисничкото име чијшто пасош се користи (на пр. администратор) /anonymousдалечински пристап како анонимен корисник /debugснимајте телеметрија на протоколот во дневникот за отстранување грешки на апликацијата /secureне пренесувајте лозинка во чист текст преку мрежата /imap,/imap2,/imap2bis,/imap4,/imap4rev1Со оглед на тоа што PHP не диктира специфична кодировка за низите, можеби ќе се запрашате како се кодираат литералите на низите. На пример, дали низата /service=imap/pop3Со оглед на тоа што PHP не диктира специфична кодировка за низите, можеби ќе се запрашате како се кодираат литералите на низите. На пример, дали низата /service=pop3/nntpСо оглед на тоа што PHP не диктира специфична кодировка за низите, можеби ќе се запрашате како се кодираат литералите на низите. На пример, дали низата /service=nntp/norshне користете rsh или ssh за воспоставување претходно автентицирана IMAP сесија /sslкористи Secure Socket Layerза шифрирање на сесијата/validate-certпотврди сертификати од TLS/SSL сервер (ова е стандардно однесување) /novalidate-certне потврдувај сертификати од TLS/SSL сервер, потребно ако серверот користи самопотпишани сертификати /tlsприсили употреба на start-TLSза шифрирање на сесијата и одбиј конекција со сервери што не ја поддржуваат/notlsне прави start-TLSза шифрирање на сесијата, дури и со сервери што ја поддржуваат/readonlyбарај отворање сандаче само за читање (само IMAP; игнорирано на NNTP и грешка со SMTP и POP3) -
user-
Корисничкото име
password-
Лозинката поврзана со
user flags-
На
flagsсе битна маска со една или повеќе од следниве:-
OP_READONLY- Отвори сандаче само за читање -
OP_ANONYMOUS- Не користи или ажурирај .newsrc за вести (само NNTP) -
OP_HALFOPEN- За IMAP and NNTP имиња, отвори врска, но не отворај сандаче. -
CL_EXPUNGE- Автоматски избриши го сандачето при затворање на сандачето (види исто така imap_delete() and imap_expunge()) -
OP_DEBUG- Преговори за протокол за отстранување грешки -
OP_SHORTCACHE- Краток (elt-само) кеширање -
OP_SILENT- Не проследувај настани (внатрешна употреба) -
OP_PROTOTYPE- Врати го прототипот на драјверот -
OP_SECURE- Не правете несигурна автентикација
-
retries-
Број на максимални обиди за поврзување
options-
Параметри за поврзување, следните (низи) клучеви може да се користат за поставување на еден или повеќе параметри за поврзување:
-
DISABLE_AUTHENTICATOR- Оневозможи својства за автентикација
-
Вратени вредности
Враќа IMAP\Connection инстанца при успех, или false при неуспех.
Дневник на промени
| Верзија | = NULL |
|---|---|
| 8.1.0 | Враќа IMAP\Connection инстанца сега; претходно, а resource . |
Примери
Пример #1 Различна употреба на imap_open()
<?php
// To connect to an IMAP server running on port 143 on the local machine,
// do the following:
$mbox = imap_open("{localhost:143}INBOX", "user_id", "password");
// To connect to a POP3 server on port 110 on the local server, use:
$mbox = imap_open ("{localhost:110/pop3}INBOX", "user_id", "password");
// To connect to an SSL IMAP or POP3 server, add /ssl after the protocol
// specification:
$mbox = imap_open ("{localhost:993/imap/ssl}INBOX", "user_id", "password");
// To connect to an SSL IMAP or POP3 server with a self-signed certificate,
// add /ssl/novalidate-cert after the protocol specification:
$mbox = imap_open ("{localhost:995/pop3/ssl/novalidate-cert}", "user_id", "password");
// To connect to an NNTP server on port 119 on the local server, use:
$nntp = imap_open ("{localhost:119/nntp}comp.test", "", "");
// To connect to a remote server replace "localhost" with the name or the
// IP address of the server you want to connect to.
?>Пример #2 imap_open() example
<?php
$mbox = imap_open("{imap.example.org:143}", "username", "password");
echo "<h1>Mailboxes</h1>\n";
$folders = imap_listmailbox($mbox, "{imap.example.org:143}", "*");
if ($folders == false) {
echo "Call failed<br />\n";
} else {
foreach ($folders as $val) {
echo $val . "<br />\n";
}
}
echo "<h1>Headers in INBOX</h1>\n";
$headers = imap_headers($mbox);
if ($headers == false) {
echo "Call failed<br />\n";
} else {
foreach ($headers as $val) {
echo $val . "<br />\n";
}
}
imap_close($mbox);
?>Белешки од корисници Пример #3 Ефект на редоследот кога се совпаѓаат повеќе кодови
To reply to "dsgvoseidank" saying it doesnt work anymore with Gmail :
As today 26 august 2022 it is still working but you need to use google parameters to generate a password for your app on a 2FA accountimap_open is very simple to use, but struggles a litte bit on setups with ssl and tls.
this are tested examples for different hosts and protocols.
uncomment the host/protocol line and fill in correct username and password.
Kay
<?php
#######
# localhost pop3 with and without ssl
# $authhost="{localhost:995/pop3/ssl/novalidate-cert}";
# $authhost="{localhost:110/pop3/notls}";
# localhost imap with and without ssl
# $authhost="{localhost:993/imap/ssl/novalidate-cert}";
# $authhost="{localhost:143/imap/notls}";
# $user="localuser";
# localhost nntp with and without ssl
# you have to specify an existing group, control.cancel should exist
# $authhost="{localhost:563/nntp/ssl/novalidate-cert}control.cancel";
# $authhost="{localhost:119/nntp/notls}control.cancel";
######
# web.de pop3 without ssl
# $authhost="{pop3.web.de:110/pop3/notls}";
# $user="[email protected]";
#########
# goggle with pop3 or imap
# $authhost="{pop.gmail.com:995/pop3/ssl/novalidate-cert}";
# $authhost="{imap.gmail.com:993/imap/ssl/novalidate-cert}";
# $user="[email protected]";
$user="username like above";
$pass="yourpass";
if ($mbox=imap_open( $authhost, $user, $pass ))
{
echo "<h1>Connected</h1>\n";
imap_close($mbox);
} else
{
echo "<h1>FAIL!</h1>\n";
}
?>One of the issues with gmail IMAP SSL authentication is related to Google's account security.
Once you get the login error once, sign out of all your google accounts. Then, visit this link:
http://www.google.com/accounts/DisplayUnlockCaptcha
Log in with the account you're attempting to access via imap.
Follow the steps and you'll then be able to login in to gmail with php imap.
It's visually shown here:
http://jeffreifman.com/filtered-open-source-imap-mail-filtering-software-for-php/configuring-gmail/Using:
<?php
imap_open( "{server.example.com:143}INBOX" , 'login' , 'password' );
?>
Got this error:
"Couldn't open stream {server.example.com:143}INBOX"
Solved by adding the flag "novalidate-cert":
<?php
imap_open( "{server.example.com:143/novalidate-cert}INBOX" , 'login' , 'password' );
?>
=DSubfolders of INBOX have to be seperate by dot like this: 'INBOX.test'
$mailbox = '{example.example.com:143/imap/novalidate-cert}INBOX.test'This code demonstrates features that are not well documented at this time. The main feature is that the selected mailbox in imap_open (or reopen) and the specified mailbox in other imap functions are unrelated. It has been tested with Gmail and with a Dovecot IMAP server. The mailbox separator depends on the server. Gmail: "/" Dovecot: "." If you want to test with Gmail, you need to turn on "Access for less secure apps" in your account.
<?php
// Change these.
$server = "{imap.gmail.com:993/imap/ssl/novalidate-cert}";
$email = "[email protected]";
$password = "password";
// The code assumes that the folders Test/Sub1/Sub11, etc. exist.
$selected = "{$server}Test/Sub1/Sub12";
$conn = imap_open($selected, $email , $password);
// This returns the $specified mailbox and its sub mailboxes,
// even if the $specified mailbox is outside the $selected mailbox.
$specified = "{$server}Test/Sub1";
$boxes = imap_list($conn, $specified , '*');
print_r($boxes);
// This appends the message in the $specified mailbox.
// It ignores the $selected mailbox.
imap_append($conn, $specified
, "From: [email protected]\r\n"
. "To: [email protected]\r\n"
. "Subject: test\r\n"
. "\r\n"
. "this is a test message, please ignore\r\n");
// This changes the $selected mailbox
$selected = "{$server}Test/Sub1";
imap_reopen($conn, $selected);
// This moves a message from the $selected to the $specified mailbox
// In this case, the specified mailbox does not include the server.
imap_mail_move ($conn , "1" , "Test");
imap_expunge($conn);
imap_close($conn);
// If you executed this code with a real IMAP server,
// the message is now in the Test mailbox !
?>Do not bother using "/debug" flag in $mailbox or OP_DEBUG in $options. They do not do anything.
When you set either one, the underlying IMAP c-client library will gather protocol debugging data and pass it back to PHP.
However, the debug handler defined by PHP is an empty function, it doesn't do anything.
So unless you're using a customized version of the IMAP extension that does something with that handler (mm_dlog), there is no point using "/debug" or OP_DEBUG.If you get Kerberos errors like:
« Notice: Unknown: Kerberos error: Credentials cache file '/tmp/krb5cc_0123' not found (try running kinit) ».
Try to add as a $param:
<?php array('DISABLE_AUTHENTICATOR' => 'GSSAPI') ?>
eg.
<?php
$imap_stream = imap_open('{mail.domain.tld:993/imap/ssl}' , 'username' , 'password', null, 1, array('DISABLE_AUTHENTICATOR' => 'GSSAPI'));
?>The error: Unknown: Mailbox is empty (errflg=1) in Unknown on line 0
appears when:
1) use imap_open to connect
2) then use imap_search ALL to retrieve emails
but there are no messages available. To avoid this error, check first the number of messages in a mailbox using imap_status. Only if there are messages available then you can use the imap_search.Function to test most of the possible options of a connection:
function imapConfig($options, $i=0, $till = array()) {
if(sizeof($options)==$i)
return $till;
if(sizeof($till)==0)
$till[] = '';
$opt = $options[$i];
$new = array();
foreach($till as $t) {
foreach($opt as $o) {
if(strlen($o)==0)
$new[] = $t;
else
$new[] = $t.'/'.$o;
}
}
return imapConfig($options, $i+1, $new);
}
function imap_test($server, $port, $dir, $username, $passw) {
$options = array();
//$options[] = array('debug');
$options[] = array('imap', 'imap2', 'imap2bis', 'imap4', 'imap4rev1', 'pop3'); //nntp
$options[] = array('', 'norsh');
$options[] = array('', 'ssl');
$options[] = array('', 'validate-cert', 'novalidate-cert');
$options[] = array('', 'tls', 'notls');
$configOptions = imapConfig($options);
foreach($configOptions as $c) {
$mbox = @imap_open("{".$server.":".$port.$c."}".$dir, $username, $passw);
echo "<b>{".$server.":".$port.$c."}".$dir."</b> ... ";
if (false !== $mbox) {
echo '<span style="color: green"> success</span>';
}
else {
echo '<span style="color: red"> failed</span>';
}
echo '<br>';
}
}
imap_test('mail.server.de', 143, 'INBOX', 'username', 'pwd');To authenticate using kerberos V / GSSAPI, you might need to add "user=" to the connection string.. eg:
$mbox = imap_open( "\{imap.example.com:143/imap/notls/user=" . $user . "}INBOX", $user, $passwd );
Our IMAP servers won't allow a user other than the user specified in the kerberos credentials connect using those credentials unless you specify that extra "user=" in the connection string. Passing it as an argument to imap_open() doesn't seem to be enough.imap_open will not open a stream if your server operates with Transport Layer Security (i.e. TLS) imap_open connects with SSL if its there. So try opening mailbox as
$mailbox="{mail.domain.com:143/imap/notls}";
or
$mailbox="{mail.domain.com:110/pop3/notls}"; This works...
Some mail server requires you to provide [email protected] so you can always use. [email protected]
$conn=imap_open($mailbox, $username, $password);
Some server may ask for username as "[email protected]"
:)For all imap functions where you specify the mailbox string it is important that you ALWAYS use IP (not hostname) and the portnumber. If you do not do this imap functions will be painfully slow.
Using hostname instead of IP adds 3 seconds to each IMAP call, not using portnumber adds 10 seconds to each imap call. (hint: use gethostbyname() )In order to make a IMAP connection to a Microsoft Exchange Server 5.5, I used this connection-string :
<?php
if(imap_open ("{192.168.1.6:143/imap}Inbox", "DOMAIN/USERNAME/ALIAS", "PASSWORD"))
{
echo 'Connection success!';
}
else
{
echo 'Connection failed';
}
?>
By replacing "Inbox" with, e.g. "Tasks", its possible to see all your tasks. I Hope this helps anybody!
RegardsYou can do
<? $foo = imap_errors(); ?>
to clear unwanted warning messages like 'Mailbox is empty'a little tip for those who get really frustrated even after reading all the right solutions and implementing them but still get the same errors or none at all..:
after having changed the code.. restart the httpd deamon..
for Fedora or any other Red Hat Linux OS (/etc/init.d/httpd restart).
After this you will be able to make a imap/pop3 stream from apache..I was receiving the following error while trying to add the /secure flag and verify that the /ssl flag was using TLS 1.2 instead of the very outdated SSL protocol:
PHP Request Shutdown: Can't do secure authentication with this server (errflg=2)
I ended up having to call my host to get help as there were literally only five pages in the search engines with the error. The mailbox configuration:
Before / incorrect / error:
<?php
$server_folder = '{mail.example.com:993/imap/ssl/secure}';
?>
After / correct / connected:
<?php
$server_folder = '{mail.example.com:993/ssl/imap/secure}';
?>
The /ssl and /imap flags were not in the correct order. Here is the thing, the flags listed above do NOT mention a strict chronological order of flags and are themselves no listed in the chronological order. So that right there is a bug report needed for the documentation though hopefully this comment will spare someone the aggravation for seemingly random errors. Good luck!``There is one thing I learned over the years,
if someone says: "it's not possible", prove them wrong.`` ~ Stefano Kocka '99
test date: 2022-11-20
php version: PHP 8.0.10 (cli)
extension=imap
extension=openssl
imap: IMAP c-Client Version => 2007f
SSL Support => enabled
https://support.google.com/accounts/answer/185833?hl=en
<?php
$cnx = '{imap.gmail.com:993/imap/ssl/readonly}';
$mbox = imap_open($cnx, '[email protected]', 'MyAppPassword');
$folders = imap_listmailbox($mbox, $cnx, '*');
print_r($folders);
/*
Array
(
[0] => {imap.gmail.com:993/imap/ssl/readonly}INBOX
[1] => {imap.gmail.com:993/imap/ssl/readonly}LABEL1
[2] => {imap.gmail.com:993/imap/ssl/readonly}LABEL2
[3] => {imap.gmail.com:993/imap/ssl/readonly}Queue
[4] => {imap.gmail.com:993/imap/ssl/readonly}[Gmail]/All
[5] => {imap.gmail.com:993/imap/ssl/readonly}[Gmail]/Drafts
[6] => {imap.gmail.com:993/imap/ssl/readonly}[Gmail]/Sent
[7] => {imap.gmail.com:993/imap/ssl/readonly}[Gmail]/Spam
[8] => {imap.gmail.com:993/imap/ssl/readonly}[Gmail]/Starred
[9] => {imap.gmail.com:993/imap/ssl/readonly}[Gmail]/Trash
)
*/
?>
Kind regards