Fungsi mel PHP tidak boleh menghantar e-mel sepenuhnya
P粉125450549
P粉125450549 2023-10-11 21:41:38
0
1
473

rreeee

Saya cuba mencipta borang mel yang mudah. Borang itu sendiri terletak dalamindex.html页面上,但它提交到一个单独的“感谢您的提交”页面thankyou.phpsaya 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?

P粉125450549
P粉125450549

membalas semua (1)
P粉398117857

Walaupun beberapa bahagian jawapan ini hanya terpakai pada penggunaan fungsimail()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.

error_reporting(-1); ini_set('display_errors', 'On'); set_error_handler("var_dump");

LihatBagaimana untuk mendapatkan mesej ralat yang berguna dalam PHP?Jawapan iniuntuk butiran lanjut.

Pastikan untuk memanggil fungsimail()

Ini mungkin kelihatan bodoh, tetapi kesilapan biasa ialah terlupa untuk meletakkanmail()fungsi dalam kod anda. Pastikan ia ada dan tidak diulas.

Pastikan untuk memanggil fungsimail()

dengan betul

Fungsi mel mengambil tiga parameter yang diperlukan dan parameter keempat dan kelima pilihan. Jika panggilan anda kemail()tidak mempunyai sekurang-kurangnya tiga hujah, ia akan gagal.

Jika panggilan anda kemail()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 bawahlogsdalam 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 andamenggunakanerror_get_last()serta-merta selepas kegagalan tertentu.

Semakmail()nilai pulangan

mail()Fungsi:

Ini perlu diberi perhatian kerana:

  • Jika anda menerimaFALSEnilai 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.
  • Jika anda menerimaTRUEnilai 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将帮助您指明正确的方向,而TRUEakan membantu mengarahkan anda ke arah yang betul, manakala

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.

Untuk 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":

$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);

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.

$headers = array("From from@example.com", // missing colon "Reply To: replyto@example.com", // missing hyphen "X-Mailer: "PHP"/" . PHP_VERSION // bad quotes );

Jangan gunakan发件人:pengirim

palsu

Walaupun mesej mesti mempunyai Daripada:Penghantar, anda tidak boleh menggunakansebarang nilaisahaja. 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 penghantarFrom: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.

$to = 'user@example.com'; // other variables .... mail($recipient, $subject, $message, $headers); // $recipient should be $to

Cara lain untuk menguji isu ini ialah mengekodkan keras nilai penerima ke dalam panggilan fungsimail():

mail('user@example.com', $subject, $message, $headers);

Ini boleh digunakan pada semuamail()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 untukPOST,请确保使用$_POST查找表单值。如果您已将其设置为GET或根本没有设置,请确保使用$_GETcari nilai borang.

Pastikan borangactionnilai anda menunjuk ke lokasi yang betul

Pastikan atributactionborang anda mengandungi nilai yang menunjuk kepada kod mel PHP anda.


          

Pastikan hos web anda menyokong penghantaran e-mel

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.

Pastikanlocalhostpelayan mel anda dikonfigurasikan

Jika 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 menggunakanMercury Mailpercuma.

Anda juga boleh menghantar e-mel menggunakan SMTP. Lihat jawapan hebat ini daripada>Vikas Dwivediuntuk mengetahui cara melakukannya.

Dayakan penyesuaian PHP

mail.log

Selain fail log MTA dan PHP, anda juga boleh mendayakan

pengelogan khususfungsimail(). 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.phpuntuk butiran. (Lebih baik untuk mendayakan pilihan ini dalam.)php.ini.user.ini.htaccess

Semak Perkhidmatan Ujian Mel

Anda boleh menguji persediaan MTA/pelayan web anda menggunakan pelbagai perkhidmatan penghantaran dan semakan spam. Biasanya anda menghantar probe mel ke: Alamat mereka dan kemudian mendapatkan laporan penghantaran dan kegagalan atau analisis yang lebih khusus kemudian:

Gunakan program e-mel yang berbeza

Fungsi

terbina dalam PHP adalah mudah dan biasanya menyelesaikan tugas, tetapi iamail()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.)

    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan
    Tentang kita Penafian Sitemap
    Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!