Pustaka IMAP PHP untuk membaca dan memproses email melalui protokol IMAP, dibangun dengan arsitektur Berorientasi Objek yang kuat.
Pustaka ini memerlukan PHP >= 8.3 dengan ekstensi IMAP, iconv, dan Multibyte String terpasang.
Cara yang disarankan untuk menginstal perpustakaan IMAP adalah melalui Komposer:
$ komposer memerlukan ddeboer/imap
Perintah ini mengharuskan Anda menginstal Komposer secara global, seperti yang dijelaskan dalam bab instalasi dokumentasi Komposer.
gunakan DdeboerImapServer;$server = new Server('imap.gmail.com');// $connection adalah turunan dari DdeboerImapConnection$connection = $server->authenticate('my_username', 'my_password');
Anda dapat menentukan port, flag, dan parameter ke server:
$server = Server baru($nama host, // diperlukan$port, // defaultnya adalah '993'$flags, // defaultnya adalah '/imap/ssl/validate-cert'$parameters);
Ambil kotak surat (juga dikenal sebagai folder surat) dari server surat dan ulangi kotak surat tersebut:
$mailboxes = $connection->getMailboxes();foreach ($mailboxes as $mailbox) {// Lewati kotak surat khusus container// @lihat https://secure.php.net/manual/en/function.imap-getmailboxes .phpif ($kotak surat->getAttributes() & LATT_NOSELECT) {lanjutkan; }// $mailbox adalah turunan dari DdeboerImapMailboxprintf('Kotak surat "%s" memiliki %s pesan', $mailbox->getName(), $mailbox->count()); }
Atau ambil kotak surat tertentu:
$kotak surat = $koneksi->getMailbox('INBOX');
Menghapus kotak surat:
$koneksi->deleteMailbox($kotak surat);
Anda dapat mengatur secara massal, atau menghapus, semua tanda pesan kotak surat (menurut UID):
$kotak surat->setFlag('Dilihat Ditandai', ['1:5', '7', '9']);$kotak surat->setFlag('Dilihat', '1,3,5,6: 8');$kotak surat->clearFlag('Ditandai', '1,3');
PERINGATAN Anda harus mengambil contoh Pesan baru jika terjadi modifikasi massal tanda untuk menyegarkan tanda Pesan tunggal.
Ambil pesan (email) dari kotak surat dan ulangi:
$messages = $mailbox->getMessages();foreach ($messages as $message) {// $message adalah turunan dari DdeboerImapMessage}
Untuk menyisipkan pesan baru (yang baru saja terkirim) ke dalam kotak surat Terkirim dan menandainya seperti terlihat:
$kotak surat = $koneksi->getMailbox('Terkirim');$kotak surat->addMessage($messageMIME, 'Seen');
Perhatikan bahwa pesan harus berupa string dengan format MIME (seperti yang dijelaskan dalam RFC2045).
gunakan DdeboerImapSearchExpression; gunakan DdeboerImapSearchEmailTo; gunakan DdeboerImapSearchTextBody;$search = new SearchExpression();$search->addCondition(new To('[email protected]'));$search->addCondition(new Body('contents')) ;$pesan = $kotak surat->getMessages($pencarian);
PERINGATAN Saat ini kami tidak dapat meloloskan spasi dan tanda kutip ganda secara bersamaan. Hanya spasi yang saat ini di-escape dengan benar. Anda dapat menggunakan DdeboerImapSearchRawExpression
untuk menulis sendiri kondisi pencarian lengkap.
Pesan juga dapat diambil dengan diurutkan sesuai fungsi imap_sort:
$hari ini = new DateTimeImmutable();$thirtyDaysAgo = $today->sub(new DateInterval('P30D'));$messages = $mailbox->getMessages(new DdeboerImapSearchDate Since($thirtyDaysAgo),SORTDATE, // Sortir kriteriabenar // Urutan menurun);
Perhatikan bahwa perpustakaan imap PHP bergantung pada perpustakaan c-client
yang tersedia di https://www.washington.edu/imap/ yang tidak sepenuhnya mendukung beberapa kriteria pencarian IMAP4 seperti OR
. Jika Anda menginginkan kriteria yang tidak didukung tersebut, Anda perlu melakukan patch secara manual ke versi terbaru ( imap-2007f
tanggal 23-Jul-2011 pada saat penerapan ini) dan mengkompilasi ulang PHP ke pustaka c-client
Anda yang telah di-patch.
Omong-omong, sebagian besar kriteria pencarian umum tersedia dan berfungsi, jelajahi kriteria tersebut di ./src/Search
.
Referensi:
https://stackoverflow.com/questions/36356715/imap-search-unknown-search-criterion-or
imap-2007f.tar.gz: ./src/c-client/mail.c
dan ./docs/internal.txt
Dapatkan nomor pesan dan id pesan unik dalam bentuk <...>:
$pesan->getNumber();$pesan->getId();
Dapatkan properti pesan lainnya:
$pesan->getSubject();$pesan->getFrom(); // PesanEmailAlamat$pesan->getTo(); // array dari MessageEmailAddress$message->getDate(); // DateTimeImmutable$message->isAnswered();$message->isDeleted();$message->isDraft();$message->isSeen();
Dapatkan header pesan sebagai objek DdeboerImapMessageHeaders:
$pesan->getHeaders();
Dapatkan isi pesan sebagai HTML atau teks biasa (hanya bagian pertama):
$pesan->getBodyHtml(); // Isi bagian teks/html, jika ada$message->getBodyText(); // Isi teks/bagian biasa, jika ada
Dapatkan tubuh lengkap (semua bagian):
$tubuh = $pesan->getCompleteBodyHtml(); // Isi dari bagian teks/html, if presentif ($body === null) { // Jika isi adalah null, maka tidak ada bagian HTML, jadi mari kita coba mendapatkan teks body$body = $message->getCompleteBodyText() ; // Isi teks/bagian biasa, jika ada}
Membaca isi pesan membuat pesan tetap tidak terlihat. Jika Anda ingin menandai pesan sebagai terlihat:
$pesan->markAsSeen();
Atau Anda dapat mengatur, atau menghapus, tanda apa pun:
$message->setFlag('Seen Flagged');$message->clearFlag('Flagged');
Memindahkan pesan ke kotak surat lain:
$kotak surat = $koneksi->getMailbox('kotak surat lain');$pesan->pindah($kotak surat);
Menghapus pesan:
$kotak surat->getMessage(1)->hapus();$kotak surat->getMessage(2)->hapus();$koneksi->penghapusan();
Dapatkan lampiran pesan (baik sebaris maupun terlampir) dan ulangi lampiran tersebut:
$attachments = $message->getAttachments();foreach ($attachments as $attachment) {// $attachment adalah turunan dari DdeboerImapMessageAttachment}
Unduh lampiran pesan ke file lokal:
// getDecodedContent() mendekode konten lampiran secara otomatis:file_put_contents('/my/local/dir/' . $attachment->getFilename(),$attachment->getDecodedContent() );
Periksa apakah lampiran adalah pesan yang disematkan dan dapatkan:
$attachments = $message->getAttachments();foreach ($attachments as $attachment) {if ($attachment->isEmbeddedMessage()) {$embeddedMessage = $attachment->getEmbeddedMessage();// $embeddedMessage adalah turunan dari DdeboerImapMessageEmbeddedMessage } }
EmbeddedMessage memiliki API yang sama dengan Pesan normal, selain dari tanda dan operasi seperti menyalin, memindahkan, atau menghapus.
Ekstensi IMAP menyediakan fungsi imap_timeout untuk menyesuaikan detik batas waktu untuk berbagai operasi.
Namun penerapan ekstensi tidak menghubungkan fungsionalitas tersebut ke konteks atau koneksi tertentu, melainkan bersifat global. Jadi agar tidak mempengaruhi fungsionalitas di luar perpustakaan ini, kami harus memilih apakah menggabungkan setiap panggilan imap_*
dengan batas waktu opsional yang disediakan pengguna atau menyerahkan tugas ini kepada pengguna.
Karena dunia server IMAP yang heterogen dan beban kompleksitas yang tinggi karena keuntungan yang kecil dari server IMAP, kami memilih opsi kedua.
Mockability diberikan oleh antarmuka yang ada untuk setiap API. Gali MockabilityTest untuk melihat contoh alur kerja tiruan.
Docker diperlukan untuk menjalankan build di komputer Anda.
Perintah pertama yang perlu Anda jalankan adalah make start-imap-server
, yang memulai server IMAP secara lokal.
Kemudian build lokal dapat dipicu dengan make
kosong.
Ketika Anda menyelesaikan pengembangan, hentikan server IMAP lokal dengan make stop-imap-server
.