Fungsi PHP mail tidak menyelesaikan pengiriman email

Jul 09 2014
<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com';
    $to = '[email protected]';
    $subject = 'Customer Inquiry';
    $body = "From: $name\n E-Mail: $email\n Message:\n $message";

    if ($_POST['submit']) {
        if (mail ($to, $subject, $body, $from)) {
            echo '<p>Your message has been sent!</p>';
        } else {
            echo '<p>Something went wrong, go back and try again!</p>';
        }
    }
?>

Saya sudah mencoba membuat formulir surat sederhana. Formulir itu sendiri ada di index.htmlhalaman saya , tetapi dikirimkan ke halaman "terima kasih atas kiriman Anda" yang terpisah thankyou.php, tempat kode PHP di atas disematkan. Kode dikirimkan dengan sempurna, tetapi tidak pernah mengirim email. Bagaimana cara memperbaikinya?

Jawaban

533 JohnConde Jul 09 2014 at 09:21

Meskipun ada bagian dari jawaban ini yang hanya berlaku untuk penggunaan mail()fungsi itu sendiri, banyak dari langkah pemecahan masalah ini dapat diterapkan ke sistem mailing PHP apa pun.

Ada berbagai alasan mengapa skrip Anda tidak mengirimkan email. Sulit untuk mendiagnosis hal-hal ini kecuali ada kesalahan sintaks yang jelas. Tanpa kesalahan, Anda perlu menjalankan daftar periksa di bawah untuk menemukan potensi jebakan yang mungkin Anda hadapi.

Pastikan pelaporan kesalahan diaktifkan dan setel untuk melaporkan semua kesalahan

Pelaporan kesalahan sangat penting untuk membasmi bug dalam kode Anda dan kesalahan umum yang ditemui PHP. Pelaporan kesalahan perlu diaktifkan untuk menerima kesalahan ini. Menempatkan kode berikut di bagian atas file PHP Anda (atau di file konfigurasi master) akan mengaktifkan pelaporan kesalahan.

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

Lihat Bagaimana saya bisa mendapatkan pesan kesalahan yang berguna di PHP? - jawaban ini untuk lebih jelasnya tentang ini.

Pastikan mail()fungsinya dipanggil

Ini mungkin tampak konyol tetapi kesalahan umum adalah lupa untuk benar-benar menempatkan mail()fungsi dalam kode Anda. Pastikan itu ada dan tidak diberi komentar.

Pastikan mail()fungsinya dipanggil dengan benar

bool mail (string $to , string $subjek, string $message [, string $additional_headers [, string $ additional_parameters]])

Fungsi mail mengambil tiga parameter wajib dan opsional yang keempat dan kelima. Jika panggilan Anda ke mail()tidak memiliki setidaknya tiga parameter, itu akan gagal.

Jika panggilan Anda ke mail()tidak memiliki parameter yang benar dalam urutan yang benar, panggilan itu juga akan gagal.

Periksa log email server

Server web Anda harus mencatat semua upaya untuk mengirim email melalui itu. Lokasi log ini akan bervariasi (Anda mungkin perlu bertanya kepada administrator server di mana mereka berada) tetapi biasanya dapat ditemukan di direktori root pengguna di bawah logs. Di dalamnya akan ada pesan kesalahan yang dilaporkan server, jika ada, terkait dengan upaya Anda untuk mengirim email.

Periksa kegagalan koneksi Port

Blok port adalah masalah yang sangat umum yang dihadapi sebagian besar pengembang saat mengintegrasikan kode mereka untuk mengirim email menggunakan SMTP. Dan, ini dapat dengan mudah dilacak di server maillogs (lokasi server log surat dapat bervariasi dari server ke server, seperti dijelaskan di atas). Jika Anda menggunakan server hosting bersama, port 25 dan 587 tetap diblokir secara default. Pemblokiran ini sengaja dilakukan oleh penyedia hosting Anda. Ini berlaku bahkan untuk beberapa server khusus. Saat porta ini diblokir, coba sambungkan menggunakan porta 2525. Jika Anda menemukan port tersebut juga diblokir, maka satu-satunya solusi adalah menghubungi penyedia hosting Anda untuk membuka blokir port ini.

Sebagian besar penyedia hosting memblokir port email ini untuk melindungi jaringan mereka dari pengiriman email spam apa pun.

Gunakan porta 25 atau 587 untuk koneksi biasa / TLS dan port 465 untuk koneksi SSL. Untuk sebagian besar pengguna, disarankan untuk menggunakan port 587 untuk menghindari batas kecepatan yang ditetapkan oleh beberapa penyedia hosting.

Jangan gunakan operator penekan kesalahan

Ketika operator error suppression @ ditambahkan ke ekspresi dalam PHP, pesan kesalahan apa pun yang mungkin dihasilkan oleh ekspresi tersebut akan diabaikan. Ada keadaan di mana menggunakan operator ini diperlukan tetapi mengirim email bukan salah satunya.

Jika kode Anda berisi @mail(...)maka Anda mungkin menyembunyikan pesan kesalahan penting yang akan membantu Anda men-debug ini. Hapus @dan lihat apakah ada kesalahan yang dilaporkan.

