cari

Rumah  >  Soal Jawab  >  teks badan

Fungsi mel PHP tidak dapat menyelesaikan penghantaran e-mel

rreeee

Saya cuba mencipta borang mel yang mudah. Borang itu sendiri terletak dalam index.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?

P粉957723124P粉957723124412 hari yang lalu613

membalas semua(1)saya akan balas

  • P粉690200856

    P粉6902008562023-10-12 17:36:57

    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.

    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.

    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 mail()

    dengan betul

    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

    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 bukan 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.

    Semakmail()nilai pulangan

    mail() Fungsi:

    Ini perlu diberi perhatian kerana:

    • Jika anda menerima 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.
    • Jika anda menerima 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

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

    $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 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.

    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 fungsi mail():

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

    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 actionnilai anda menunjuk ke lokasi yang betul

    Pastikan atribut action borang 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 penghantaran e-mel, anda perlu menggunakan alternatif pihak ketiga yang menghantar e-mel ini kepada 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.

    Pastikan localhost pelayan 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 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 PHP

    mail.log

    Selain fail log MTA dan PHP, anda juga boleh mendayakan

    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

    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 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.)

    balas
    0
  • Batalbalas