Я новичок в PHP. Я пытался отправить себе образец электронной почты через PHPmailer. Я использую SMTP-сервер gmail. Я пытаюсь отправить образец почты из моей учетной записи gmail в мою учетную запись yahoo. Но я получаю сообщение об ошибке: Mailer Error: SMTP connect() failed.
Вот код:
<?php require "class.phpmailer.php"; $mail = new PHPMailer(); $mail->IsSMTP(); // send via SMTP $mail->Host = "ssl://smtp.gmail.com"; $mail->SMTPAuth = true; // turn on SMTP authentication $mail->Username = "myemail@gmail.com"; // SMTP username $mail->Password = "mypassword"; // SMTP password $webmaster_email = "myemail@gmail.com"; //Reply to this email ID $email="myyahoomail@yahoo.in"; // Recipients email ID $name="My Name"; // Recipient's name $mail->From = $webmaster_email; $mail->Port = 465; $mail->FromName = "My Name"; $mail->AddAddress($email,$name); $mail->AddReplyTo($webmaster_email,"My Name"); $mail->WordWrap = 50; // set word wrap $mail->IsHTML(true); // send as HTML $mail->Subject = "subject"; $mail->Body = "Hi, This is the HTML BODY "; //HTML Body $mail->AltBody = "This is the body when user views in plain text format"; //Text Body if(!$mail->Send()) { echo "Mailer Error: " . $mail->ErrorInfo; } else { echo "Message has been sent"; } ?>
Я использую WAMP-сервер на 64-разрядной машине Windows 7. Что может быть проблемой?
Пожалуйста, помогите мне решить эту проблему. Благодаря!
Вам нужно добавить параметр Host
$mail->Host = "ssl://smtp.gmail.com";
Кроме того, проверьте, включен ли open_ssl
.
<?php echo !extension_loaded('openssl')?"Not Available":"Available";
Решение этой проблемы действительно очень простое. на самом деле Google начинает использовать новый механизм авторизации для своего пользователя. Возможно, вы видели еще одну строку в консоли отладки, предлагая вам войти в свою учетную запись, используя любой браузер.! это связано с новым механизмом аутентификации XOAUTH2, который google начинает использовать с 2014 года. Помните, что не используйте ssl over port 465 , вместо этого отправляйтесь на tls более 587 . это происходит только из-за механизма аутентификации XOAUTH2. если вы используете ssl более 465, ваш запрос будет возвращен.
что вам действительно нужно сделать … войдите в свою учетную запись google и откройте следующий адрес https://www.google.com/settings/security/lesssecureapps и включите его . вы должны сделать это для того, чтобы вы могли подключиться к SMTP Google, потому что согласно новому механизму аутентификации Google отскакивает назад все запросы от всех тех приложений, которые не соответствуют какой-либо стандартной технологии шифрования. после проверки включите .. вы хороши для go .. вот код, который работал отлично для меня ..
require_once 'C:\xampp\htdocs\email\vendor\autoload.php'; define ('GUSER','youremail@gmail.com'); define ('GPWD','your password'); // make a separate file and include this file in that. call this function in that file. function smtpmailer($to, $from, $from_name, $subject, $body) { global $error; $mail = new PHPMailer(); // create a new object $mail->IsSMTP(); // enable SMTP $mail->SMTPDebug = 2; // debugging: 1 = errors and messages, 2 = messages only $mail->SMTPAuth = true; // authentication enabled $mail->SMTPSecure = 'tls'; // secure transfer enabled REQUIRED for GMail $mail->SMTPAutoTLS = false; $mail->Host = 'smtp.gmail.com'; $mail->Port = 587; $mail->Username = GUSER; $mail->Password = GPWD; $mail->SetFrom($from, $from_name); $mail->Subject = $subject; $mail->Body = $body; $mail->AddAddress($to); if(!$mail->Send()) { $error = 'Mail error: '.$mail->ErrorInfo; return false; } else { $error = 'Message sent!'; return true; } }
Вам не хватает директивы, в которой указано, что соединение использует SSL
require ("class.phpmailer.php"); $mail = new PHPMailer(); $mail->IsSMTP(); $mail->SMTPAuth = true; // turn of SMTP authentication $mail->Username = "YAHOO ACCOUNT"; // SMTP username $mail->Password = "YAHOO ACCOUNT PASSWORD"; // SMTP password $mail->SMTPSecure = "ssl"; $mail->Host = "YAHOO HOST"; // SMTP host $mail->Port = 465;
Затем добавьте в другие части
$webmaster_email = "myemail@gmail.com"; //Reply to this email ID $email="myyahoomail@yahoo.in"; // Recipients email ID $name="My Name"; // Recipient's name $mail->From = $webmaster_email; $mail->FromName = "My Name"; $mail->AddAddress($email,$name); $mail->AddReplyTo($webmaster_email,"My Name"); $mail->WordWrap = 50; // set word wrap $mail->IsHTML(true); // send as HTML $mail->Subject = "subject"; $mail->Body = "Hi, This is the HTML BODY "; //HTML Body $mail->AltBody = "This is the body when user views in plain text format"; //Text Body if(!$mail->Send()) { echo "Mailer Error: " . $mail->ErrorInfo; } else { echo "Message has been sent"; }
В качестве побочной заметки у меня были проблемы с использованием Body + AltBody вместе, хотя они должны работать. В результате я написал следующую функцию-оболочку, которая отлично работает.
<?php require ("class.phpmailer.php"); // Setup Configuration for Mail Server Settings $email['host'] = 'smtp.email.com'; $email['port'] = 366; $email['user'] = 'from@email.com'; $email['pass'] = 'from password'; $email['from'] = 'From Name'; $email['reply'] = 'replyto@email.com'; $email['replyname'] = 'Reply To Name'; $addresses_to_mail_to = 'email1@email.com;email2@email.com'; $email_subject = 'My Subject'; $email_body = '<html>Code Here</html>'; $who_is_receiving_name = 'John Smith'; $result = sendmail( $email_body, $email_subject, $addresses_to_mail_to, $who_is_receiving_name ); var_export($result); function sendmail($body, $subject, $to, $name, $attach = "") { global $email; $return = false; $mail = new PHPMailer(true); // the true param means it will throw exceptions on errors, which we need to catch $mail->IsSMTP(); // telling the class to use SMTP try { $mail->Host = $email['host']; // SMTP server // $mail->SMTPDebug = 2; // enables SMTP debug information (for testing) $mail->SMTPAuth = true; // enable SMTP authentication $mail->Host = $email['host']; // sets the SMTP server $mail->Port = $email['port']; // set the SMTP port for the GMAIL server $mail->SMTPSecure = "tls"; $mail->Username = $email['user']; // SMTP account username $mail->Password = $email['pass']; // SMTP account password $mail->AddReplyTo($email['reply'], $email['replyname']); if(stristr($to,';')) { $totmp = explode(';',$to); foreach($totmp as $destto) { if(trim($destto) != "") { $mail->AddAddress(trim($destto), $name); } } } else { $mail->AddAddress($to, $name); } $mail->SetFrom($email['user'], $email['from']); $mail->Subject = $subject; $mail->AltBody = 'To view the message, please use an HTML compatible email viewer!'; // optional - MsgHTML will create an alternate automatically $mail->MsgHTML($body); if(is_array($attach)) { foreach($attach as $attach_f) { if($attach_f != "") { $mail->AddAttachment($attach_f); // attachment } } } else { if($attach != "") { $mail->AddAttachment($attach); // attachment } } $mail->Send(); } catch (phpmailerException $e) { $return = $e->errorMessage(); } catch (Exception $e) { $return = $e->errorMessage(); } return $return; }
если все не удается, то для gmail вы должны включить доступ к сторонним приложениям для подключения к учетной записи ur gmail.
https://www.google.com/settings/security/lesssecureapps // включить его
Если кто-либо еще не может решить проблему, проверьте следующий поток и выполните ответ callmebob.
PHPMailer – SMTP ERROR: команда паролей не удалась при отправке почты с моего сервера
Исправление проблем
Вы добавили этот код:
$mail->SMTPOptions = array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ) );
И Включение Разрешить менее безопасные приложения : «обычно решает проблему для PHPMailer, и на самом деле это не делает ваше приложение значительно менее безопасным. Сообщается, что для изменения этого параметра может потребоваться час или больше, чтобы вступить в силу, поэтому не ожидайте немедленного исправить»
Эта работа для меня!