Ini hanya disarankan ketika Anda memeriksa denganerror_get_last() segera setelah itu untuk kegagalan beton.

Periksa nilai mail()pengembalian

The mail()Fungsi:

Mengembalikan TRUEjika surat berhasil diterima untuk pengiriman, FALSEsebaliknya. Penting untuk dicatat bahwa hanya karena surat telah diterima untuk pengiriman, bukan berarti surat tersebut benar-benar akan mencapai tujuan yang dituju.

Ini penting untuk diperhatikan karena:

  • Jika Anda menerima FALSEnilai pengembalian, Anda tahu kesalahannya terletak pada server Anda yang menerima email Anda. Ini mungkin bukan masalah pengkodean tetapi masalah konfigurasi server. Anda perlu berbicara dengan administrator sistem Anda untuk mencari tahu mengapa ini terjadi.
  • Jika Anda menerima TRUEnilai pengembalian bukan berarti email Anda pasti akan terkirim. Ini hanya berarti email berhasil dikirim ke penangannya masing-masing di server oleh PHP. Masih banyak poin kegagalan di luar kendali PHP yang dapat menyebabkan email tidak terkirim.

Jadi FALSEakan membantu mengarahkan Anda ke arah yang benar sedangkan TRUEyang tidak selalu berarti email Anda berhasil dikirim. Ini penting untuk diperhatikan!

Pastikan penyedia hosting Anda mengizinkan Anda mengirim email dan tidak membatasi pengiriman email

Banyak hosting web bersama, terutama penyedia hosting gratis, tidak mengizinkan email dikirim dari server mereka atau membatasi jumlah yang dapat dikirim selama jangka waktu tertentu. Ini karena upaya mereka untuk membatasi spammer agar tidak memanfaatkan layanan mereka yang lebih murah.

Jika menurut Anda host Anda memiliki batasan email atau memblokir pengiriman email, periksa FAQ mereka untuk melihat apakah mereka mencantumkan batasan tersebut. Jika tidak, Anda mungkin perlu menghubungi dukungan mereka untuk memverifikasi apakah ada batasan terkait pengiriman email.

Periksa folder spam; mencegah email ditandai sebagai spam

Seringkali, karena berbagai alasan, email yang dikirim melalui PHP (dan bahasa pemrograman sisi server lainnya) berakhir di folder spam penerima. Selalu periksa di sana sebelum memecahkan masalah kode Anda.

Untuk menghindari email yang dikirim melalui PHP dikirim ke folder spam penerima, ada berbagai hal yang dapat Anda lakukan, baik dalam kode PHP Anda maupun sebaliknya, untuk meminimalkan kemungkinan email Anda ditandai sebagai spam. Kiat bagus dari Michiel de Mare meliputi:

  • Gunakan metode autentikasi email, seperti SPF , dan DKIM untuk membuktikan bahwa email dan nama domain Anda dimiliki bersama, dan untuk mencegah spoofing nama domain Anda. Situs web SPF menyertakan wizard untuk menghasilkan informasi DNS untuk situs Anda.
  • Periksa DNS terbalik Anda untuk memastikan alamat IP server email Anda mengarah ke nama domain yang Anda gunakan untuk mengirim email.
  • Pastikan bahwa alamat IP yang Anda gunakan tidak ada dalam daftar hitam
  • Pastikan bahwa alamat balas-ke adalah alamat yang valid dan sudah ada.
  • Gunakan nama lengkap dan asli penerima di bidang Kepada, bukan hanya alamat email (mis "John Smith" <[email protected]>.).
  • Pantau akun penyalahgunaan Anda, seperti [email protected] dan [email protected]. Artinya - pastikan akun ini ada, baca apa yang dikirimkan kepada mereka, dan tindak lanjuti keluhan.
  • Akhirnya, membuatnya benar-benar mudah untuk berhenti berlangganan. Jika tidak, pengguna Anda akan berhenti berlangganan dengan menekan tombol spam , dan itu akan memengaruhi reputasi Anda.

Lihat Bagaimana Anda memastikan email yang Anda kirim secara terprogram tidak secara otomatis ditandai sebagai spam? untuk lebih lanjut tentang topik ini.

Pastikan semua header email disediakan

Beberapa software spam akan menolak email jika tidak ada header umum seperti "Dari" dan "Balas ke":

