Fungsi mel PHP gagal menghantar e-mel sepenuhnya
P粉322106755
2023-08-27 13:56:49
<p><pre class="brush:php;toolbar:false;"><?php
$nama = $_POST['nama'];
$emel = $_POST['emel'];
$message = $_POST['message'];
$from = 'Daripada: laman web anda.com';
$to = 'contact@yoursite.com';
$subject = 'Siasatan Pelanggan';
$body = "Daripada: $namen E-Mel: $emailn Mesej:n $message";
jika ($_POST['serahkan']) {
jika (mel ($kepada, $subjek, $badan, $daripada)) {
echo '<p>Mesej anda telah dihantar!</p>';
} lain {
echo '<p>Sesuatu telah berlaku, kembali dan cuba lagi!</p>';
}
}
?></pra>
<p>Saya cuba mencipta borang e-mel yang mudah. Borang itu sendiri terdapat pada halaman <code>index.html</code> saya, tetapi ia diserahkan ke halaman "Terima kasih atas penyerahan anda" yang berasingan, <code>thankyou.php</code>, yang mempunyai perkara di atas PHP tertanam di dalamnya kod.
Kod diserahkan dengan sempurna, tetapi e-mel tidak pernah dihantar. Bagaimanakah saya boleh menyelesaikan masalah ini? </p>
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 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.
Lihat Bagaimana untuk mendapatkan mesej ralat yang berguna dalam PHP? — Jawapan ini untuk butiran lanjut.
Pastikan untuk memanggil fungsi
mail()
Ini mungkin kelihatan bodoh, tetapi kesilapan biasa ialah terlupa untuk meletakkan fungsi
mail()
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 akan 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 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 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
Apabila Error 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 mesej bukanlah salah satu daripadanya.Jika kod anda mengandungi
@mail(...)
,那么您可能隐藏了有助于您调试的重要错误消息。删除@
dan lihat jika sebarang ralat dilaporkan.Hanya jika anda menggunakan
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!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 daripada Michiel de Mare
termasuk: 🎜Untuk maklumat lanjut tentang topik ini, lihat Bagaimana 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 PHP tidak akan menangkap ralat ini untuk anda.
Jangan gunakan
palsu发件人:
pengirimWalaupun mesej mesti mempunyai Daripada:Penghantar, anda tidak boleh menggunakan sebarang nilai sahaja. 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.