Rumah > Soal Jawab > teks badan
P粉1419112442023-08-24 15:06:59
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.
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.
error_reporting(-1); ini_set('display_errors', 'On'); set_error_handler("var_dump");
Lihat Bagaimana untuk mendapatkan mesej ralat yang berguna dalam PHP? — Jawapan ini untuk butiran lanjut.
mail()
Ini mungkin kelihatan bodoh, tetapi kesilapan biasa ialah terlupa untuk meletakkan fungsi mail()
dalam kod anda. Pastikan ia ada dan tidak diulas.
mail()
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.
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.
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.
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.
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, FALSE
将帮助您指明正确的方向,而 TRUE
akan membantu mengarahkan anda ke arah yang betul, manakala
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.
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. termasuk: 🎜
Untuk maklumat lanjut tentang topik ini, lihat Bagaimana untuk memastikan bahawa e-mel yang dihantar secara pengaturcaraan tidak ditandakan sebagai spam secara automatik? .
Sesetengah perisian spam akan menolak mesej jika ia tiada pengepala biasa seperti "Daripada" dan "Balas":
$headers = array("From: from@example.com", "Reply-To: replyto@example.com", "X-Mailer: PHP/" . PHP_VERSION ); $headers = implode("\r\n", $headers); mail($to, $subject, $message, $headers);
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.
$headers = array("From from@example.com", // missing colon "Reply To: replyto@example.com", // missing hyphen "X-Mailer: "PHP"/" . PHP_VERSION // bad quotes );
发件人:
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:
$headers = array("From: $_POST[contactform_sender_email]"); // No!
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.
Kadang-kadang masalahnya semudah nilai penerima e-mel tidak betul. Ini mungkin disebabkan oleh pembolehubah yang salah digunakan.
$to = 'user@example.com'; // other variables .... mail($recipient, $subject, $message, $headers); // $recipient should be $to
Cara lain untuk menguji isu ini adalah dengan mengeraskan nilai penerima ke dalam panggilan fungsi mail()
:
mail('user@example.com', $subject, $message, $headers);
Ini boleh digunakan pada semua mail()
parameter.
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.
Jika anda telah menetapkan kaedah borang untuk POST
,请确保使用 $_POST
查找表单值。如果您已将其设置为 GET
或根本没有设置,请确保使用 $_GET
cari nilai borang.
action
nilai anda menunjuk ke lokasi yang betulPastikan atribut action
borang anda mengandungi nilai yang menunjuk kepada kod mel PHP anda.
<form action="send_email.php" method="POST">
Sesetengah penyedia pengehosan web tidak membenarkan atau mendayakan penghantaran e-mel melalui pelayan mereka. Sebab untuk ini mungkin berbeza-beza, tetapi jika mereka menyekat e-mel, anda perlu menggunakan kaedah alternatif, iaitu menggunakan pihak ketiga untuk menghantar e-mel ini untuk anda.
E-mel yang dihantar kepada sokongan teknikal mereka (selepas melawati sokongan dalam talian atau Soalan Lazim mereka) harus menjelaskan sama ada ciri e-mel tersedia pada pelayan anda.
localhost
pelayan mel anda dikonfigurasikanJika anda sedang membangun di stesen kerja tempatan menggunakan WAMP, MAMP atau XAMPP, anda mungkin tidak mempunyai pelayan e-mel dipasang pada stesen kerja anda. Jika tidak, PHP tidak akan dapat menghantar e-mel secara lalai.
Anda boleh mengatasi masalah ini dengan memasang pelayan mel asas. Untuk Windows, anda boleh menggunakan Mercury Mail percuma.
Anda juga boleh menghantar e-mel menggunakan SMTP. Lihat jawapan hebat ini daripada >Vikas Dwivedi untuk mengetahui cara melakukannya.
Dayakan penyesuaian PHPmail.log
pengelogan khusus fungsimail()
. Ia tidak log interaksi SMTP yang lengkap, tetapi sekurang-kurangnya ia log parameter panggilan fungsi dan skrip panggilan.
ini_set("mail.log", "/tmp/mail.log"); ini_set("mail.add_x_header", TRUE);Lihat
http://php.net/manual/en/mail.configuration.php untuk butiran. (Lebih baik untuk mendayakan pilihan ini dalam .) php.ini
或 .user.ini
或 .htaccess
terbina dalam PHP adalah mudah dan biasanya menyelesaikan tugas, tetapi ia mail()
mempunyai kelemahannya. Nasib baik, terdapat alternatif yang menawarkan lebih kuasa dan fleksibiliti, termasuk mengendalikan banyak isu yang dinyatakan di atas:
Semua ini boleh digunakan bersama dengan pelayan/pembekal perkhidmatan SMTP profesional. (Oleh kerana rancangan pengehosan web kongsi 08/15 biasa terkena atau terlepas dengan persediaan/konfigurasi e-mel.)