rreeee
Saya cuba mencipta borang mel yang mudah. Borang itu sendiri terletak dalamindex.html
页面上,但它提交到一个单独的“感谢您的提交”页面thankyou.php
saya yang mempunyai kod PHP di atas tertanam di dalamnya. Kod diserahkan dengan sempurna, tetapi e-mel tidak pernah dihantar. Bagaimanakah saya boleh menyelesaikan masalah ini?
Walaupun beberapa bahagian jawapan ini hanya terpakai pada penggunaan fungsi
mail()
itu sendiri, banyak langkah penyelesaian masalah ini boleh digunakan pada mana-mana sistem mel PHP. 嗯>Terdapat beberapa sebab mengapa skrip anda mungkin tidak menghantar e-mel. Melainkan terdapat ralat sintaks yang jelas, sukar untuk mendiagnosis perkara ini. Jika tidak, anda perlu menyemak senarai semak di bawah untuk mencari sebarang kemungkinan perangkap yang mungkin anda hadapi.
Pastikan pelaporan ralat didayakan dan ditetapkan untuk melaporkan semua ralat
Pelaporan ralat adalah penting untuk menghapuskan pepijat dalam kod anda dan ralat umum yang dihadapi dengan PHP. Pelaporan ralat perlu didayakan untuk menerima ralat ini. Meletakkan kod berikut di bahagian atas fail PHP anda (atau dalam fail konfigurasi utama) akan membolehkan pelaporan ralat.
LihatBagaimana untuk mendapatkan mesej ralat yang berguna dalam PHP?—Jawapan iniuntuk butiran lanjut.
Pastikan untuk memanggil fungsi
mail()
Ini mungkin kelihatan bodoh, tetapi kesilapan biasa ialah terlupa untuk meletakkan
mail()
fungsi dalam kod anda. Pastikan ia ada dan tidak diulas.Pastikan untuk memanggil fungsi
dengan betulmail()
Fungsi mel mengambil tiga parameter yang diperlukan dan parameter keempat dan kelima pilihan. Jika panggilan anda ke
mail()
tidak mempunyai sekurang-kurangnya tiga hujah, ia akan gagal.Jika panggilan anda ke
mail()
tidak memberikan hujah yang betul dalam susunan yang betul, ia juga akan gagal.Semak log mel pelayan
Pelayan web anda harus log semua percubaan untuk menghantar e-mel melaluinya. Lokasi log ini berbeza-beza (anda mungkin perlu bertanya kepada pentadbir pelayan anda di mana mereka berada), tetapi mereka biasanya boleh ditemui di bawah
logs
dalam direktori akar pengguna. Di dalamnya akan terdapat mesej ralat yang dilaporkan oleh pelayan (jika ada) yang berkaitan dengan percubaan anda untuk menghantar e-mel.Periksa sama ada sambungan port gagal
Penyekatan port ialah isu biasa yang dihadapi kebanyakan pembangun semasa menyepadukan kod untuk menghantar e-mel menggunakan SMTP. Dan, ini boleh dikesan dengan mudah dalam log mel pelayan (lokasi pelayan log mel mungkin berbeza dari pelayan ke pelayan, seperti yang dinyatakan di atas). Jika anda menggunakan pelayan pengehosan kongsi, port 25 dan 587 masih disekat secara lalai. Penyekatan ini dilakukan dengan sengaja oleh penyedia pengehosan anda. Ini benar walaupun untuk beberapa pelayan khusus. Apabila port ini disekat, cuba sambungkan menggunakan port 2525. Jika anda mendapati bahawa port itu juga disekat, maka satu-satunya penyelesaian ialah menghubungi penyedia pengehosan anda untuk menyahsekat port ini.
Kebanyakan penyedia pengehosan menyekat port e-mel ini untuk melindungi rangkaian mereka daripada sebarang spam yang dihantar.
Gunakan port 25 atau 587 untuk sambungan biasa/TLS dan port 465 untuk sambungan SSL. Bagi kebanyakan pengguna, adalah disyorkan untuk menggunakan port 587 untuk mengelakkan had kadar yang ditetapkan oleh sesetengah penyedia pengehosan.
Jangan gunakan operator penindasan ralat
ApabilaError Suppression Operator
@
ditambahkan sebelum ungkapan dalam PHP, sebarang mesej ralat yang mungkin dijana oleh ungkapan itu akan diabaikan. Terdapat beberapa situasi di mana pengendali ini diperlukan, tetapi menghantar mesejbukansalah satu daripadanya.Jika kod anda mengandungi
@mail(...)
,那么您可能隐藏了有助于您调试的重要错误消息。删除@
dan lihat jika sebarang ralat dilaporkan.Hanya jika andamenggunakan
error_get_last()
serta-merta selepas kegagalan tertentu.Semak
mail()
nilai pulanganmail()
Fungsi:Ini perlu diberi perhatian kerana:
FALSE
nilai pulangan, anda tahu ralatnya adalah dengan pelayan anda menerima mel anda. Ini mungkin bukan isu pengekodan tetapi isu konfigurasi pelayan. Anda perlu menghubungi pentadbir sistem anda untuk mengetahui sebab ini berlaku.TRUE
nilai pulangan, ini tidak bermakna e-mel anda akan dihantar. Ini bermakna bahawa e-mel telah berjaya dihantar melalui PHP kepada pengendali yang sesuai pada pelayan. Terdapat banyak lagi titik kegagalan di luar kawalan PHP yang boleh menghalang e-mel daripada dihantar.Jadi,
tidak semestinya bermakna e-mel anda berjaya dihantar. Perlu diperhatikan! Pastikan penyedia pengehosan anda membenarkan anda menghantar e-mel dan tidak menyekat penghantaran mel Ramai hos web kongsi, terutamanya penyedia pengehosan web percuma, sama ada tidak membenarkan e-mel dihantar daripada pelayan mereka atau mengehadkan bilangan yang boleh dihantar dalam mana-mana tempoh masa tertentu. Ini kerana mereka bekerja keras untuk mengehadkan pengirim spam daripada memanfaatkan perkhidmatan mereka yang lebih murah. Jika anda rasa hos anda mempunyai sekatan e-mel atau menyekat e-mel daripada dihantar, semak Soalan Lazim mereka untuk melihat sama ada mereka menyenaraikan sebarang sekatan sedemikian. Jika tidak, anda mungkin perlu menghubungi sokongan mereka untuk mengesahkan sama ada terdapat sebarang sekatan untuk menghantar e-mel. Semak folder spam; halang e-mel daripada ditandakan sebagai spam Selalunya, e-mel yang dihantar melalui PHP (dan bahasa pengaturcaraan sebelah pelayan lain) berakhir dalam folder spam penerima atas pelbagai sebab. Pastikan anda menyemak di sana sebelum menyelesaikan masalah kod anda.FALSE
将帮助您指明正确的方向,而TRUE
akan membantu mengarahkan anda ke arah yang betul, manakalaUntuk mengelakkan e-mel yang dihantar melalui PHP dihantar ke folder spam penerima, terdapat beberapa perkara yang boleh anda lakukan dalam kod PHP anda atau sebaliknya untuk meminimumkan kemungkinan e-mel anda ditandakan sebagai spam. Petua hebat daripadaMichiel de Mare
termasuk:Untuk maklumat lanjut tentang topik ini, lihatBagaimana untuk memastikan bahawa e-mel yang dihantar secara pengaturcaraan tidak ditandakan sebagai spam secara automatik?.
Pastikan anda menyediakan semua pengepala e-mel
Sesetengah perisian spam akan menolak mesej jika ia tiada pengepala biasa seperti "Daripada" dan "Balas":
Pastikan tiada kesalahan tatabahasa dalam pengepala e-mel
Pengepala tidak sah sama buruknya dengan tiada pengepala sama sekali. Satu aksara yang salah boleh menggagalkan e-mel anda. Sila semak semula untuk memastikan sintaks anda betul kerana PHPtidak akanmenangkap ralat ini untuk anda.
Jangan gunakan
palsu发件人:
pengirimWalaupun mesej mesti mempunyai Daripada:Penghantar, anda tidak boleh menggunakansebarang nilaisahaja. Khususnya, alamat penghantar yang dibekalkan pengguna ialah cara yang boleh dipercayai untuk menyekat mesej:
Punca: Rangkaian atau pelayan mel keluar anda tidak disenarai putih SPF/DKIM dan tidak boleh berpura-pura bertanggungjawab ke atas alamat @hotmail atau @gmail. Ia mungkin juga menggugurkan mesej secara senyap dengan domain penghantar
From:
yang tidak dikonfigurasikan.Pastikan nilai penerima adalah betul
Kadang-kadang masalahnya semudah nilai penerima e-mel tidak betul. Ini mungkin disebabkan oleh pembolehubah yang salah digunakan.
Cara lain untuk menguji isu ini ialah mengekodkan keras nilai penerima ke dalam panggilan fungsi
mail()
:Ini boleh digunakan pada semua
mail()
parameter.Hantar ke berbilang akaun
Untuk membantu menyelesaikan masalah akaun e-mel, hantar e-mel anda ke berbilang akaun e-mel dengan pembekal e-mel yang berbeza.. Jika e-mel anda tidak sampai ke akaun Gmail pengguna, hantarkan e-mel yang sama ke akaun Yahoo, akaun Hotmail dan akaun POP3 biasa (seperti akaun e-mel yang disediakan oleh ISP anda).
Jika e-mel tiba pada semua atau beberapa akaun e-mel lain, anda tahu kod anda sedang menghantar e-mel, tetapi pembekal akaun e-mel mungkin menyekatnya atas sebab tertentu. Jika e-mel tidak sampai ke mana-mana akaun e-mel, masalahnya berkemungkinan besar berkaitan dengan kod anda.
Pastikan kod sepadan dengan kaedah borang
Jika anda telah menetapkan kaedah borang untuk
POST
,请确保使用$_POST
查找表单值。如果您已将其设置为GET
或根本没有设置,请确保使用$_GET
cari nilai borang.Pastikan borang
action
nilai anda menunjuk ke lokasi yang betulPastikan atribut
action
borang anda mengandungi nilai yang menunjuk kepada kod mel PHP anda.