2014-04-08 10 views
9

Ich bin neu in PHP. Ich habe versucht, mir per PHPmailer eine Beispiel-E-Mail zu schicken. Ich verwende den SMTP-Server von Google Mail. Ich versuche, eine Beispiel-Mail von meinem Google Mail-Konto an meinen Yahoo-Account zu senden. Aber ich bin immer die Fehlermeldung: Mailer Error: SMTP connect() failed.
Hier ist der Code:SMTP connect() fehlgeschlagen PHPmailer - PHP

<?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 = "[email protected]";  // SMTP username 
$mail->Password = "mypassword";    // SMTP password 
$webmaster_email = "[email protected]";  //Reply to this email ID 
$email="[email protected]";    // 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"; 
} 
?> 

Ich benutze WAMP-Server auf einem Windows 7 64-Bit-Rechner. Was könnte das Problem sein?
Bitte helfen Sie mir, dies zu lösen. Vielen Dank!

+0

Nur damit Sie wissen, [erfordert] (http://php.net/require) ist ein Sprachkonstrukt und '()' sind nicht notwendig. –

+0

@RPM Danke! Ich habe es geändert. Aber, bitte helfen Sie mir, dieses Problem zu lösen –

+0

Ich denke, Sie verpasst Server Details Details – Riskhan

Antwort

7

Sie müssen den Host Parameter

$mail->Host = "ssl://smtp.gmail.com"; 

auch hinzufügen, wenn Sie open_ssl aktiviert haben.

<?php 
echo !extension_loaded('openssl')?"Not Available":"Available"; 
+0

Ich habe den Parameter hinzugefügt, aber es zeigt den gleichen Fehler 'Mailer Error: SMTP connect() failed.'. –

+1

Ist die Maschine mit dem Internet verbunden? – Riskhan

+0

@Krishna Ja, mein PC ist mit dem Internet verbunden –

1

Sie vermissen die Richtlinie, dass die Verbindungszustände verwendet 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; 

Dann in den anderen Teilen hinzufügen

$webmaster_email = "[email protected]";  //Reply to this email ID 
$email="myyah[email protected]";    // 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"; 
} 

Als Randbemerkung, ich habe Mühe hatte mit Body + AltBody zusammen, obwohl sie funktionieren sollen. Als Ergebnis habe ich die folgende Wrapper-Funktion geschrieben, die perfekt funktioniert.

<?php 
require ("class.phpmailer.php"); 

// Setup Configuration for Mail Server Settings 
$email['host']   = 'smtp.email.com'; 
$email['port']   = 366; 
$email['user']   = '[email protected]'; 
$email['pass']   = 'from password'; 
$email['from']   = 'From Name'; 
$email['reply']   = '[email protected]'; 
$email['replyname']  = 'Reply To Name'; 

$addresses_to_mail_to = '[email protected];[email protected]'; 
$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; 
} 
+0

Ich habe deine Antwort nicht verstanden. Ich versuche, eine E-Mail von meinem Google Mail-Konto an meinen Yahoo-Account zu senden, nicht umgekehrt. Korrigieren Sie mich, wenn ich falsch liege, aber ich sollte den Benutzernamen und das Passwort meines Google Mail-Kontos und nicht meines Yahoo-Kontos angeben. –

+0

Richtig, Sie würden Ihre Anmeldedaten für das Google Mail-Konto eingeben. Gib mir einen Moment, und ich werde die Funktion aktualisieren, damit Sie das verwenden können :) –

+0

Danke Sanuel. Ich habe es jetzt funktioniert. +1 für die Hilfe. Ich interessiere mich für die Funktion. Bitte aktualisiere es. –

14

Die Lösung dieses Problems ist wirklich sehr einfach. tatsächlich startet Google einen neuen Autorisierungsmechanismus für seinen Benutzer. Sie haben möglicherweise eine andere Zeile in der Debug-Konsole gesehen, die Sie auffordert, sich mit einem beliebigen Browser bei Ihrem Konto anzumelden. dies ist wegen der neuen XOAUTH2 Authentifizierungsmechanismus, die Google mit Start seit 2014 erinnern .. nicht die ssl über 465-Port verwenden, stattdessen gehen für tls über 587. Dies liegt nur am XOAUTH2-Authentifizierungsmechanismus. Wenn Sie ssl über 465 verwenden, wird Ihre Anfrage zurückgeschickt.

, was Sie wirklich tun müssen, ist .. melden Sie sich bei Ihrem Google-Konto und eröffnen Adresse nach https://www.google.com/settings/security/lesssecureapps und überprüfen wiederum auf. Sie müssen dies tun, damit Sie sich mit dem Google SMTP verbinden können, da laut dem neuen Authentifizierungsmechanismus Google alle Anfragen von all diesen Anwendungen zurückspringt, die keiner Standardverschlüsselungstechnik folgen .. nach dem Überprüfen einschalten .. Sie sind gut zu gehen .. hier ist der Code, der gut für mich gearbeitet ..

require_once 'C:\xampp\htdocs\email\vendor\autoload.php'; 

define ('GUSER','[email protected]'); 
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; 
    } 
} 
+1

Vielen Dank. +100 für Ihre Antwort. Ich hatte durch alle gmail-Einstellungen gegangen und verbringen Sie den ganzen Tag, aber nur zu arbeiten, sobald ich weniger sichere Anwendungen Option – monikapatel

+1

appologies einschalten und eine weitere Sache, die ich 465 mit ssl verwendet habe und ich habe keinen Rückprall von gmail. – monikapatel

+1

Ich liebe dich "benutze die SSL nicht über Port 465, sondern gehe für Tls über 587" Ich habe so viele Stunden verloren .... –

0

Troubleshooting

Sie fügen haben diesen Code:

$mail->SMTPOptions = array(
     'ssl' => array(
      'verify_peer' => false, 
      'verify_peer_name' => false, 
      'allow_self_signed' => true 
     ) 
    ); 

und Aktivieren Allow less secure apps: „wird in der Regel das Problem für PHPMailer lösen, und es macht Ihre App nicht wirklich signifikant Berichten zufolge kann es eine Stunde oder länger dauern, bis diese Einstellung geändert wird. Erwarten Sie daher keine sofortige Lösung. "

Diese Arbeit für mich!

Verwandte Themen