Surat sementara sendiri: bot telegram

Seringkali dengan alat dan kemampuan baru, ada keinginan untuk bereksperimen dan mengimplementasikan sesuatu yang tidak biasa, yang belum pernah saya lakukan sebelumnya. Gagasan untuk membuat layanan surat sementara saya dalam bentuk bot telegram bagi saya cukup menarik.

Sedikit latar belakang
Belum lama ini saya pindah dari hosting biasa ke VPS dan kebetulan setelah sebulan atau lebih, saya kembali harus pindah ke VPS lain. Dalam kedua kasus tersebut, saya memiliki paket tarif termurah dan Ubuntu 16.04. Karena terakhir kali pada saat itu saya menemukan terminal di universitas, yang sama saja dengan kurangnya pengalaman, saya menggunakan instruksi langkah-demi-langkah yang sangat baik dari DigitalOcean untuk mengkonfigurasi VPS saya (beberapa dari mereka telah diterjemahkan ke dalam bahasa Rusia untuk mereka yang, seperti saya, tidak cukup tahu bahasa Inggris). Dan ya, VPS pertama saya adalah pada DO, dan saya harus pindah lagi terutama karena bagian dari alamat IP-nya jatuh di bawah distribusi ILV. Setelah mengulangi prosedur pengaturan LAMP beberapa kali, saya terbiasa dengan terminal VPS sedikit dan, sebagai bagian dari pengembangan lebih lanjut, memutuskan untuk beralih ke eksperimen yang tidak biasa - untuk membuat layanan surat sementara saya sendiri, misalnya.

Saya sudah memiliki pengalaman di backend, khususnya dalam menciptakan bot telegram di PHP MySQL, tetapi untuk menerima email "sendiri" - sepertinya jauh dan tidak bisa dipahami. Setelah membuka beberapa tab dengan berbagai artikel tentang topik itu, saya menyadari bahwa saya tidak mengerti apa-apa. Di mana-mana diusulkan untuk menggunakan banyak alat yang berbeda, yang menurut saya lebih cocok untuk layanan email lengkap daripada untuk tugas menerima pesan email masuk di VPS.

Terima Kotak Masuk


Untuk langkah pertama, sebuah artikel dari kotak pasir banyak membantu saya: habr.com/en/post/260429 . Saya menarik peringkat negatifnya, tapi itu menggambarkan apa yang membuat saya tertarik. Saya ingin mendapatkan hasil yang saya bisa "rasakan" sesegera mungkin, dan dengan pemikiran "di masa depan saya akan melakukannya dengan benar" saya pergi untuk mengkonfigurasi sendmail.

Lalu saya mengatur domain. Catatan DNS:

example.com IN MX 5 mail.example.com
mail.example.com IN A XXX.XX.XXX.XXX (ip address VPS)

Di server, menambahkan baris @example.com vasya /etc/mail/virtusertable , dengan demikian menentukan bahwa semua email yang ditujukan untuk alamat di ****@example.com ditujukan ke Vasya.

Untuk memproses surat masuk dengan skrip php, tambahkan baris vasya: "|php -q /home/vasya/mail.php" ke file /etc/aliases vasya: "|php -q /home/vasya/mail.php" .

Setelah melakukan beberapa tes dan memastikan bahwa surat masuk diteruskan ke skrip php, saya bisa menangani prosesnya.

Menerima surat masuk mentah yang dikirim ke php dengan cara yang dijelaskan di atas diimplementasikan dalam kode dengan sangat sederhana:

 $msg = file_get_contents("php://stdin"); 

Masalah yang sama sekali berbeda adalah analisis format surat dan penyajian data dengan cara yang dapat dipahami dan diakses. Google menawarkan saya beberapa opsi tentang cara mem-parsing format email menggunakan PHP. Semua perpustakaan yang saya temukan terseret pada pemasangan komponen tambahan, tetapi salah satu dari mereka tampaknya kurang rumit: github.com/zbateson/mail-mime-parser . Satu-satunya hal yang saya perlukan untuk menginstal tambahan adalah pengelola paket populer untuk PHP - Composer. Tentu saja, saya tidak menjumpainya di hosting biasa, tetapi menginstalnya dan lebih lanjut menghubungkan perpustakaan untuk mem-parsing surat sama sekali tidak sulit.

Awal skrip php untuk memproses surat masuk menggunakan perpustakaan zbateson / mail-mime-parser terlihat seperti ini:

 <?php require("vendor/autoload.php"); use ZBateson\MailMimeParser\MailMimeParser; use ZBateson\MailMimeParser\Message; $msg = file_get_contents("php://stdin"); $parser = new MailMimeParser(); $message = Message::from($msg); 

Karena surat sementara menurut saya tidak melibatkan beberapa penerima, cukup hanya mengambil yang pertama dari yang mungkin:

 $to = $message->getHeader('To'); $email = $to->getAddresses()[0]->getEmail(); 

Dalam variabel $ email kami memiliki alamat penerima berupa vasyaorpetya@example.com.

