Gửi email bằng máy chủ GMail SMTP từ trang PHP


389

Tôi đang cố gắng gửi email qua máy chủ SMTP của GMail từ trang PHP, nhưng tôi gặp lỗi này:

lỗi xác thực [SMTP: Máy chủ SMTP không hỗ trợ xác thực (mã: 250, phản hồi: mx.google.com tại dịch vụ của bạn, [98.117.99.235] SIZE 35651584 8BITMIME STARTTLS ENHANCEDSTATUSCODES PIPELINING)]

Có ai giúp được không? Đây là mã của tôi:

<?php
require_once "Mail.php";

$from = "Sandra Sender <sender@example.com>";
$to = "Ramona Recipient <ramona@microsoft.com>";
$subject = "Hi!";
$body = "Hi,\n\nHow are you?";

$host = "smtp.gmail.com";
$port = "587";
$username = "testtest@gmail.com";
$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>");
 }
?>

Câu trả lời:


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

$from = '<fromaddress@gmail.com>';
$to = '<toaddress@yahoo.com>';
$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' => 'johndoe@gmail.com',
        'password' => 'passwordxxx'
    ));

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

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

141
là gì Mail.php?? Tôi lấy tập tin này từ đâu?
Zain Shaikh

18
bất cứ ai có thể xin vui lòng cho tôi một liên kết nơi tôi có thể nhận được tệp Mail.php. Bởi vì tôi đã thử nó và nó sẽ không hoạt động Cảm ơn
Yoosuf

11
Các ký hiệu @ ở đâu trong ví dụ trên? Tôi không thấy một ai trong đó!
darkAsPitch

6
Tôi tin rằng myaccount.gmail.com giống như myaccount@gmail.com trong các tiêu chuẩn email.
Chuyến bay của Sherwin

3
Bạn không cần bao gồm @gmail nếu bạn đã chỉ định máy chủ. Chỉ cần gõ myaccounttên người dùng.
Jack

106

Sử dụng Swift mailer , việc gửi thư thông qua thông tin đăng nhập Gmail khá dễ dàng:

<?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('abc@example.com' => 'ABC'))
  ->setTo(array('xyz@test.com'))
  ->setBody('This is a test mail.');

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

2
Điều này hoạt động "thành lần đầu tiên" chỉ thay đổi địa chỉ GMAIL_USERNAME, GMAIL_PASSWORD và địa chỉ Từ và Đến. Không có giải pháp khác làm việc cho tôi. Cảm ơn.
Marco Muciño

7
Tôi đồng ý, gửi thư nhanh chóng là một giải pháp thư thả dễ dàng hơn nhiều so với làm phiền với lê. Đừng quên bật tiện ích mở rộng php_openssl của PHP.
Soth

1
Giải pháp tuyệt vời khi sử dụng SwiftMailer! +1
Amal Murali

1
mảng icant nhận swiftmailer để làm việc. Tôi không biết làm thế nào để sử dụng "trình soạn thảo" đó vì vậy tôi chỉ tải xuống zip swiftmailer từ github sau đó tôi kích hoạt open_ssl sau đó cung cấp email và mật khẩu gmail của tôi nhưng nó vẫn không hoạt động.
boi_echos

3
ah xin lỗi vì sự ngu ngốc của tôi bạn phải mở tài khoản gmail của mình vì có một email thông báo cho bạn kích hoạt "ứng dụng kém an toàn". sau đó nó đang hoạt động heheh
boi_echos


33

Tôi không khuyên dùng Pear Mail. Nó đã không được cập nhật kể từ năm 2010. Cũng đọc các tệp nguồn; mã nguồn gần như đã lỗi thời, được viết theo kiểu PHP 4 và nhiều lỗi / lỗi đã được đăng (Google nó). Tôi đang sử dụng Swift Mailer.

Swift Mailer tích hợp vào bất kỳ ứng dụng web nào được viết bằng PHP 5, cung cấp một cách tiếp cận hướng đối tượng linh hoạt và thanh lịch để gửi email với vô số tính năng.

Gửi email bằng cách sử dụng SMTP, sendmail, postfix hoặc triển khai Giao thông tùy chỉnh của riêng bạn.

Hỗ trợ các máy chủ yêu cầu tên người dùng và mật khẩu và / hoặc mã hóa.

Bảo vệ khỏi các cuộc tấn công tiêm tiêu đề mà không tước nội dung dữ liệu yêu cầu.

Gửi email HTML / nhiều phần tuân thủ MIME.

Sử dụng các plugin hướng sự kiện để tùy chỉnh thư viện.

Xử lý các tệp đính kèm lớn và hình ảnh nội tuyến / nhúng với việc sử dụng bộ nhớ thấp.

