Kirim email menggunakan server SMTP GMail dari halaman PHP

389

Saya mencoba mengirim email melalui server SMTP GMail dari halaman PHP, tetapi saya mendapatkan kesalahan ini:

kegagalan otentikasi [SMTP: SMTP server tidak memiliki otentikasi dukungan (kode: 250, respons: mx.google.com siap melayani Anda, [98.117.99.235] UKURAN 35651584 8BULMIME STARTTLS ENHANCEDSTATUSCODES PIPELINING)]

Adakah yang bisa membantu? Ini kode saya:

<?php
require_once "Mail.php";

$from = "Sandra Sender <[email protected]>";
$to = "Ramona Recipient <[email protected]>";
$subject = "Hi!";
$body = "Hi,\n\nHow are you?";

$host = "smtp.gmail.com";
$port = "587";
$username = "[email protected]";
$password = "testtest";

$headers = array ('From' => $from,
  'To' => $to,
  'Subject' => $subject);
$smtp = Mail::factory('smtp',
  array ('host' => $host,
    'port' => $port,
    'auth' => true,
    'username' => $username,
    'password' => $password));

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

if (PEAR::isError($mail)) {
  echo("<p>" . $mail->getMessage() . "</p>");
 } else {
  echo("<p>Message successfully sent!</p>");
 }
?>
skb
sumber

Jawaban:

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

$from = '<[email protected]>';
$to = '<[email protected]>';
$subject = 'Hi!';
$body = "Hi,\n\nHow are you?";

$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]',
        'password' => 'passwordxxx'
    ));

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

if (PEAR::isError($mail)) {
    echo('<p>' . $mail->getMessage() . '</p>');
} else {
    echo('<p>Message successfully sent!</p>');
}
pavan kumar
sumber
141
apa itu Mail.php?? dari mana saya mendapatkan file ini?
Zain Shaikh
18
bisa ada yang tolong beri saya tautan di mana saya bisa mendapatkan file Mail.php. Karena saya mencobanya dan itu tidak akan berhasil Terima kasih
Yoosuf
11
Di mana simbol @ dalam contoh ini di atas? Saya tidak melihat satu pun di sana!
darkAsPitch
6
Saya percaya bahwa myaccount.gmail.com sama dengan [email protected] dalam standar email.
Penerbangan Sherwin
3
Anda tidak perlu memasukkan @gmail jika Anda memiliki server yang ditentukan. Cukup ketik myaccountuntuk nama pengguna.
Jack
106

Dengan menggunakan Swift mailer , cukup mudah untuk mengirim email melalui kredensial Gmail:

<?php
require_once 'swift/lib/swift_required.php';

$transport = Swift_SmtpTransport::newInstance('smtp.gmail.com', 465, "ssl")
  ->setUsername('GMAIL_USERNAME')
  ->setPassword('GMAIL_PASSWORD');

$mailer = Swift_Mailer::newInstance($transport);

$message = Swift_Message::newInstance('Test Subject')
  ->setFrom(array('[email protected]' => 'ABC'))
  ->setTo(array('[email protected]'))
  ->setBody('This is a test mail.');

$result = $mailer->send($message);
?>
shasi kanth
sumber
2
Ini berfungsi "ke yang pertama" hanya mengubah GMAIL_USERNAME, GMAIL_PASSWORD, dan alamat Dari dan Ke. Tidak ada solusi lain yang bekerja untuk saya. Terima kasih.
Marco Muciño
7
Saya setuju, swift mailer adalah solusi drop in mail yang jauh lebih mudah daripada main-main dengan pir. Jangan lupa untuk mengaktifkan ekstensi php_openssl PHP.
Soth
1
Solusi yang bagus menggunakan SwiftMailer! +1
Amal Murali
1
arrrgh. saya bisa membuat swiftmailer bekerja. saya tidak tahu bagaimana cara menggunakan "komposer" itu jadi saya baru saja mengunduh zip swiftmailer dari github kemudian saya mengaktifkan open_ssl kemudian memberikan email dan kata sandi gmail saya tetapi tetap tidak berhasil.
boi_echos
3
ah maaf atas kebodohanku. Anda harus membuka akun gmail Anda karena ada email yang memberi tahu Anda untuk mengaktifkan "aplikasi yang kurang aman". maka sekarang sudah berfungsi heheh
boi_echos
33

Saya tidak merekomendasikan Pear Mail. Belum diperbarui sejak 2010. Baca juga file sumbernya; kode sumbernya hampir usang, ditulis dalam gaya PHP 4 dan banyak kesalahan / bug telah diposting (Google it). Saya menggunakan Swift Mailer.

Swift Mailer terintegrasi ke dalam aplikasi web apa pun yang ditulis dalam PHP 5, menawarkan pendekatan berorientasi objek yang fleksibel dan elegan untuk mengirim email dengan banyak fitur.

Kirim email menggunakan SMTP, sendmail, postfix, atau implementasi Transport kustom Anda sendiri.

Mendukung server yang memerlukan nama pengguna & kata sandi dan / atau enkripsi.