$headers = array("From: [email protected]",
    "Reply-To: [email protected]",
    "X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);

Pastikan header email tidak memiliki kesalahan sintaksis

Header yang tidak valid sama buruknya dengan tidak memiliki header. Mungkin hanya satu karakter yang salah untuk menggagalkan email Anda. Periksa kembali untuk memastikan sintaks Anda benar karena PHP tidak akan menangkap kesalahan ini untuk Anda.

$headers = array("From [email protected]", // missing colon
    "Reply To: [email protected]",      // missing hyphen
    "X-Mailer: "PHP"/" . PHP_VERSION      // bad quotes
);

Jangan gunakan From:pengirim palsu

Meskipun email harus memiliki pengirim Dari:, Anda tidak boleh hanya menggunakan nilai apa pun . Secara khusus, alamat pengirim yang disediakan pengguna adalah cara yang pasti untuk memblokir email:

$headers = array("From: $_POST[contactform_sender_email]"); // No!

Alasan: server web atau email pengirim Anda tidak termasuk dalam daftar putih SPF / DKIM untuk berpura-pura bertanggung jawab atas alamat @hotmail atau @gmail. Bahkan mungkin secara diam-diam menjatuhkan email dengan From:domain pengirim yang tidak dikonfigurasi untuk itu.

Pastikan nilai penerima sudah benar

Terkadang masalahnya sesederhana memiliki nilai yang salah untuk penerima email. Ini mungkin karena menggunakan variabel yang salah.

$to = '[email protected]';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to

Cara lain untuk mengujinya adalah dengan mengkodekan nilai penerima ke dalam mail()pemanggilan fungsi:

mail('[email protected]', $subject, $message, $headers); 

Ini dapat diterapkan ke semua mail()parameter.

Kirim ke banyak akun

Untuk membantu mengesampingkan masalah akun email, kirim email Anda ke beberapa akun email di penyedia email yang berbeda . Jika email Anda tidak sampai ke akun Gmail pengguna, kirim email yang sama ke akun Yahoo, akun Hotmail, dan akun POP3 biasa (seperti akun email yang disediakan ISP Anda).

Jika email tiba di semua atau beberapa akun email lain, Anda tahu kode Anda mengirim email tetapi kemungkinan penyedia akun email memblokirnya karena beberapa alasan. Jika email tidak sampai ke akun email mana pun, masalahnya kemungkinan besar terkait dengan kode Anda.

Pastikan kode sesuai dengan metode formulir

Jika Anda telah menyetel metode formulir ke POST, pastikan Anda menggunakan $_POSTuntuk mencari nilai formulir Anda. Jika Anda telah mengaturnya GETatau tidak mengaturnya sama sekali, pastikan Anda menggunakan $_GETuntuk mencari nilai formulir Anda.

Pastikan actionnilai formulir Anda menunjuk ke lokasi yang benar

Pastikan actionatribut formulir Anda berisi nilai yang mengarah ke kode surat PHP Anda.

<form action="send_email.php" method="POST">

Pastikan host Web mendukung pengiriman email

Beberapa penyedia web hosting tidak mengizinkan atau mengaktifkan pengiriman email melalui server mereka. Alasan untuk hal ini mungkin berbeda, tetapi jika mereka telah menonaktifkan pengiriman email, Anda perlu menggunakan metode alternatif yang menggunakan pihak ketiga untuk mengirim email tersebut untuk Anda.

Email ke dukungan teknis mereka (setelah perjalanan ke dukungan online atau FAQ mereka) akan menjelaskan apakah kemampuan email tersedia di server Anda.

Pastikan localhostserver email dikonfigurasi

Jika Anda mengembangkan di workstation lokal menggunakan WAMP, MAMP, atau XAMPP, server email mungkin tidak diinstal di workstation Anda. Tanpanya, PHP tidak dapat mengirim email secara default.

Anda dapat mengatasinya dengan memasang server email dasar. Untuk Windows, Anda dapat menggunakan Mercury Mail gratis .

Anda juga dapat menggunakan SMTP untuk mengirim email Anda. Lihat jawaban hebat dari Vikas Dwivedi ini untuk mempelajari bagaimana melakukan ini.

Aktifkan kustom PHP mail.log

Selain file log MTA dan PHP Anda, Anda dapat mengaktifkan logging untuk mail()fungsi tersebut secara khusus. Itu tidak merekam interaksi SMTP lengkap, tetapi setidaknya parameter panggilan fungsi dan skrip pemanggilan.

ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);

Lihat http://php.net/manual/en/mail.configuration.php untuk detailnya. (Yang terbaik adalah mengaktifkan opsi ini di php.iniatau .user.iniatau .htaccessmungkin.)

Periksa dengan layanan pengujian email

Ada berbagai layanan pemeriksaan pengiriman dan spam yang dapat Anda gunakan untuk menguji pengaturan MTA / server web Anda. Biasanya Anda mengirim probe surat ke: alamat mereka, kemudian mendapatkan laporan pengiriman dan kegagalan atau analisis yang lebih konkret nanti:

Gunakan mailer lain

mail()Fungsi built-in PHP berguna dan sering menyelesaikan pekerjaan tetapi memiliki kekurangan . Untungnya, ada alternatif yang menawarkan lebih banyak kekuatan dan fleksibilitas termasuk menangani banyak masalah yang diuraikan di atas:

Semuanya dapat digabungkan dengan server / penyedia layanan SMTP profesional. (Karena paket webhosting bersama 08/15 yang khas terpukul atau terlewatkan ketika menyangkut pengaturan / konfigurasi email.)

39 er.irfankhan11 Jul 27 2015 at 21:01

Tambahkan header surat di fungsi surat:

$header = "From: [email protected]\r\n";
$header.= "MIME-Version: 1.0\r\n";
$header.= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$header.= "X-Priority: 1\r\n";

