Отправка электронной почты с использованием SMTP-сервера GMail со страницы PHP


389

Я пытаюсь отправить письмо через SMTP-сервер GMail со страницы PHP, но я получаю эту ошибку:

ошибка аутентификации [SMTP: SMTP-сервер не поддерживает аутентификацию (код: 250, ответ: mx.google.com к вашим услугам, [98.117.99.235] РАЗМЕР 35651584 8BITMIME STARTTLS ENHANCEDSTATUSCODES PIPELINING)]

Кто-нибудь может помочь? Вот мой код:

<?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>");
 }
?>

Ответы:


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
что это Mail.php?? откуда мне взять этот файл?
Заин Шейх

18
Может кто-нибудь, пожалуйста, дайте мне ссылку, где я могу получить файл Mail.php. Потому что я попробовал, и это не сработало. Спасибо
Yoosuf

11
Где символы @ в этом примере выше? Я не вижу там ни одного!
darkAsPitch

6
Я считаю, что myaccount.gmail.com совпадает с myaccount@gmail.com в стандартах электронной почты.
Шервин Рейс

3
Вам не нужно включать @gmail, если у вас есть указанный сервер. Просто введите myaccountимя пользователя.
Джек,

106

Используя почтовую программу Swift , довольно просто отправить письмо через учетные данные 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('abc@example.com' => 'ABC'))
  ->setTo(array('xyz@test.com'))
  ->setBody('This is a test mail.');

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

2
Это сработало «первым», просто изменив адреса GMAIL_USERNAME, GMAIL_PASSWORD и адреса От и До. Никакое другое решение не помогло мне. Спасибо.
Марко Мусиньо

7
Я согласен, Swift Mailer - это решение для почтовой рассылки, которое намного проще, чем возиться с грушей. Не забудьте включить расширение PHP php_openssl.
Soth

1
Хорошее решение с использованием SwiftMailer! +1
Амаль Мурали

1
arrrgh. Айкант заставь Свифтмаилера работать. я не знаю, как использовать этот «композитор», поэтому я просто скачал zift swiftmailer с github, затем включил open_ssl, затем предоставил адрес электронной почты и пароль gmail, но он все еще не работал.
boi_echos

3
ах извините за мою глупость. Вы должны открыть свою учетную запись Gmail, потому что есть электронное письмо, сообщающее вам, чтобы включить «менее безопасное приложение». тогда это теперь работает хехех
boi_echos


33

Я не рекомендую Pear Mail. Он не обновлялся с 2010 года. Также прочтите исходные файлы; исходный код почти устарел, написан в стиле PHP 4, и было опубликовано много ошибок / ошибок (Google it). Я использую Swift Mailer.

Swift Mailer интегрируется в любое веб-приложение, написанное на PHP 5, предлагая гибкий и элегантный объектно-ориентированный подход к отправке электронных писем с множеством функций.

Отправляйте электронные письма, используя SMTP, sendmail, postfix или собственную реализацию транспорта.

Поддержка серверов, которые требуют имя пользователя и пароль и / или шифрование.

Защита от атак с использованием заголовков без удаления содержимого данных запроса.

Отправляйте MIME-совместимые электронные письма в формате HTML / multipart.

Используйте управляемые событиями плагины для настройки библиотеки.

Обработка больших вложений и встроенных / встроенных изображений с низким использованием памяти.

Это бесплатный и с открытым исходным кодом вы можете скачать Swift Mailer и загрузить на свой сервер. (Список функций скопирован с сайта владельца).

Рабочий пример Gmail SSL / SMTP и Swift Mailer находится здесь ...

// 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. :(';
}

Надеюсь, это поможет. Удачного кодирования ... :)


1
Это больше не работает, я всегда получаю ответное сообщение "535-5.7.8 Имя пользователя и пароль не приняты". Мои учетные данные в порядке, и я установил «разрешить менее безопасные приложения» на «ВКЛ». Кто-нибудь знает, как это исправить?
AndrewB

Swift, похоже, не работает в PHP 5.x - не понимает ?? слиться - просто взрывается.
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!";
}

?>

Почему вы устанавливаете хост дважды, и какой из них правильный?
Эмиль Бержерон

Где взять файл class.phpmailer.php ?? Вставка только кода не очень полезна, пожалуйста, включите больше описания кода!
GeneCode

Хотя часть синтаксиса устарела, PHPMailer оказался лучшим решением для меня, +1
zoltar

20

SwiftMailer может отправлять электронную почту с использованием внешних серверов.

Вот пример, который показывает, как использовать сервер 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

Код, указанный в вопросе, нуждается в двух изменениях

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

Порт 465 необходим для соединения SSL.


6

Отправка почты с использованием библиотеки phpMailer через Gmail Пожалуйста, загрузите файлы библиотеки с 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

У меня была эта проблема также. Я установил правильные настройки и включил менее безопасные приложения, но он все равно не работал. Наконец, я включил этот https://accounts.google.com/UnlockCaptcha , и он сработал для меня. Я надеюсь, что это помогает кому-то.



4

Чтобы установить PEAR's Mail.php в Ubuntu, выполните следующий набор команд:

    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

У меня есть решение для учетных записей GSuite, у которого нет суффикса "@ gmail.com". Также я думаю, что это будет работать для учетных записей GSuite с @ gmail.com, но еще не пробовал. Во-первых, у вас должны быть права изменить опцию «allos¿w менее безопасное приложение» для вашей учетной записи GSuite. Если у вас есть права (вы можете проверить их в настройках учетной записи -> безопасность), вам нужно отключить «двухэтапную аутентификацию», перейти в конец страницы и установить «да», чтобы разрешить менее безопасные приложения. Это все. Если у вас нет прав для изменения этих параметров, решение для этого потока не будет работать. Проверьте https://support.google.com/a/answer/6260879?hl=ru, чтобы внести изменения в параметр «разрешить меньше ...».


0

Я попробовал предложение, предложенное @shasi kanth, но оно не сработало. Я прочитал документацию, и некоторые изменения сделаны. Поэтому мне удалось отправить почту через Gmail, используя этот код, где vendor / autoload.php получен композитором с composer, требующим "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);
    ?>

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.