Fungsi PHP mail tidak menyelesaikan pengiriman 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";
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.html
halaman 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
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
TRUE
jika surat berhasil diterima untuk pengiriman,FALSE
sebaliknya. 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
FALSE
nilai 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
TRUE
nilai 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 FALSE
akan membantu mengarahkan Anda ke arah yang benar sedangkan TRUE
yang 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 $_POST
untuk mencari nilai formulir Anda. Jika Anda telah mengaturnya GET
atau tidak mengaturnya sama sekali, pastikan Anda menggunakan $_GET
untuk mencari nilai formulir Anda.
Pastikan action
nilai formulir Anda menunjuk ke lokasi yang benar
Pastikan action
atribut 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 localhost
server 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.ini
atau .user.ini
atau .htaccess
mungkin.)
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:
- mail-tester.com (gratis / sederhana)
- glockapps.com (gratis / $$$)
- senforensics.com (daftar / $$$)
- mailtrap.io (pro / $$$)
- ultratools /… / emailTest (gratis / pemeriksaan MX saja)
- Berbagai: http://www.verticalresponse.com/blog/7-email-testing-delivery-tools/
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:
- Makhluk paling populer: PHPMailer
- Juga berfitur lengkap: SwiftMailer
- Atau bahkan PEAR :: Mail yang lebih lama .
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.)
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>';
}
- Selalu coba mengirim header dalam fungsi mail.
- Jika Anda mengirim email melalui localhost maka lakukan pengaturan SMTP untuk mengirim email.
- Jika Anda mengirim email melalui server, periksa apakah fitur pengiriman email diaktifkan di server Anda.
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";
}
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.
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.
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();
}
?>
Jika Anda hanya menggunakan mail()
fungsi tersebut, Anda perlu melengkapi file konfigurasi.
Anda perlu membuka perluasan email, dan menyetel SMTP smtp_port
dan seterusnya, dan yang paling penting, nama pengguna dan sandi Anda. Tanpa itu, surat tidak dapat dikirim. Selain itu, Anda dapat menggunakan PHPMail
kelas untuk mengirim.
Cobalah dua hal ini secara terpisah dan bersamaan:
- Hapus
if($_POST['submit']){}
- hapus
$from
(hanya nyali saya)
Saya pikir ini harus melakukan trik. Saya baru saja menambahkan if(isset
dan 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>';
}
}
?>
Bagi siapa pun yang menemukan ini maju, saya tidak akan merekomendasikan menggunakan mail
. Ada beberapa jawaban yang menyentuh hal ini, tetapi bukan alasannya .
mail
Fungsi 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 mail
untuk 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 menggunakanSMTPDebug
properti.Setel opsi ini dengan menyertakan baris seperti ini di skrip Anda:
$mail->SMTPDebug = 2;
Anda juga mendapatkan keuntungan dari antarmuka yang lebih baik. Dengan mail
Anda 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).
$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>";
}
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!
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>
';
}
}
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;
}
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.
Pertama-tama, Anda mungkin memiliki terlalu banyak parameter untuk fungsi mail () ... Anda dapat memiliki maksimal lima, mail(to, subject, message, headers, parameters);
Sejauh $from
variabel 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.)
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.
Bagi mereka yang tidak ingin menggunakan mailer eksternal dan ingin mail () di server Linux khusus.
Cara, bagaimana PHP mail, dijelaskan php.ini
di bagian [mail function]
.
Parameter sendmail-path
menjelaskan bagaimana sendmail dipanggil. Nilai defaultnya adalah sendmail -t -i
, jadi jika Anda bekerja sendmail -t -i < message.txt
di konsol Linux - Anda akan selesai. Anda juga bisa menambahkan mail.log
ke 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.txt
harus 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/revaliases
file.
Berikut konfigurasi saya untuk akun saya di surat Yandex:
[email protected]
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
[email protected]
AuthPass=password
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.
Jika Anda menjalankan kode ini di server lokal (yaitu komputer Anda untuk tujuan pengembangan) itu tidak akan mengirim email ke penerima. Ini akan membuat .txt
file di folder bernama mailoutput
.
Dalam kasus jika Anda menggunakan layanan selang gratis, seperti 000webhost
atau 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,
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);
?>
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 !
Ada beberapa kemungkinan:
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.
Anda tidak mendapatkan nilai yang diposting. Coba kode Anda dengan nilai statis.
Gunakan email SMTP untuk mengirim email ...
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';
?>
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 carisendmail path
. (Kemudian, jangan lupa untuk menghapus kode ini!) - Masalah dan perbaikan: jika jalur sendmail Anda hanya mengatakan
-t -i
, maka edit server Andaphp.ini
dan 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 PHPMailer
dengan SMTP.