Đây là một nguồn mở và miễn phí, bạn có thể Tải xuống Swift Mailer và tải lên máy chủ của mình. (Danh sách tính năng được sao chép từ trang web của chủ sở hữu).

Ví dụ hoạt động của Gmail SSL / SMTP và Swift Mailer có ở đây ...

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

// Mail Transport
$transport = Swift_SmtpTransport::newInstance('ssl://smtp.gmail.com', 465)
    ->setUsername('username@gmail.com') // 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('sender@example.com' => 'Sender Name')) // can be $_POST['email'] etc...
    ->setTo(array('receiver@example.com' => '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. :(';
}

Tôi hi vọng cái này giúp được. Chúc mừng mã hóa ... :)


1
Điều này không còn hoạt động nữa, tôi luôn nhận được thông báo trả về "535-5.7.8 Tên người dùng và Mật khẩu không được chấp nhận". Thông tin đăng nhập của tôi vẫn ổn và tôi đã đặt "cho phép các ứng dụng kém an toàn" thành BẬT. Bất cứ ai biết một sửa chữa cho điều này?
AndrewB

Swift dường như không hoạt động trong PHP 5.x - không hiểu ?? kết hợp - chỉ cần thổi lên.
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   = "user@gmail.com";  // GMAIL username
$mail->Password   = "password";            // GMAIL password

$mail->SetFrom('contact@prsps.in', 'PRSPS');

//$mail->AddReplyTo("user2@gmail.com', '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 = "user2@yahoo.co.in";
$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!";
}

?>

Tại sao bạn đặt máy chủ hai lần và cái nào là đúng?
Emile Bergeron

Tôi lấy tập tin class.phpmailer.php ở đâu ?? Chỉ dán mã là không hữu ích, vui lòng bao gồm thêm mô tả về mã!
GeneCode

Trong khi một số cú pháp đã lỗi thời, PHPMailer cuối cùng đã trở thành giải pháp tốt nhất cho tôi, +1
zoltar

20

SwiftMailer có thể gửi E-Mail bằng các máy chủ bên ngoài.

đây là một ví dụ cho thấy cách sử dụng máy chủ 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));

14

Mã như được liệt kê trong câu hỏi cần hai thay đổi

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

Cổng 465 được yêu cầu cho kết nối SSL.


6

Gửi thư bằng thư viện phpMailer qua Gmail Vui lòng tải các tệp thư viện từ 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 = "username@gmail.com";
//Password to use for SMTP authentication
$mail->Password = "yourpassword";
//Set who the message is to be sent from
$mail->setFrom('from@example.com', 'First Last');
//Set an alternative reply-to address
$mail->addReplyTo('replyto@example.com', 'First Last');
//Set who the message is to be sent to
$mail->addAddress('whoto@example.com', '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!";
}

5

Tôi cũng có vấn đề này. Tôi đặt cài đặt chính xác và đã bật các ứng dụng kém an toàn hơn nhưng nó vẫn không hoạt động. Cuối cùng, tôi đã kích hoạt https://accounts.google.com/UnlockCaptcha này và nó đã hoạt động với tôi. Tôi hi vọng điêu nay se giup được ai đo.



4

Để cài đặt Mail.php của PEAR trong Ubuntu, hãy chạy bộ lệnh sau:

    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

0

Tôi có một giải pháp cho các tài khoản GSuite không có sufix "@ gmail.com". Ngoài ra, tôi nghĩ rằng nó sẽ hoạt động cho các tài khoản GSuite với @ gmail.com nhưng chưa thử. Trước tiên, bạn nên có các đặc quyền để thay đổi tùy chọn "allos¿w ứng dụng kém an toàn hơn" cho tài khoản GSuite của bạn. Nếu bạn có các đặc quyền (bạn có thể kiểm tra cài đặt tài khoản-> bảo mật) thì bạn phải hủy kích hoạt "xác thực yếu tố hai bước" đi đến cuối trang và đặt thành "có" để cho phép các ứng dụng kém an toàn hơn. Đó là tất cả. Nếu bạn không có đặc quyền để thay đổi các tùy chọn đó, giải pháp cho chủ đề này sẽ không hoạt động. Kiểm tra https://support.google.com/a/a/6260879?hl=vi để thay đổi tùy chọn "cho phép ít hơn ...".


0

Tôi đã thử đề xuất được cung cấp bởi @shasi kanth, nhưng nó không thành công. Tôi đọc tài liệu và có một vài thay đổi được thực hiện. Vì vậy, tôi đã quản lý để gửi thư qua Gmail bằng mã này, trong đó nhà cung cấp / autoload.php có được nhà soạn nhạc với nhà soạn nhạc yêu cầu "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);
    ?>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.