Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Cara aman untuk mengirim email melalui PHP ke banyak pengguna

Tidak ada alasan mengapa Anda tidak bisa menulisnya dalam PHP, meskipun saya tidak menjadikannya bagian dari proses permintaan web/HTTP. Saya telah berhasil menerapkan untuk memberi atau menerima 500.000 pelanggan per surat (tergantung pada data lokal yang tersedia, karena ini adalah proyek khusus lokasi). Itu adalah proyek internal, jadi sayangnya tidak ada kode/paket untuk Anda, tetapi beberapa petunjuk yang saya temukan:

Menyiapkan pengiriman

  • Dimulai dengan phpmailer itu sendiri, untuk mengurus pemformatan, penyandian konten dan header, penambahan lampiran, dll. Bagian itu berfungsi dengan baik, dan saya tidak ingin menulisnya dari awal.
  • 'Pengiriman' email itu sendiri hanyalah mengatur beberapa tanda dalam database apakah / bagaimana / apa yang harus dikirim ke (sebagian) pelanggan.
  • Setelah flag ini disetel, secara otomatis akan diambil oleh cronjob, tidak ada lagi server web yang terlibat.
  • Saya memulai dengan database yang sangat tercemar dengan jutaan alamat email, yang banyak jelas tidak valid, jadi hal pertama adalah memvalidasi semua alamat email untuk format, kemudian untuk Host:
    • filter_var($email, FILTER_VALIDATE_EMAIL); lebih dari pelanggan (dan menyimpan hasilnya jelas) menyingkirkan beberapa ratus ribu email tidak valid pertama.
    • Memisahkan host (dan menyimpan nama host) dari email, dan memvalidasinya (apakah memiliki MX atau setidaknya catatan A dalam DNS, tetapi perlu diingat:Anda dapat mengirim email ke alamat IP [email protected][255.255.255.255] , jadi pertahankan yang valid)) singkirkan porsi yang lebih baik. Alamat email di sini bukan dinonaktifkan secara permanen, tetapi dengan tanda status yang menunjukkan bahwa mereka dinonaktifkan karena nama domain / ip.
    • Skrip diubah menjadi wajib alamat email yang valid saat berlangganan / sebelum penyisipan, omong kosong 'Anda tidak akan mendapatkan contoh@ sqldat.com ' langganan-polusi dalam database benar-benar konyol.
  • Sekarang saya mendapatkan daftar alamat email yang berpotensi valid. Pada dasarnya ada 3 cara untuk mendeteksi alamat yang tidak valid (perlu diingat, semua bisa bersifat sementara):
    • Mereka langsung ditolak oleh server.
    • Server yang ditentukan sebelumnya tidak mendengarkan lalu lintas.
    • Mereka terpental lama setelah Anda mengira Anda mengirimkannya.
  • Aneh, pantulan, yang tampaknya memiliki format lain untuk setiap server email dan awalnya sangat sulit untuk diurai, akhirnya cukup mudah ditangkap menggunakan VERP . Daripada menguraikan seluruh email, alamat email khusus (sebut saja [email protected] ) dikonfigurasi untuk kemudian dikirim ke kotak surat, untuk menyalurkannya melalui perintah, dan jika kami mengirim email ke [email protected] , Return-Path telah ditetapkan untuk [email protected] . Mudah diuraikan pada tanda terima, dan setelah berapa banyak pantulan (kotak surat tidak dapat ada, kotak surat mungkin penuh (ya, masih!), dll.) Anda menyatakan alamat email tidak dapat digunakan terserah Anda.
  • Sekarang, penolakan langsung oleh server. Mungkin kami dapat mengonfigurasi dengan benar beberapa MTA dan/atau menulis plugin untuk itu, tetapi karena email sensitif terhadap waktu, dan kami harus memiliki kontrol mutlak yang dapat dikonfigurasi per pengiriman selama waktu pengiriman terakhir yang dapat digunakan (setelah itu email tidak lagi menarik bagi pengguna), pelambatan per server penerima, dan umumnya semuanya, akan membutuhkan waktu yang hampir bersamaan untuk menulis surat dalam PHP yang kami tahu lebih baik, yang menggunakan protokol SMTP langsung ke soket 25 di server penerima. Dengan sedikit usaha kemungkinan transportasi lain maka pilihan default di PHPMailer sudah built-in. Protokol SMTP sebenarnya cukup sederhana, tetapi ada beberapa peringatan:
    • Banyak server penerima menerapkan Daftar Abu-abu:kebanyakan robot spam tidak akan terlalu peduli jika email tertentu tiba, mereka hanya mengeluarkannya. Jadi, jika pengirim yang tidak dikenal / belum dipercaya mengirim email, itu akan ditolak sementara. Tangkap itu (biasanya kode 451), dan tempatkan email dalam antrean untuk dicoba lagi nanti.
    • Server surat, terutama dari ISP yang lebih besar dan layanan gratis (gmail, hotmail/msn/live, dll.) tidak akan mendukung semburan surat tanpa melawan:setelah beberapa ratus / ribu pertama, mereka mulai menolak Anda. Lebih lanjut tentang itu nanti.