Untuk menerima konten surat yang masuk di perpustakaan ada metode yang tepat:

 $from = $message->getHeader('From')->getEmail(); $subject = $message->getHeaderValue('Subject'); $msg_text = $message->getTextContent(); $msg_html = $message->getHtmlContent(); 

Bot telegram


Apa yang harus dilakukan bot email sementara telegram dulu?

  1. Terbitkan alamat email sementara baru berdasarkan permintaan
  2. Kirim pesan kotak masuk untuk surel ini sementara alamat surel valid
  3. Perbarui Alamat Email

Cara yang cukup cocok dalam hal ini dan banyak kasus lain untuk menerima pembaruan dari Telegram adalah dengan menggunakan Webhook. Hanya alamat skrip dengan https yang diperlukan. Menggunakan Certbot untuk mengonfigurasi sertifikat domain ssl dijelaskan secara rinci dalam instruksi DO.

Untuk berinteraksi dengan API Bot Telegram, saya menggunakan praktik terbaik saya sendiri. Seseorang lebih suka menggunakan perpustakaan populer. Mengirim pesan dengan tombol ke telegram telah lama menjadi hal yang biasa, karena banyak artikel telah ditulis.

Pembuatan alamat email sementara pada dasarnya adalah output dari alamat berikutnya secara berurutan. Saya membuat tabel untuk alamat email dalam database, di mana id bertipe int dengan kenaikan otomatis mengidentifikasi secara unik penerima. Konversi angka numerik menjadi alamat string dilakukan ketika angka diterjemahkan ke dalam sistem angka lain, di mana seluruh alfabet Latin tersedia sebagai "angka". 26 huruf dibandingkan dengan angka memberikan pengurangan panjang pengenal yang baik. Mungkin, saya juga bisa menggunakan huruf kapital, angka, dan beberapa karakter tanpa masalah untuk lebih jauh mengurangi panjang alamat yang dikeluarkan, tetapi saya hanya meninggalkan huruf Latin kecil.

Fungsi untuk menerjemahkan id numerik ke dalam string dan sebaliknya:

 // $alphabet = explode(",", "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z"); //   @grayfolk: $alphabet = range('a', 'z'); function num2str($n, $a) { // $a -  $b = count($a); $r = 0; $x = ""; while ($n) { $r = $n%$b; $n = ($n-$r)/$b; $x .= $a[$r]; } return strrev($x); } function str2num($s, $a) { $n = 0; $b = count($a); $s = strrev($s); for ($i = 0; $i < strlen($s); $i++) { $n += array_search($s[$i], $a) * pow($b, $i); } return $n; } 

Salah satu manfaat utama menggunakan layanan surat sementara adalah tidak adanya spam. Tetapi jika alamatnya berurutan, Anda bisa membuat daftar alamat terdekat yang akan dikeluarkan dan berhasil melakukan pengiriman. Untuk mengatasi masalah ini, saya menambahkan beberapa string acak ke ID penerima. Untuk membedakan antara id dan komponen acak di alamat, saya memutuskan untuk selalu memulai komponen acak dengan angka.

Kami menulis garis acak dari alamat email yang dikeluarkan dalam database bersama dengan id penerima, id pengguna dalam telegram dan waktu kotak surat dikeluarkan.

Tampaknya Anda bahkan tidak perlu menyimpan surat masuk - mereka mengirimnya ke telegram dan itu saja. Tapi bagaimana dengan huruf html? Mereka tidak dapat ditampilkan dalam pesan obrolan. Tetap merekam pesan html yang masuk dalam database dan menampilkannya di situs, dan mengirimkan tautan kepada pengguna yang menyertakan id pesan dan kata sandi yang dihasilkan berikutnya. Untuk membersihkan database dengan mahkota, skrip php diluncurkan sesuai dengan jadwal, yang menghapus pesan html masuk yang diterima lebih dari satu jam yang lalu.

Kemudian, di telegram bot, saya menambahkan tombol yang memperpanjang validitas kotak surat 10 atau 60 menit, serta tombol yang memungkinkan Anda mengetahui berapa banyak, bagaimanapun, ia harus hidup sebelum penerimaan pesan yang masuk dihentikan.

Karena kami berurusan dengan pengguna terdaftar dalam telegram, Anda dapat memberikan kesempatan untuk mengaktifkan kotak surat lama Anda, misalnya, untuk mengembalikan kata sandi yang terlupakan di situs web atau untuk operasi lain yang memerlukan konfirmasi melalui email. Kotak surat yang dikeluarkan "menerima" pesan masuk hanya ketika pengguna membutuhkannya, dan di lain waktu, kemungkinan spam diabaikan.



Wishlist untuk masa depan:

  • Buat versi web [selesai]
  • Siapkan perubahan cepat domain email dalam beberapa klik / perintah (bagaimana?)

Referensi


Bot Telegram: @tmpmailbot

Artikel yang menjelaskan konfigurasi sendmail

Pustaka PHP untuk parsing email

Source: https://habr.com/ru/post/id445988/


All Articles