Mengirim email dengan PHP dari server SMTP

131
$from = "[email protected]";
$headers = "From:" . $from;
echo mail ("[email protected]" ,"testmailfunction" , "Oj",$headers);

Saya kesulitan mengirim email dalam PHP. Saya mendapatkan error: SMTP server response: 530 SMTP authentication is required.

Saya mendapat kesan bahwa Anda dapat mengirim email tanpa SMTP untuk memverifikasi. Saya tahu bahwa email ini mungkin akan difilter, tetapi itu tidak masalah sekarang.

[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = localhost
; http://php.net/smtp-port
smtp_port = 25

; For Win32 only.
; http://php.net/sendmail-from
sendmail_from = someonelse@example.com

Ini adalah pengaturan dalam php.inifile. Bagaimana saya mengatur SMTP? Apakah ada server SMTP yang tidak memerlukan verifikasi atau haruskah saya membuat server sendiri?

Borut Flis
sumber

Jawaban:

168

Ketika Anda mengirim e-mail melalui server yang memerlukan SMTP Auth, Anda benar-benar perlu menentukannya, dan mengatur host, nama pengguna dan kata sandi (dan mungkin port jika bukan yang default - 25).

Misalnya, saya biasanya menggunakan PHPMailer dengan pengaturan serupa dengan yang ini:

$mail = new PHPMailer();

// Settings
$mail->IsSMTP();
$mail->CharSet = 'UTF-8';

$mail->Host       = "mail.example.com"; // SMTP server example
$mail->SMTPDebug  = 0;                     // enables SMTP debug information (for testing)
$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->Port       = 25;                    // set the SMTP port for the GMAIL server
$mail->Username   = "username"; // SMTP account username example
$mail->Password   = "password";        // SMTP account password example

// Content
$mail->isHTML(true);                                  // Set email format to HTML
$mail->Subject = 'Here is the subject';
$mail->Body    = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

$mail->send();

Anda dapat menemukan lebih banyak tentang PHPMailer di sini: https://github.com/PHPMailer/PHPMailer

Ivo Pereira
sumber
21
+1 untuk phpMailer - ini adalah alternatif orang waras untuk mail()fungsi bawaan PHP .
SDC
8
Perlu dicatat bagi mereka yang tersandung pada jawaban ini bahwa PHPMailer juga dibangun di WordPress dan dapat dikonfigurasi menggunakan 'phpmailer_init'hook tindakan. Ini adalah cara yang nyaman untuk mengatur WordPress untuk surat SMTP atau Amazon SES (yang mendukung koneksi SMTP).
Matt van Andel
1
Apakah PHP Mailer diizinkan untuk digunakan dalam skrip berbayar?
Luka
2
@Luka Ya, benar. Menurut file lisensi mereka PHPMailer menggunakan lisensi LGPL 2.1, yang memungkinkan penggunaan komersial.
Alejandro
Apakah saya perlu melakukan sesuatu yang khusus untuk menggunakan kode ini? Di mana saya meletakkan ini? Bisakah saya menyebutnya dengan formulir HTML5 dengan permintaan POST? Bagaimana cara mengirim Email setelah saya membuat objek PHPMailer ini?
Aaron Franke
53
<?php
ini_set("SMTP", "aspmx.l.google.com");
ini_set("sendmail_from", "[email protected]");

$message = "The mail message was sent with the following mail setting:\r\nSMTP = aspmx.l.google.com\r\nsmtp_port = 25\r\nsendmail_from = [email protected]";

$headers = "From: [email protected]";

mail("[email protected]", "Testing", $message, $headers);
echo "Check your email now....&lt;BR/>";
?>

atau, untuk lebih jelasnya, baca terus .

Dipesh Parmar
sumber
IP yang Anda gunakan untuk mengirim email tidak diotorisasi ke 550-5.7.1 mengirim email langsung ke server kami. Saya mendapatkan kesalahan ini. yang saya inginkan adalah relay email terbuka.
Borut Flis
Saya tidak punya IP statis. Apakah Anda mengetahui adanya relai email Open.
Borut Flis
1
Selain itu lihat support.google.com/a/answer/176600?hl=id untuk google SMTP relay.
fyrye
5
Ini adalah jawaban terbaik untuk php mail()masalah fungsi godaddy - 2017 - tidak harus mengunduh PHPMailer atau sumber daya pihak ke-3 lainnya - terima kasih
soulshined
4
Tautan "READ ON" rusak
vladkras
46

Untuk pengguna Unix, mail () sebenarnya menggunakan perintah Sendmail untuk mengirim email. Alih-alih memodifikasi aplikasi, Anda dapat mengubah lingkungan. msmtp adalah klien SMTP dengan sintaks CLI Sendmail yang kompatibel yang berarti dapat digunakan sebagai pengganti Sendmail. Ini hanya membutuhkan perubahan kecil untuk php.ini Anda.

sendmail_path = "/usr/bin/msmtp -C /path/to/your/config -t"

Kemudian bahkan fungsi mail () yang rendah dapat bekerja dengan kebaikan SMTP. Ini sangat berguna jika Anda mencoba menghubungkan aplikasi yang sudah ada ke layanan email seperti sendgrid atau mandrill tanpa memodifikasi aplikasi.

txyoji
sumber
1
Solusi hebat, gunakan di beberapa server sekarang!
raice
3
Menerapkan ini pada wadah Docker saya untuk aplikasi yang tidak menggunakan perpustakaan surat.
Batandwa
Jalur migrasi yang sangat baik dari vanilla mail()ke sesuatu yang mendukung SMTP. Terima kasih!
rinogo
MSMTP juga tersedia untuk Windows. Unduhan yang jelas memiliki versi 1.4. Versi yang saya temukan di suatu tempat adalah 1.6.2. Tidak tahu apakah ada 1.8.6 untuk Windows.
Bilbo
Penulis berhenti menyediakan binari Windows sebelum 2016 Februari.
Bilbo
17

Masalahnya adalah bahwa mail()fungsi PHP memiliki fungsi yang sangat terbatas. Ada beberapa cara untuk mengirim email dari PHP.

  1. mail()menggunakan server SMTP di sistem Anda. Setidaknya ada dua server yang dapat Anda gunakan di Windows: hMailServer dan xmail . Saya menghabiskan beberapa jam mengkonfigurasi dan membangunkan mereka. Yang pertama lebih sederhana menurut saya. Saat ini, hMailServer bekerja pada Windows 7 x64.
  2. mail()menggunakan server SMTP di mesin jarak jauh atau virtual dengan Linux. Tentu saja, layanan email nyata seperti Gmail tidak memungkinkan koneksi langsung tanpa kredensial atau kunci. Anda dapat mengatur mesin virtual atau menggunakan mesin yang terletak di LAN Anda. Kebanyakan distro linux memiliki server mail di luar kotak. Konfigurasikan dan bersenang-senanglah. Saya menggunakan exim4 default pada Debian 7 yang mendengarkan antarmuka LAN-nya.
  3. Perpustakaan pengiriman menggunakan koneksi langsung. Libs lebih mudah diatur. Saya menggunakan SwiftMailer dan dengan sempurna mengirim email dari akun Gmail. Saya pikir PHPMailer juga cukup bagus.

Apa pun pilihan Anda, saya sarankan Anda menggunakan beberapa lapisan abstraksi. Anda dapat menggunakan perpustakaan PHP pada mesin pengembangan Anda yang menjalankan Windows dan cukup mail()berfungsi pada mesin produksi dengan Linux. Lapisan abstraksi memungkinkan Anda untuk menukar driver surat tergantung pada sistem yang menjalankan aplikasi Anda. Buat MyMailerkelas atau antarmuka abstrak dengan send()metode abstrak . Mewarisi dua kelas MyPhpMailerdan MySwiftMailer. Terapkan send()metode dengan cara yang tepat.

George Sovetov
sumber
17

Berikut adalah cara untuk melakukannya dengan PHP PEAR

// Pear Mail Library
require_once "Mail.php";

$from = '<[email protected]>'; //change this to your email address
$to = '<[email protected]>'; // change to address
$subject = 'Insert subject here'; // subject of mail
$body = "Hello world! this is the content of the email"; //content of mail

$headers = array(
    'From' => $from,
    'To' => $to,
    'Subject' => $subject
);

$smtp = Mail::factory('smtp', array(
        'host' => 'ssl://smtp.gmail.com',
        'port' => '465',
        'auth' => true,
        'username' => '[email protected]', //your gmail account
        'password' => 'snip' // your password
    ));

// Send the mail
$mail = $smtp->send($to, $headers, $body);

//check mail sent or not
if (PEAR::isError($mail)) {
    echo '<p>'.$mail->getMessage().'</p>';
} else {
    echo '<p>Message successfully sent!</p>';
}

Jika Anda menggunakan SMTP Gmail, ingatlah untuk mengaktifkan SMTP di akun Gmail Anda, di bawah pengaturan

EDIT: Jika Anda tidak dapat menemukan Mail.php di debian / ubuntu Anda dapat menginstal php-pear

sudo apt install php-pear

Kemudian instal ekstensi email:

sudo pear install mail
sudo pear install Net_SMTP
sudo pear install Auth_SASL
sudo pear install mail_mime

Maka Anda harus dapat memuatnya dengan cara require_once "Mail.php" lain yang berada di sini:/usr/share/php/Mail.php

Bolli
sumber
1
require_once ('/usr/share/somewhere/Mail.php');
10

Ada beberapa server SMTP yang bekerja tanpa otentikasi, tetapi jika server membutuhkan otentikasi, tidak ada cara untuk mengelak dari itu.

Fungsi surat bawaan PHP sangat terbatas - menentukan server SMTP hanya dimungkinkan di Windows. Pada * nix, mail()akan menggunakan binari OS.

Jika Anda ingin mengirim E-Mail ke server SMTP yang sewenang-wenang di internet, pertimbangkan untuk menggunakan perpustakaan seperti SwiftMailer . Itu akan memungkinkan Anda untuk menggunakan, misalnya, server keluar Google Mail.

Pekka
sumber
2

Dalam kasus di mana Anda meng-hosting situs Wordpress di Linux dan memiliki akses server, Anda dapat menyimpan beberapa sakit kepala dengan menginstal msmtp yang memungkinkan Anda mengirim via smtp dari fungsi standar php mail (). msmtp adalah alternatif yang lebih sederhana untuk postfix yang membutuhkan konfigurasi lebih banyak.

Berikut langkah-langkahnya:

Instal msmtp

sudo apt-get install msmtp-mta ca-certificates

Buat file konfigurasi baru:

sudo nano /etc/msmtprc

... dengan informasi konfigurasi berikut:

# Set defaults.    
defaults

# Enable or disable TLS/SSL encryption.
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt

# Set up a default account's settings.
account default
host <smtp.example.net>
port 587
auth on
user <username@example.net>
password <password>
from <address-to-receive-bounces@example.net>
syslog LOG_MAIL

Anda perlu mengganti data konfigurasi yang diwakili oleh semua yang ada di dalam "<" dan ">" (inklusif, hapus ini). Untuk host / nama pengguna / kata sandi, gunakan kredensial normal Anda untuk mengirim email melalui penyedia email Anda.

Beri tahu PHP untuk menggunakannya

sudo nano /etc/php5/apache2/php.ini

Tambahkan baris ini:

sendmail_path = /usr/bin/msmtp -t

Dokumentasi lengkap dapat ditemukan di sini:

https://marlam.de/msmtp/

Peter Drinnan
sumber
ssmtp juga solusi lihat (panduan Prancis): elliptips.info/guide-debian-7-envoi-de-mails-ligne-de-commande
ıɾuǝʞ