$status = mail($to, $subject, $message, $header);

if($status)
{
    echo '<p>Your mail has been sent!</p>';
} else {
    echo '<p>Something went wrong. Please try again!</p>';
}
25 sonamgupta May 20 2015 at 20:23
  1. Selalu coba mengirim header dalam fungsi mail.
  2. Jika Anda mengirim email melalui localhost maka lakukan pengaturan SMTP untuk mengirim email.
  3. Jika Anda mengirim email melalui server, periksa apakah fitur pengiriman email diaktifkan di server Anda.
21 oneDerer Jul 09 2014 at 09:55

Jika Anda menggunakan konfigurasi SMTP untuk mengirim email Anda, coba gunakan PHPMailer sebagai gantinya. Anda dapat mengunduh perpustakaan dari https://github.com/PHPMailer/PHPMailer .

Saya membuat email saya dengan cara mengirim:

function send_mail($email, $recipient_name, $message='')
{
    require("phpmailer/class.phpmailer.php");

    $mail = new PHPMailer();

    $mail->CharSet = "utf-8";
    $mail->IsSMTP();                                      // Set mailer to use SMTP
    $mail->Host = "mail.example.com";  // Specify main and backup server
    $mail->SMTPAuth = true;     // Turn on SMTP authentication
    $mail->Username = "myusername";  // SMTP username
    $mail->Password = "p@ssw0rd"; // SMTP password

    $mail->From = "[email protected]";
    $mail->FromName = "System-Ad";
    $mail->AddAddress($email, $recipient_name);

    $mail->WordWrap = 50;                                 // Set word wrap to 50 characters
    $mail->IsHTML(true);                                  // Set email format to HTML (true) or plain text (false)

    $mail->Subject = "This is a Sampleenter code here Email";
    $mail->Body    = $message;
    $mail->AltBody = "This is the body in plain text for non-HTML mail clients";
    $mail->AddEmbeddedImage('images/logo.png', 'logo', 'logo.png');
    $mail->addAttachment('files/file.xlsx');

    if(!$mail->Send())
    {
       echo "Message could not be sent. <p>";
       echo "Mailer Error: " . $mail->ErrorInfo;
       exit;
    }

    echo "Message has been sent";
}
17 user1258544 Jul 09 2014 at 10:22

Tambahkan saja beberapa tajuk sebelum mengirim email:

<?php 
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com'; 
$to = '[email protected]'; 
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";

$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html\r\n";
$headers .= 'From: [email protected]' . "\r\n" .
'Reply-To: [email protected]' . "\r\n" .
'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);

Dan satu hal lagi. The mail()fungsi tidak bekerja di localhost. Unggah kode Anda ke server dan coba.

13 bat.t Sep 29 2015 at 21:25

Ini berhasil untuk saya di 000webhost dengan melakukan hal berikut:

$headers  = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1" . "\r\n";
$headers .= "From: ". $from. "\r\n";
$headers .= "Reply-To: ". $from. "\r\n";
$headers .= "X-Mailer: PHP/" . phpversion();
$headers .= "X-Priority: 1" . "\r\n";

Masukkan langsung alamat email saat mengirim email:

mail('[email protected]', $subject, $message, $headers)

Gunakan ''dan tidak "".

Kode ini berfungsi, tetapi email diterima dengan keterlambatan setengah jam.

10 Karthik Jun 23 2016 at 16:02

Sebagian besar mail()fungsi dinonaktifkan di hosting bersama. Pilihan yang lebih baik adalah menggunakan SMTP. Pilihan terbaik adalah Gmail atau SendGrid.


SMTPconfig.php

<?php 
    $SmtpServer="smtp.*.*";
    $SmtpPort="2525"; //default
    $SmtpUser="***";
    $SmtpPass="***";
?>

SMTPmail.php

<?php
class SMTPClient
{

    function SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body)
    {

        $this->SmtpServer = $SmtpServer;
        $this->SmtpUser = base64_encode ($SmtpUser);
        $this->SmtpPass = base64_encode ($SmtpPass);
        $this->from = $from;
        $this->to = $to;
        $this->subject = $subject;
        $this->body = $body;

        if ($SmtpPort == "") 
        {
            $this->PortSMTP = 25;
        }
        else
        {
            $this->PortSMTP = $SmtpPort;
        }
    }

    function SendMail ()
    {
        $newLine = "\r\n";
        $headers = "MIME-Version: 1.0" . $newLine;  
        $headers .= "Content-type: text/html; charset=iso-8859-1" . $newLine;  

        if ($SMTPIN = fsockopen ($this->SmtpServer, $this->PortSMTP)) 
        {
            fputs ($SMTPIN, "EHLO ".$HTTP_HOST."\r\n"); 
            $talk["hello"] = fgets ( $SMTPIN, 1024 ); 
            fputs($SMTPIN, "auth login\r\n");
            $talk["res"]=fgets($SMTPIN,1024);
            fputs($SMTPIN, $this->SmtpUser."\r\n");
            $talk["user"]=fgets($SMTPIN,1024);
            fputs($SMTPIN, $this->SmtpPass."\r\n");
            $talk["pass"]=fgets($SMTPIN,256);
            fputs ($SMTPIN, "MAIL FROM: <".$this->from.">\r\n"); 
            $talk["From"] = fgets ( $SMTPIN, 1024 ); 
            fputs ($SMTPIN, "RCPT TO: <".$this->to.">\r\n"); 
            $talk["To"] = fgets ($SMTPIN, 1024); 
            fputs($SMTPIN, "DATA\r\n");
            $talk["data"]=fgets( $SMTPIN,1024 );
            fputs($SMTPIN, "To: <".$this->to.">\r\nFrom: <".$this->from.">\r\n".$headers."\n\nSubject:".$this->subject."\r\n\r\n\r\n".$this->body."\r\n.\r\n");
            $talk["send"]=fgets($SMTPIN,256);
            //CLOSE CONNECTION AND EXIT ... 
            fputs ($SMTPIN, "QUIT\r\n"); 
            fclose($SMTPIN); 
            // 
        } 
        return $talk;
    } 
}
?>

