POP ialah protokol yang agak lama. Versi pertama telah ditentukan pada tahun 1984. Versi yang masih digunakan hari ini, POP3, telah ditetapkan pada tahun 1996. Untuk mencubanya, saya menyambung ke pelayan POP3 Gmail.
Langkah pertama ialah mencari tetapan POP3 -- pelayan yang hendak disambungkan, pada port apa. Google membawa saya ke sini, di mana saya menemui maklumat berikut.
pop.gmail.com
Memerlukan SSL: Ya
Port: 995
Ia menyebut bahawa SSL diperlukan. Ini bukan perkara yang saya uruskan 25 tahun lalu, apabila kali terakhir saya bermain-main dengan POP. Saya takut ia akan menjadi sakit kepala, tetapi ia ternyata tidak mencabar apa-apa; dengan sedikit bantuan daripada dokumen Python, saya mencapai kod ini.
1 2 3 4 5 6 7 8 9 |
|
Ia menghubungkan dan memberitahu saya versi SSL yang sedang digunakan... atau sesuatu. Kejayaan besar! Masa untuk memulakan perbualan dengan pelayan.
Meminjam daripada RFC rasmi untuk POP3, berikut ialah contoh perbualan POP3 antara pelanggan dan pelayan/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Perkara pertama yang berlaku ialah pelayan menghantar ucapan kepada pelanggan. mesra. Jadi saya akan menambah kod untuk menerima mesej daripada pelayan.
Apabila anda meminta untuk menerima data daripada soket, anda perlu menentukan saiz penimbal. Dokumen mengesyorkan kuasa 2, seperti 4096. Banyak respons daripada pelayan akan datang serentak. Ada yang tidak; kadangkala mesej daripada pelayan akan dipecahkan merentasi bacaan pelayan, dan penimbal mungkin tidak diisi secara maksimum walaupun terdapat lebih banyak lagi yang akan datang.
Dalam kes POP3, cara untuk mengetahui sama ada mesej telah masuk sepenuhnya bergantung pada mesej yang akan masuk. Selalunya pelayan menghantar satu baris teks. (Seperti yang akan kita lihat semula kemudian, ini mempunyai watak pemulangan pengangkutan dan suapan baris pada penghujung setiap baris.) Mesej tertentu yang mungkin mempunyai respons yang lebih lama menggunakan cara lain untuk menunjukkan bahawa ia telah selesai: satu titik pada satu baris dengan sendirinya.
1 2 3 4 5 6 7 8 9 10 11 |
|
Lari lagi dan, kita dapat salam. Satu lagi kejayaan besar! Perhatikan bahawa baris berakhir dengan "rn" -- carriage return dan aksara suapan baris.
Anda perlu menghantar saiz penimbal kepada kaedah baca. Ia kemudiannya akan mempunyai penimbal saiz yang tersedia untuk membaca data daripada pelayan -- tetapi tiada jaminan tentang jumlah data yang akan masuk ke dalam penimbal pada satu-satu masa. Ini bermakna bahawa protokol memerlukan beberapa cara untuk menentukan apabila mesej selesai. Terdapat banyak strategi yang mungkin. POP menggunakan dua: untuk semua mesej, baris diakhiri dengan rn. Untuk mesej pendek (satu baris), ini sahaja yang diperlukan. Untuk respons berbilang baris, noktah pada baris dengan sendirinya menunjukkan bahawa mesej telah selesai.
1 2 |
|
Sekarang kita perlu mula bercakap kembali kepada pelayan. Masa untuk mencipta gelung I/O (atau O/I); dapatkan beberapa input pengguna dan hantar ke pelayan. Aduh! Saya tidak boleh menghantar rentetan secara langsung; yang memberi saya TypeError. Saya perlu menukar mesej kepada bait. Kaedah pengekodan rentetan() akan melakukannya (pengekodan lalai utf-8 berfungsi dengan baik).
Hanya, apabila saya menjalankannya -- op sekali lagi! Tiada apa-apa yang berlaku apabila mesej saya dihantar ke pelayan. Kerana saya terlupa bahawa mesej yang datang dari pelanggan juga perlu diakhiri dengan rn. Satu lagi tweak kecil memberi kami:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Bagus, sekarang saya sebenarnya boleh cuba log masuk!
1 2 3 4 5 6 |
|
OK, jadi mengikuti pautan itu membawa saya ke halaman di mana saya boleh menyediakan kata laluan khusus aplikasi. Satu halangan yang berpotensi yang saya temui: akaun anda perlu menghidupkan pengesahan dua faktor agar anda boleh membuat kata laluan khusus aplikasi, sejauh yang saya tahu. Mengapakah saya tidak menghidupkan pengesahan dua faktor pada tahun Lorde 2024 kita? Saya tidak boleh berkata. Saya lakukan sekarang.
Berbekalkan kata laluan khusus aplikasi (fikirkan anda keluarkan ruang), saya boleh log masuk! Kemudian saya akan mengeluarkan arahan STAT yang akan memberitahu saya berapa banyak mesej yang saya ada, dan saiz gabungannya. Selepas itu, saya akan mengeluarkan arahan LIST, yang akan mengembalikan senarai mesej dengan ID dan saiz untuk setiap satu.
1 2 3 4 5 6 7 8 9 10 |
|
Saya telah terkena pepijat dalam kod. Respons untuk LIST merangkumi berbilang baris dan, dalam kes ini, memerlukan berbilang bacaan penimbal. Seluruh mesej akan berakhir dengan noktah pada baris dengan sendirinya. Di sini saya telah menerima satu mesej yang bernilai penimbal, dan kini saya perlu menekan pulangan dan menghantar mesej kosong kepada pelayan agar kod itu maju ke lelaran gelung seterusnya dan membaca dari penimbal semula.
Saya akan mengubah suai kod supaya pengguna sentiasa mempunyai pilihan untuk membaca daripada penimbal semula atau tidak. Saya juga akhirnya akan menyahkod bait masuk daripada pelayan, supaya teks menjadi lebih bagus.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Dan berikut ialah sesi penuh termasuk mendapatkan semula e-mel dan menghantar mesej putus sambungan.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
|
Yet another great success! I was able to log in to the POP3 server and retrieve a message. The script in its current state is pretty flexible, but it requires a lot of work from the user. I'll make a few final tweaks to make interacting with the POP3 server a little easier: if the user starts a message to the server with a "!" it will be stripped out, but the script will read in data from the server until it gets to a period on a line by itself -- in other words, for commands with long responses. No "!" and the script will read in a single line, looking for the \r\n characters.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
|
Atas ialah kandungan terperinci Bercakap dengan POPerver Gmail dengan Python. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!