Mendapatkan kecepatan

  • Sekarang, kami memiliki sistem pengiriman yang berfungsi, tetapi harus cepat . Mengirim 10.000 email dalam satu jam tidak masalah jika Anda hanya memiliki 10.000 alamat untuk dikirim, tetapi minimum yang kami butuhkan adalah sekitar 200.000 per jam. Awalnya adalah server khusus (yang sebenarnya bisa sangat bertenaga rendah, apa pun yang Anda lakukan, sebagian besar waktu yang dibutuhkan dalam pengiriman email ada di jaringan, bukan di server Anda).
  • Caching IP:ingat semua IP yang kami minta dari nama host di alamat email? Kami menyimpannya dengan jelas, dan mencari IP mereka lagi dan lagi menyebabkan jeda yang cukup besar. Namun, IP dapat berubah:catatan DNS di sana, MX lain di tempat lain... data menjadi cepat basi. Sebagian besar waktu server tidak benar-benar mengirim apa pun (buletin berlangganan datang meledak jelas), cronjob prioritas rendah sedang berjalan memeriksa semua nama host dengan IP basi (kami memilih yang lebih lama dari 1 hari sebagai basi) untuk alamat IP , termasuk yang sebelumnya tidak ada (domain baru didaftarkan setiap saat, jadi mengapa domain tidak tersedia sehari setelah seseorang dengan antusias berlangganan dengan alamat email barunya? Atau masalah server dengan beberapa domain terpecahkan, dll.). Sebenarnya mengirim email sekarang tidak memerlukan pencarian domain lagi.
  • Penggunaan kembali koneksi SMTP:menyiapkan koneksi ke server membutuhkan sebagian besar waktu untuk mengirim email saat Anda berbicara langsung ke port 25. Anda tidak perlu menyiapkan koneksi baru untuk setiap email, Anda hanya dapat mengirim berikutnya melalui koneksi yang sama. Sedikit jejak-dan-kesalahan telah menghasilkan pengaturan default di sini menjadi sekitar 50 email per koneksi (dengan asumsi Anda memiliki banyak atau lebih untuk domain). Namun, pada kegagalan alamat email menutup dan membuka kembali koneksi untuk mencoba lagi terkadang membantu. Secara keseluruhan, ini benar-benar membantu mempercepat segalanya.
  • Beberapa yang jelas, sangat jelas sehingga saya hampir lupa menyebutkannya:akan sia-sia jika harus membuat badan email di tempat:jika itu surat umum, siapkan badan (saya agak mengubah PHPMailer menjadi dapat menggunakan email yang di-cache), mungkin beberapa hari sebelumnya (jika Anda tahu Anda akan mengirim email pada hari Jumat, dan server Anda tidak bekerja, mengapa tidak menyiapkannya pada hari Rabu? Jika dipersonalisasi, Anda masih bisa menyiapkannya terlebih dahulu dengan waktu yang cukup, jika tidak, setidaknya siapkan porsi yang tidak dipersonalisasi.
  • Beberapa proses. Apakah saya menyebutkan banyak waktu yang diperlukan untuk mengirim email dihabiskan di jaringan? Satu proses pengiriman surat hampir tidak mendapatkan hasil maksimal dari server email Anda, beban yang hampir tidak terlihat dan surat-surat mengalir keluar. Bermain-main dengan sejumlah proses yang mengirimkan bagian antrian yang berbeda untuk melihat apa yang tepat untuk server/koneksi Anda, tetapi ingat 2 hal yang sangat penting:
    • Proses yang berbeda membuat Anda sangat rentan terhadap kondisi balapan:sangat yakin Anda memiliki sistem fullproof yang tidak akan pernah mengirim surat yang sama dua kali (tiga kali, bahkan lebih). Tidak hanya sangat mengganggu pengguna, spam Anda juga meningkat.
    • Simpan domain jika memungkinkan:memilih secara acak dari antrean, Anda akan kehilangan keuntungan dari menjaga koneksi tetap terbuka ke server yang menerima email untuk domain tersebut.

Menghindari penolakan

  • Anda akan mengirim banyak surat. Itulah yang spammer lakukan. Namun, Anda tidak ingin dilihat sebagai spammer (bagaimanapun juga, bukan)? Ada sejumlah mekanisme yang akan meningkatkan kepercayaan Anda terhadap server penerima secara menyeluruh:
  • Memiliki DNS balik yang tepat:proses pemeriksaan DNS milik IP yang mengirim email seperti itu sangat banyak jika domain tingkat kedua cocok:apakah Anda mengirim email atas nama example.com ? Pastikan DNS balik server Anda seperti somename.example.com .
  • Publikasikan data SPF untuk domain Anda:tunjukkan secara eksplisit bahwa mesin yang digunakan untuk mengirim email massal Anda diizinkan &diharapkan mengirim email dengan header From / Return-Path tersebut.
  • ingat penolakan :server tidak suka memberi tahu Anda berulang kali bahwa alamat email yang berbeda tidak ada. Baik mekanisme otomatis, dan bahkan admin manusia, memblokir server kami saat kami bekerja melalui semua alamat email yang tidak divalidasi yang (tidak lagi) ada. Kami tidak menggunakan double opt-in sampai nanti, sehingga database tercemar dengan kesalahan ketik, orang-orang beralih IP dan dengan demikian alamat email, alamat email prank dan sebagainya. Pastikan untuk menangkap ketidakabsahan tersebut, dan diberikan cukup atau cukup kegagalan, berhenti berlangganan . Mereka tidak berguna bagi Anda, mereka memonopoli sumber daya, dan jika mereka benar-benar menginginkan Anda mengirim surat dan kotak surat tersedia nanti, mereka hanya perlu berlangganan kembali.
  • DKIM adalah mekanisme lain yang dapat meningkatkan kepercayaan Anda, tetapi karena kami belum menerapkannya (belum), saya tidak dapat memberi tahu Anda banyak tentang hal itu.
  • Data MX:beberapa server masih menyukainya jika server pengirim Anda juga merupakan server penerima untuk domain tersebut. Seperti pada saat itu, kami hanya memiliki 1 MX, dan karena server surat masih belum terlalu sibuk, kami menjulukinya sebagai server MX cadangan untuk domain tersebut. Server MX biasa tidak server yang mengirim langganan, karena sangat menjengkelkan diblokir sementara oleh server yang Anda coba kirimi email penting (klien, dll.) karena Anda sudah mengirim banyak email yang kurang penting. Itu memang memiliki preferensi tertinggi sebagai menerima MX, tetapi jika gagal, kami mendapat bonus bagus bahwa server pengiriman langganan kami masih akan menjadi cadangan untuk pengiriman, jadi dalam krisis kami masih bisa mendapatkannya, mencegah bouncing yang canggung bagi pelanggan yang mencoba untuk menghubungi kami.
  • Beri tahu mereka tentang Anda. Dengan serius. Banyak pemain utama di alamat email gratis seperti live.com menawarkan Anda kesempatan untuk mendaftar dengan cara tertentu, atau memiliki beberapa titik kontak untuk mendapatkan bantuan &dukungan jika email Anda ditolak. Jika Anda memiliki alasan yang sah untuk mengirim begitu banyak email, dan dapat dipercaya bahwa Anda memiliki banyak pelanggan, kemungkinan besar mereka benar-benar meningkatkan jumlah email yang dapat Anda kirim ke server mereka per jam. 1.000 yang sedikit dapat menjadi sekitar sepuluh ribu atau bahkan lebih tinggi jika Anda cukup persuasif dan jujur. Mungkin ada kontrak, persyaratan yang harus Anda penuhi, dan janji yang harus Anda buat (dan pertahankan) agar diizinkan. ISP adalah merek yang terpisah, dan setiap pemain lain berbeda. Jangan repot-repot menelepon mereka biasanya, karena 99% dari waktu satu-satunya nomor yang dapat Anda temukan hanya akan memiliki orang yang mau memecahkan masalah koneksi internet Anda, yang mengerti (atau diizinkan) sedikit lagi. Sebuah [email protected] alamat email adalah tempat yang baik untuk memulai, tetapi lihat apakah Anda dapat menggali alamat email yang lebih langsung dari suatu tempat. Tepat, jujur, dan lengkap:kira-kira berapa banyak pelanggan Anda yang memiliki alamat email dengan ISP tersebut, seberapa sering Anda mencoba mengirimkannya, kesalahan atau penolakan apa yang Anda terima, bagaimana proses berlangganan &berhenti berlangganan, dan seperti apa layanan yang benar-benar Anda berikan kepada pelanggan mereka. Juga, bersikaplah baik:betapa pentingnya mengirim surat-surat itu untuk bisnis Anda, panik tentang hal itu dan mengklaim kerugian yang mengerikan tidak menjadi perhatian mereka. Pernyataan fakta dan keinginan yang sopan, dan bertanya apakah mereka dapat membantu daripada menuntut solusi akan sangat membantu.
  • Pembatasan:sebanyak yang Anda coba, beberapa server hanya akan menerima sejumlah email tertentu per jam dan/atau hari dari Anda. Pelajari angka-angka tersebut (kami tetap mencatat keberhasilan &kegagalan), setel ke default yang wajar untuk domain normal, setel ke batas yang disepakati untuk pemain yang lebih besar.

Menghindari ditandai sebagai spam

  • Aturan pertama:jangan spam!
  • Aturan kedua:selamanya! Bukan 'sekali off', bukan 'mereka belum berlangganan tapi ini mungkin kesepakatan seumur hidup bagi mereka', bukan dengan niat terbaik, orang harus meminta email Anda.
  • Jelas siapkan mekanisme langganan keikutsertaan ganda yang benar.
  • PHPMMailer menyetel headernya sendiri,
  • Siapkan mekanisme berhenti berlangganan yang mudah, melalui web (sertakan tautan ke dalamnya di setiap mail), mungkin juga email dan layanan pelanggan jika Anda memilikinya. Pastikan layanan pelanggan bisa berhenti berlangganan orang secara langsung.
  • Seperti yang dikatakan sebelumnya:berhenti berlangganan (berlebihan) gagal &terpental.
  • Hindari kata-kata 'kesepakatan seumur hidup' yang berisi spam.
  • Gunakan url di email Anda dengan hemat.
  • Hindari menambahkan tautan ke domain di luar kendali Anda, kecuali Anda benar-benar yakin dapat memercayai mereka bukan untuk spam, kalaupun begitu...
  • Berikan nilai kepada pengguna:ditandai sebagai spam oleh interaksi pengguna di klien webmail google/yahoo/live sangat merugikan keberhasilan di masa mendatang (pada catatan situs:jika Anda mendaftar untuk itu, live/msn/hotmail akan meneruskan semua email ke Anda dikirim oleh domain Anda yang ditandai sebagai spam oleh pengguna. Belajarlah untuk menyukainya, dan seperti biasa:berhenti berlangganan, mereka jelas tidak menginginkan mal Anda dan merusak peringkat spam Anda).
  • Pantau daftar hitam untuk IP Anda. Jika Anda muncul di salah satu dari itu, selamat tinggal, jadi segera lakukan tindakan membersihkan nama Anda dan menentukan kasus diperlukan.

Mengukur tingkat keberhasilan

  • Dengan seluruh proses di bawah kendali Anda, Anda cukup yakin bahwa email tersebut berakhir di suatu tempat (walaupun itu bisa berupa bitbucket MX atau folder spam), atau Anda gagal login &alasannya. Itu menangani nomor 'benar-benar disampaikan'.
  • Beberapa orang akan mencoba meyakinkan Anda untuk menambahkan tautan ke gambar online ke email Anda (baik yang asli atau gif transparan 1x1 yang terkenal) untuk mengukur berapa banyak orang yang benar-benar membaca email Anda. Karena persentase yang tinggi memblokir gambar-gambar itu, angka-angka ini paling tidak goyah, dan kami percaya bahwa kami tidak boleh mengganggu mereka, jumlah mereka sama sekali tidak dapat diandalkan.
  • Taruhan terbaik Anda untuk mengukur tingkat keberhasilan sebenarnya jauh lebih mudah jika Anda ingin pengguna melakukan sesuatu. Tambahkan parameter ke tautan dalam surat, sehingga Anda dapat mengukur berapa banyak pengguna yang tiba di situs yang Anda tautkan, apakah mereka melakukan tindakan yang diinginkan (menonton video, meninggalkan komentar, membeli barang).

Secara keseluruhan, dengan semua logging, antarmuka pengguna, pengaturan yang dapat dikonfigurasi per domain / email / pengguna, dll. Kami membutuhkan sekitar 1,5 bulan-orang untuk membangun &menghilangkan kebiasaan. Itu mungkin cukup investasi dibandingkan dengan outsourcing email, mungkin tidak, itu semua tergantung pada volume &bisnis itu sendiri.

Sekarang, biarkan api dimulai bahwa saya bodoh untuk menulis MTA di PHP, saya benar-benar menikmatinya (yang merupakan salah satu alasan saya menulis sejumlah besar teks ini), dan kemampuan logging &pengaturan yang sangat serbaguna, per-host peringatan berdasarkan persentase kegagalan dll. membuat hidup sangat mudah;)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. sql::perilaku SQLString

  2. Bagaimana mencegah duplikat nama pengguna saat orang mendaftar?

  3. Jenis/panjang kolom apa yang harus saya gunakan untuk menyimpan kata sandi hash Bcrypt dalam Database?

  4. Memperbarui dari MYSQL ke MYSQLI

  5. MySQL Pilih 7 hari terakhir