contact_email.php

<?php 
include('SMTPconfig.php');
include('SMTPmail.php');
if($_SERVER["REQUEST_METHOD"] == "POST")
{
    $to = "";
    $from = $_POST['email'];
    $subject = "Enquiry";
    $body = $_POST['name'].'</br>'.$_POST['companyName'].'</br>'.$_POST['tel'].'</br>'.'<hr />'.$_POST['message'];
    $SMTPMail = new SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body);
    $SMTPChat = $SMTPMail->SendMail();
}
?>
9 iatboy Aug 05 2014 at 10:49

Jika Anda hanya menggunakan mail()fungsi tersebut, Anda perlu melengkapi file konfigurasi.

Anda perlu membuka perluasan email, dan menyetel SMTP smtp_portdan seterusnya, dan yang paling penting, nama pengguna dan sandi Anda. Tanpa itu, surat tidak dapat dikirim. Selain itu, Anda dapat menggunakan PHPMailkelas untuk mengirim.

9 vldfr Feb 11 2015 at 22:20

Cobalah dua hal ini secara terpisah dan bersamaan:

  1. Hapus if($_POST['submit']){}
  2. hapus $from(hanya nyali saya)
8 StephenM Jan 03 2015 at 09:32

Saya pikir ini harus melakukan trik. Saya baru saja menambahkan if(issetdan menambahkan rangkaian ke variabel di tubuh untuk memisahkan PHP dari HTML.

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com'; 
    $to = '[email protected]'; 
    $subject = 'Customer Inquiry';
    $body = "From:" .$name."\r\n E-Mail:" .$email."\r\n Message:\r\n" .$message;

if (isset($_POST['submit'])) 
{
    if (mail ($to, $subject, $body, $from)) 
    { 
        echo '<p>Your message has been sent!</p>';
    } 
    else 
    { 
        echo '<p>Something went wrong, go back and try again!</p>'; 
    }
}

?>
8 Machavity May 20 2016 at 19:45

Bagi siapa pun yang menemukan ini maju, saya tidak akan merekomendasikan menggunakan mail. Ada beberapa jawaban yang menyentuh hal ini, tetapi bukan alasannya .

mailFungsi PHP tidak hanya buram, ia sepenuhnya bergantung pada MTA apa pun yang Anda gunakan (yaitu Sendmail ) untuk melakukan pekerjaan itu. hanyamail akan memberitahu Anda jika MTA gagal menerimanya (yaitu Sendmail tidak aktif ketika Anda mencoba mengirim). Itu tidak dapat memberi tahu Anda apakah surat itu berhasil karena sudah diserahkan. Dengan demikian (seperti detail jawaban John Conde ), Anda sekarang bisa bermain-main dengan log MTA dan berharap itu memberi tahu Anda cukup banyak tentang kegagalan untuk memperbaikinya. Jika Anda menggunakan host bersama atau tidak memiliki akses ke log MTA, Anda kurang beruntung. Sayangnya, default untuk sebagian besar instalasi vanilla untuk Linux menanganinya dengan cara ini.

Pustaka surat ( PHPMailer , Zend Framework 2+, dll.), Melakukan sesuatu yang sangat berbeda dari mail. Mereka membuka soket langsung ke server email penerima dan kemudian mengirim perintah email SMTP langsung melalui soket itu. Dengan kata lain, kelas bertindak sebagai MTA-nya sendiri (perhatikan bahwa Anda dapat memberi tahu perpustakaan yang akan digunakan mailuntuk mengirim email, tetapi saya sangat menyarankan Anda untuk tidak melakukannya).

Ini berarti Anda kemudian dapat langsung melihat tanggapan dari server penerima (di PHPMailer, misalnya, Anda dapat mengaktifkan keluaran debugging ). Tidak perlu lagi menebak-nebak jika email gagal dikirim atau mengapa.

Jika Anda menggunakan SMTP (yaitu Anda menelepon isSMTP()), Anda bisa mendapatkan transkrip terperinci dari percakapan SMTP menggunakan SMTPDebugproperti.

Setel opsi ini dengan menyertakan baris seperti ini di skrip Anda:

$mail->SMTPDebug = 2;

Anda juga mendapatkan keuntungan dari antarmuka yang lebih baik. Dengan mailAnda harus mengatur semua header, lampiran, dll. Dengan perpustakaan, Anda memiliki fungsi khusus untuk melakukannya. Ini juga berarti fungsinya melakukan semua bagian yang rumit (seperti header).

6 Chiragpatel Jul 13 2015 at 14:27
$name = $_POST['name'];
$email = $_POST['email'];
$reciver = '/* Reciver Email address */';
if (filter_var($reciver, FILTER_VALIDATE_EMAIL)) {
    $subject = $name;
    // To send HTML mail, the Content-type header must be set.
    $headers = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
    $headers .= 'From:' . $email. "\r\n"; // Sender's Email
    //$headers .= 'Cc:' . $email. "\r\n"; // Carbon copy to Sender
    $template = '<div style="padding:50px; color:white;">Hello ,<br/>'
        . '<br/><br/>'
        . 'Name:' .$name.'<br/>'
        . 'Email:' .$email.'<br/>'
        . '<br/>'
        . '</div>';
    $sendmessage = "<div style=\"background-color:#7E7E7E; color:white;\">" . $template . "</div>";
    // Message lines should not exceed 70 characters (PHP rule), so wrap it.
    $sendmessage = wordwrap($sendmessage, 70);
    // Send mail by PHP Mail Function.
    mail($reciver, $subject, $sendmessage, $headers);
    echo "Your Query has been received, We will contact you soon.";
} else {
    echo "<span>* invalid email *</span>";
}
6 dEsta88 Oct 07 2014 at 05:33

Anda dapat menggunakan email konfigurasi dengan CodeIgniter . Misalnya, menggunakan SMTP (cara sederhana):

$config = Array(
        'protocol' => 'smtp',
        'smtp_host' => 'mail.domain.com', // Your SMTP host
        'smtp_port' => 26, // Default port for SMTP
        'smtp_user' => '[email protected]',
        'smtp_pass' => 'password',
        'mailtype' => 'html',
        'charset' => 'iso-8859-1',
        'wordwrap' => TRUE
);
$message = 'Your msg';
$this->load->library('email', $config);
$this->email->from('[email protected]', 'Title');
$this->email->to('[email protected]');
$this->email->subject('Header');
$this->email->message($message);

if($this->email->send()) 
{
   // Conditional true
}

Ini berhasil untuk saya!

4 GauravSirauthiya Jun 23 2015 at 17:58

Coba ini

if ($_POST['submit']) {
    $success= mail($to, $subject, $body, $from);
    if($success)
    { 
        echo '
        <p>Your message has been sent!</p>
        ';
    } else { 
        echo '
        <p>Something went wrong, go back and try again!</p>
        '; 
    }
}
4 JackCh Mar 20 2018 at 02:09

Mungkin masalahnya adalah konfigurasi server email. Untuk menghindari jenis masalah ini atau Anda tidak perlu khawatir tentang masalah server email, saya sarankan Anda menggunakan PHPMailer .

Ini adalah plugin yang memiliki semua yang diperlukan untuk mengirim email, dan satu-satunya hal yang harus Anda perhatikan adalah mengaktifkan port SMTP (Port: 25 dan 465).

require_once 'PHPMailer/PHPMailer.php';
require_once '/servicios/PHPMailer/SMTP.php';
require_once '/servicios/PHPMailer/Exception.php';

$mail = new \PHPMailer\PHPMailer\PHPMailer(true);
try {
    //Server settings
    $mail->SMTPDebug = 0;
    $mail->isSMTP();
    $mail->Host = 'smtp.gmail.com';
    $mail->SMTPAuth = true;
    $mail->Username = '[email protected]';
    $mail->Password = 'contrasenia';
    $mail->SMTPSecure = 'ssl';
    $mail->Port = 465;

    // Recipients
    $mail->setFrom('[email protected]', 'my name');
    $mail->addAddress('[email protected]');

    // Attachments
    $mail->addAttachment('optional file');         // Add files, is optional

    // Content
    $mail->isHTML(true);// Set email format to HTML
    $mail->Subject = utf8_decode("subject");
    $mail->Body    = utf8_decode("mail content");
    $mail->AltBody = '';
    $mail->send();
}
catch (Exception $e) {
    $error = $mail->ErrorInfo;
}
3 Daniel Sep 24 2017 at 10:50

Pastikan Anda telah menginstal Sendmail di server Anda.

Jika Anda telah memeriksa kode Anda dan memverifikasi bahwa tidak ada yang salah di sana, buka / var / mail dan periksa apakah folder itu kosong.

Jika kosong, Anda perlu melakukan:

sudo apt-get install sendmail

jika Anda menggunakan server Ubuntu.

3 aidangig Jan 31 2016 at 21:15

Pertama-tama, Anda mungkin memiliki terlalu banyak parameter untuk fungsi mail () ... Anda dapat memiliki maksimal lima, mail(to, subject, message, headers, parameters);

Sejauh $fromvariabel berjalan, itu akan secara otomatis datang dari webhost Anda jika Anda menggunakan cPanel Linux . Ini secara otomatis berasal dari nama pengguna cPanel dan alamat IP Anda.

$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com';
$to = '[email protected]';
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";

Pastikan juga Anda memiliki urutan variabel yang benar dalam fungsi mail () Anda.

Urutan itu, atau ada kemungkinan tidak berfungsi.mail($to, $subject, $message, etc.)

3 JohnSlegers Feb 10 2016 at 20:23

Jika Anda mengalami masalah saat mengirim email dengan PHP, pertimbangkan alternatif seperti PHPMailer atau SwiftMailer .

Saya biasanya menggunakan SwiftMailer setiap kali saya perlu mengirim email dengan PHP.


Penggunaan dasar:

require 'mail/swift_required.php';

$message = Swift_Message::newInstance()
    // The subject of your email
    ->setSubject('Jane Doe sends you a message')
    // The from address(es)
    ->setFrom(array('[email protected]' => 'Jane Doe'))
    // The to address(es)
    ->setTo(array('[email protected]' => 'Frank Stevens'))
    // Here, you put the content of your email
    ->setBody('<h3>New message</h3><p>Here goes the rest of my message</p>', 'text/html');

if (Swift_Mailer::newInstance(Swift_MailTransport::newInstance())->send($message)) {
    echo json_encode([
        "status" => "OK",
        "message" => 'Your message has been sent!'
    ], JSON_PRETTY_PRINT);
} else {
    echo json_encode([
        "status" => "error",
        "message" => 'Oops! Something went wrong!'
    ], JSON_PRETTY_PRINT);
}

Lihat dokumentasi resmi untuk informasi lebih lanjut tentang cara menggunakan SwiftMailer.

3 user3132194 Jun 21 2017 at 19:07

Bagi mereka yang tidak ingin menggunakan mailer eksternal dan ingin mail () di server Linux khusus.

Cara, bagaimana PHP mail, dijelaskan php.inidi bagian [mail function].

Parameter sendmail-pathmenjelaskan bagaimana sendmail dipanggil. Nilai defaultnya adalah sendmail -t -i, jadi jika Anda bekerja sendmail -t -i < message.txtdi konsol Linux - Anda akan selesai. Anda juga bisa menambahkan mail.logke debug dan memastikan mail () benar-benar dipanggil.

MTA yang berbeda dapat diterapkan sendmail. Mereka hanya membuat tautan simbolis ke biner mereka pada nama itu. Misalnya, di Debian defaultnya adalah Postfix . Konfigurasikan MTA Anda untuk mengirim email dan mengujinya dari konsol dengan sendmail -v -t -i < message.txt. File message.txtharus berisi semua header pesan dan badan, alamat tujuan amplop akan diambil dari To:header. Contoh:

From: [email protected]
To: [email protected]
Subject: Test mail via sendmail.

Text body.

Saya lebih suka menggunakan ssmtp sebagai MTA karena sederhana dan tidak perlu menjalankan daemon dengan port terbuka. ssmtp hanya cocok untuk mengirim email dari localhost . Itu juga dapat mengirim email yang diautentikasi melalui akun Anda di layanan surat publik. Instal ssmtp dan edit file konfigurasi /etc/ssmtp/ssmtp.conf. Agar juga dapat menerima email sistem lokal ke akun Unix (peringatan ke root dari tugas cron, misalnya) konfigurasikan /etc/ssmtp/revaliasesfile.

Berikut konfigurasi saya untuk akun saya di surat Yandex:

[email protected]
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
[email protected]
AuthPass=password
2 TonyLuigiC Apr 05 2017 at 08:09

Ini hanya akan mempengaruhi segelintir pengguna, tetapi saya ingin itu didokumentasikan untuk segelintir kecil itu. Anggota dari segelintir kecil itu menghabiskan 6 jam untuk memecahkan masalah skrip email PHP yang berfungsi karena masalah ini.

Jika Anda pergi ke universitas yang menjalankan XAMPP dari www.AceITLab.com, Anda harus tahu apa yang tidak diberitahukan profesor kami kepada kami: Firewall AceITLab (bukan firewall Windows) memblokir MercuryMail di XAMPP. Anda harus menggunakan klien email alternatif, pir bekerja untuk kami. Anda harus mengirim ke akun Gmail dengan pengaturan keamanan rendah.

Ya, saya tahu, ini sama sekali tidak berguna untuk email dunia nyata. Namun, dari apa yang saya lihat, lingkungan akademis dan dunia nyata seringkali memiliki sedikit kesamaan.

1 Ron Apr 01 2017 at 10:30

Jika Anda menjalankan kode ini di server lokal (yaitu komputer Anda untuk tujuan pengembangan) itu tidak akan mengirim email ke penerima. Ini akan membuat .txtfile di folder bernama mailoutput.

Dalam kasus jika Anda menggunakan layanan selang gratis, seperti 000webhostatau hostinger, penyedia layanan tersebut menonaktifkan mail()fungsi untuk mencegah penggunaan yang tidak diinginkan dari spoofing email, spamming, dll. Saya lebih suka Anda menghubungi mereka untuk mengetahui apakah mereka mendukung fitur ini.

Jika Anda yakin bahwa penyedia layanan mendukung fungsi mail (), Anda dapat memeriksa manual PHP ini untuk referensi lebih lanjut,

Surat PHP ()

Untuk memeriksa apakah layanan hosting Anda mendukung fungsi mail (), coba jalankan kode ini (ingat untuk mengubah alamat email penerima) :

<?php
    $to      = '[email protected]';
    $subject = 'the subject';
    $message = 'hello';
    $headers = 'From: [email protected]' . "\r\n" .
        'Reply-To: [email protected]' . "\r\n" .
        'X-Mailer: PHP/' . phpversion();

    mail($to, $subject, $message, $headers);
?>
1 BadLoser Aug 21 2019 at 16:14

Instalasi sendmail untuk Debian 10.0.0 ('Buster') ternyata sepele!

php.ini

[mail function]
sendmail_path=/usr/sbin/sendmail -t -i
; (Other directives are mostly windows)

Instalasi paket sendmail standar (mengizinkan 'send'):

su -                                        # Install as user 'root'
dpkg --list                                 # Is install necessary?
apt-get install sendmail sendmail-cf m4     # Note multiple package selection
sendmailconfig                              # Respond all 'Y' for new install

Perintah berguna lain-lain:

which sendmail                              # /usr/sbin/sendmail
which sendmailconfig                        # /usr/sbin/sendmailconfig
man sendmail                                # Documentation
systemctl restart sendmail                  # As and when required

Verifikasi (kemampuan mengirim)

echo "Subject: sendmail test" | sendmail -v <yourEmail>@gmail.com

Di atas membutuhkan waktu sekitar 5 menit. Lalu saya buang-buang waktu 5 jam ... Jangan lupa periksa folder spam Anda !

SuReSh Apr 28 2015 at 13:08

Ada beberapa kemungkinan:

  1. Anda menghadapi masalah server. Server tidak memiliki server email apa pun. Jadi email Anda tidak berfungsi, karena kode Anda baik-baik saja dan email berfungsi dengan tipe.

  2. Anda tidak mendapatkan nilai yang diposting. Coba kode Anda dengan nilai statis.

  3. Gunakan email SMTP untuk mengirim email ...

krishna Dec 23 2018 at 21:25

Anda dapat melihat kesalahan Anda dengan:

error_reporting(E_ALL);

Dan kode contoh saya adalah:

<?php
    use PHPMailer\PHPMailer\PHPMailer;
    require 'PHPMailer.php';
    require 'SMTP.php';
    require 'Exception.php';

    $name = $_POST['name'];
    $mailid = $_POST['mail'];
    $mail = new PHPMailer;
    $mail->IsSMTP();
    $mail->SMTPDebug = 0;                   // Set mailer to use SMTP
    $mail->Host = 'smtp.gmail.com';         // Specify main and backup server
    $mail->Port = 587;                      // Set the SMTP port
    $mail->SMTPAuth = true;                 // Enable SMTP authentication
    $mail->Username = '[email protected]';  // SMTP username
    $mail->Password = 'password';           // SMTP password
    $mail->SMTPSecure = 'tls';              // Enable encryption, 'ssl' also accepted

    $mail->From = '[email protected]';
    $mail->FromName = 'name';
    $mail->AddAddress($mailid, $name);       // Name is optional
    $mail->IsHTML(true);                     // Set email format to HTML
    $mail->Subject = 'Here is the subject';
    $mail->Body    = 'Here is your message' ;
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
    if (!$mail->Send()) {
       echo 'Message could not be sent.';
       echo 'Mailer Error: ' . $mail->ErrorInfo;
       exit;
    }
    echo 'Message has been sent';
?>
ofricofri Aug 16 2020 at 08:44

Jika Anda terjebak dengan aplikasi yang dihosting di Hostgator, inilah yang memecahkan masalah saya. Terima kasih banyak kepada orang yang memposting solusi terperinci. Jika suatu hari tautannya offline, berikut ringkasannya:

  • Cari jalur sendmail di server Anda. Cara sederhana untuk memeriksa, adalah untuk menulis sementara kode berikut di halaman yang hanya Anda akan mengakses, membaca info yang dihasilkan: <?php phpinfo(); ?>. Buka halaman ini, dan cari sendmail path. (Kemudian, jangan lupa untuk menghapus kode ini!)
  • Masalah dan perbaikan: jika jalur sendmail Anda hanya mengatakan -t -i, maka edit server Anda php.inidan tambahkan baris berikut:sendmail_path = /usr/sbin/sendmail -t -i;

Tetapi, setelah dapat mengirim email dengan mail()fungsi PHP , saya mengetahui bahwa itu mengirim email yang tidak diautentikasi, yang menyebabkan masalah lain. Semua email tersebut jatuh ke kotak surat sampah Hotmail saya, dan beberapa email tidak pernah terkirim, yang menurut saya terkait dengan fakta bahwa email tersebut tidak diautentikasi. Itu sebabnya saya memutuskan untuk beralih dari mail()ke PHPMailerdengan SMTP.