Lindungi dari serangan injeksi tajuk tanpa menghapus konten data permintaan.

Kirim email HTML / multipart yang sesuai dengan MIME.

Gunakan plug-in event-driven untuk menyesuaikan perpustakaan.

Tangani lampiran besar dan gambar inline / tertanam dengan penggunaan memori rendah.

Ini adalah sumber gratis dan terbuka yang dapat Anda unduh Swift Mailer dan unggah ke server Anda. (Daftar fitur disalin dari situs web pemilik).

Contoh kerja Gmail SSL / SMTP dan Swift Mailer ada di sini ...

// Swift Mailer Library
require_once '../path/to/lib/swift_required.php';

// Mail Transport
$transport = Swift_SmtpTransport::newInstance('ssl://smtp.gmail.com', 465)
    ->setUsername('[email protected]') // Your Gmail Username
    ->setPassword('my_secure_gmail_password'); // Your Gmail Password

// Mailer
$mailer = Swift_Mailer::newInstance($transport);

// Create a message
$message = Swift_Message::newInstance('Wonderful Subject Here')
    ->setFrom(array('[email protected]' => 'Sender Name')) // can be $_POST['email'] etc...
    ->setTo(array('[email protected]' => 'Receiver Name')) // your email / multiple supported.
    ->setBody('Here is the <strong>message</strong> itself. It can be text or <h1>HTML</h1>.', 'text/html');

// Send the message
if ($mailer->send($message)) {
    echo 'Mail sent successfully.';
} else {
    echo 'I am sure, your configuration are not correct. :(';
}

Saya harap ini membantu. Selamat coding ... :)

Madan Sapkota
sumber
1
Ini tidak lagi berfungsi, saya selalu menerima pesan balasan "535-5.7.8 Nama pengguna dan Kata Sandi tidak diterima". Kredensial saya baik-baik saja dan saya telah mengatur "izinkan aplikasi yang kurang aman" menjadi AKTIF. Adakah yang tahu cara memperbaikinya?
AndrewB
Swift sepertinya tidak berfungsi di PHP 5.x - tidak mengerti ?? menyatu - hanya meledak.
HerrimanCoder
28
<?php
date_default_timezone_set('America/Toronto');

require_once('class.phpmailer.php');
//include("class.smtp.php"); // optional, gets called from within class.phpmailer.php if not already loaded

$mail             = new PHPMailer();

$body             = "gdssdh";
//$body             = eregi_replace("[\]",'',$body);

$mail->IsSMTP(); // telling the class to use SMTP
//$mail->Host       = "ssl://smtp.gmail.com"; // SMTP server
$mail->SMTPDebug  = 1;                     // enables SMTP debug information (for testing)
                                           // 1 = errors and messages
                                           // 2 = messages only
$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->SMTPSecure = "ssl";                 // sets the prefix to the servier
$mail->Host       = "smtp.gmail.com";      // sets GMAIL as the SMTP server
$mail->Port       = 465;                   // set the SMTP port for the GMAIL server
$mail->Username   = "[email protected]";  // GMAIL username
$mail->Password   = "password";            // GMAIL password

$mail->SetFrom('[email protected]', 'PRSPS');

//$mail->AddReplyTo("[email protected]', 'First Last");

$mail->Subject    = "PRSPS password";

//$mail->AltBody    = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test

$mail->MsgHTML($body);

$address = "[email protected]";
$mail->AddAddress($address, "user2");

//$mail->AddAttachment("images/phpmailer.gif");      // attachment
//$mail->AddAttachment("images/phpmailer_mini.gif"); // attachment

if(!$mail->Send()) {
  echo "Mailer Error: " . $mail->ErrorInfo;
} else {
  echo "Message sent!";
}

?>
Deept Raghav
sumber
Mengapa Anda mengatur host dua kali dan yang mana yang benar?
Emile Bergeron
Di mana saya mendapatkan file class.phpmailer.php ?? Hanya menyisipkan kode tidak begitu membantu, sertakan deskripsi lebih lanjut tentang kode juga!
GeneCode
Sementara beberapa sintaks sudah usang, PHPMailer akhirnya menjadi solusi terbaik untuk saya, +1
zoltar
20

SwiftMailer dapat mengirim E-Mail menggunakan server eksternal.

berikut adalah contoh yang menunjukkan cara menggunakan server Gmail:

require_once "lib/Swift.php";
require_once "lib/Swift/Connection/SMTP.php";

//Connect to localhost on port 25
$swift =& new Swift(new Swift_Connection_SMTP("localhost"));


//Connect to an IP address on a non-standard port
$swift =& new Swift(new Swift_Connection_SMTP("217.147.94.117", 419));


//Connect to Gmail (PHP5)
$swift = new Swift(new Swift_Connection_SMTP(
    "smtp.gmail.com", Swift_Connection_SMTP::PORT_SECURE, Swift_Connection_SMTP::ENC_TLS));
Pekka
sumber
14

Kode seperti yang tercantum dalam pertanyaan membutuhkan dua perubahan

$host = "ssl://smtp.gmail.com";
$port = "465";

Port 465 diperlukan untuk koneksi SSL.

s01ipsist
sumber
6

Kirim Email menggunakan perpustakaan phpMailer melalui Gmail. Harap donwload file perpustakaan dari Github

<?php
/**
 * This example shows settings to use when sending via Google's Gmail servers.
 */
//SMTP needs accurate times, and the PHP time zone MUST be set
//This should be done in your php.ini, but this is how to do it if you don't have access to that
date_default_timezone_set('Etc/UTC');
require '../PHPMailerAutoload.php';
//Create a new PHPMailer instance
$mail = new PHPMailer;
//Tell PHPMailer to use SMTP
$mail->isSMTP();
//Enable SMTP debugging
// 0 = off (for production use)
// 1 = client messages
// 2 = client and server messages
$mail->SMTPDebug = 2;
//Ask for HTML-friendly debug output
$mail->Debugoutput = 'html';
//Set the hostname of the mail server
$mail->Host = 'smtp.gmail.com';
// use
// $mail->Host = gethostbyname('smtp.gmail.com');
// if your network does not support SMTP over IPv6
//Set the SMTP port number - 587 for authenticated TLS, a.k.a. RFC4409 SMTP submission
$mail->Port = 587;
//Set the encryption system to use - ssl (deprecated) or tls
$mail->SMTPSecure = 'tls';
//Whether to use SMTP authentication
$mail->SMTPAuth = true;
//Username to use for SMTP authentication - use full email address for gmail
$mail->Username = "[email protected]";
//Password to use for SMTP authentication
$mail->Password = "yourpassword";
//Set who the message is to be sent from
$mail->setFrom('[email protected]', 'First Last');
//Set an alternative reply-to address
$mail->addReplyTo('[email protected]', 'First Last');
//Set who the message is to be sent to
$mail->addAddress('[email protected]', 'John Doe');
//Set the subject line
$mail->Subject = 'PHPMailer GMail SMTP test';
//Read an HTML message body from an external file, convert referenced images to embedded,
//convert HTML into a basic plain-text alternative body
$mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__));
//Replace the plain text body with one created manually
$mail->AltBody = 'This is a plain-text message body';
//Attach an image file
$mail->addAttachment('images/phpmailer_mini.png');
//send the message, check for errors
if (!$mail->send()) {
    echo "Mailer Error: " . $mail->ErrorInfo;
} else {
    echo "Message sent!";
}
Bhavin Solanki
sumber
5

Saya punya masalah ini juga. Saya menetapkan pengaturan yang benar dan telah mengaktifkan aplikasi yang kurang aman tetapi tetap tidak berfungsi. Akhirnya, saya mengaktifkan https://accounts.google.com/UnlockCaptcha ini , dan itu berhasil untuk saya. Saya harap ini membantu seseorang.

Penyiasat
sumber
4

Gmail membutuhkan port 465, dan itu juga kode dari phpmailer :)

Peter Mortensen
sumber
4

Untuk menginstal PEAR's Mail.php di Ubuntu, jalankan serangkaian perintah berikut:

    sudo apt-get install php-pear
    sudo pear install mail
    sudo pear install Net_SMTP
    sudo pear install Auth_SASL
    sudo pear install mail_mime
Nahid
sumber
0

Saya punya solusi untuk akun GSuite yang tidak memiliki sufix "@ gmail.com". Juga saya pikir ini akan berfungsi untuk akun GSuite dengan @ gmail.com tetapi belum mencobanya. Pertama, Anda harus memiliki hak istimewa untuk mengubah opsi "aplikasi yang kurang aman" untuk akun GSuite Anda. Jika Anda memiliki hak istimewa (Anda dapat memeriksa di pengaturan akun-> keamanan) maka Anda harus menonaktifkan "otentikasi dua langkah" ke bagian akhir halaman dan atur ke "ya" untuk mengizinkan aplikasi yang kurang aman. Itu saja. Jika Anda tidak memiliki hak untuk mengubah opsi-opsi itu, solusi untuk utas ini tidak akan berfungsi. Periksa https://support.google.com/a/answer/6260879?hl=id untuk melakukan perubahan pada opsi "izinkan lebih sedikit ...".

Diego Andrés Díaz Espinoza
sumber
0

Saya mencoba saran yang ditawarkan oleh @shasi kanth, tetapi tidak berhasil. Saya membaca dokumentasi dan ada beberapa perubahan yang dilakukan. Jadi saya berhasil mengirim email melalui Gmail menggunakan kode ini, di mana vendor / autoload.php didapat oleh komposer dengan komposer memerlukan "swiftmailer / swiftmailer: ^ 6.0":

<?php
     require_once 'vendor/autoload.php';
     $transport = (new Swift_SmtpTransport('smtp.gmail.com', 465, 'ssl'))->setUsername ('SendingMail')->setPassword ('Password');

     $mailer = new Swift_Mailer($transport);

     $message = (new Swift_Message('test'))
      ->setFrom(['Sending mail'])
      ->setTo(['Recipient mail'])
      ->setBody('Message')
  ;

     $result = $mailer->send($message);
    ?>
sjuesju
sumber