2014-04-08 2 views
9

PHP를 처음 사용했습니다. 나는 PHPmailer를 통해 샘플 전자 메일을 보내려고했다. Gmail의 SMTP 서버를 사용하고 있습니다. 내 Gmail 계정의 샘플 메일을 내 야후 계정으로 보내려고합니다. 하지만 오류를 얻고있다 :SMTP connect()에 실패했습니다. 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"; 
} 
?> 

나는 윈도우 7 64 비트 시스템에서 WAMP 서버를 사용하고 있습니다 : 여기
Mailer Error: SMTP connect() failed.는 코드입니다. 무슨 문제가 될 수 있니?
제발 도와주세요. 감사!

+0

, 여기에 솔루션을 연구하면서 (사이먼 첸에서)이 코드를 통해 온, [필요] (http://php.net/require)은 언어 구조입니다 와'()'는 꼭 필요한 것은 아닙니다. –

+0

@RPM 감사합니다! 나는 그것을 바꿨다. 하지만이 문제를 해결하도록 도와주세요. –

+0

서버 세부 정보가 누락 된 것 같습니다. – Riskhan

답변

7

당신은 당신이 open_ssl을 사용하도록 설정 한 경우 확인, 또한 Host 매개 변수를

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

를 추가해야합니다.

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

매개 변수를 추가했지만'Mailer Error : SMTP connect() failed.'와 같은 오류가 표시됩니다. –

+1

기계가 인터넷에 연결되어 있습니까? – Riskhan

+0

@Krishna 예 PC가 인터넷에 연결되어 있습니다. –

1

당신은 +, 나는 문제 바디를 사용하여이 있었다

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

에 추가 SSL 연결을 내용의 지침을 사용하여 누락 AltBody는 함께 일하기로되어 있습니다. 결과적으로 완벽하게 작동하는 다음 래퍼 함수를 ​​작성했습니다.

<?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

나는 당신의 대답을 이해하지 못했습니다. 내 Gmail 계정에서 내 야후 계정으로 전자 메일을 보내려고합니다. 그 반대도 마찬가지입니다. 내가 틀렸다면 정정하십시오. 그러나 yahoo 계정이 아닌 내 Gmail 계정의 사용자 이름과 암호를 제공해야합니다. –

+0

맞습니다. Gmail 계정 정보를 입력하십시오. 잠시만 기다려주세요. 그러면 사용할 수 있도록 함수를 업데이트 할 것입니다. –

+0

감사합니다 Sanuel. 나는 지금 일하고있다. +1 나를 돕기 위해. 나는이 기능에 관심이있다. 업데이트하십시오. –

14

이 문제의 해결 방법은 실제로 매우 간단합니다. 실제로 Google은 User에 대한 새로운 인증 메커니즘을 사용하여 시작합니다. 브라우저를 사용하여 계정에 로그인하라는 메시지를 표시하는 디버그 콘솔의 다른 행을 보았을 수 있습니다. 이 때문에 2014 년 이 .. 대신 587 이상 TLS에 대한 이동, 포트 465 통해 SSL을 사용하지 않는 기억 때문에 구글이 사용하기 시작 새로운 XOAUTH2 인증 메커니즘이다. 이는 단지 XOAUTH2 인증 메커니즘 때문입니다. 465를 통해 SSL을 사용하면 요청이 다시 반송됩니다.

당신이 정말로 필요하면 구글 계정에 로그인하여 주소를 https://www.google.com/settings/security/lesssecureapps 다음 열고차례를 확인 ..입니다. 당신은 새로운 인증 메커니즘에 따라 Google은 어떤 표준 암호화 기법을 따르지 않는 모든 응용 프로그램의 모든 요청을 다시 반송하기 때문에 Google SMTP에 연결하도록 허용해야합니다. 모든 것이 당신이 UR의 Gmail 계정에 연결하는 제 3 자 애플리케이션에 대한 액세스 권한을 설정해야합니다 Gmail에 실패하면 .. 여기에 나를 위해 잘 작동하는 코드입니다 ..

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

고맙습니다. 모든 Gmail 설정을 통과하고 내 하루 종일 보내고 덜 안전한 앱을 끄면 작업을 시작합니다. – monikapatel

+1

사과가 켜지고 한 번 더 ssl로 465 번을 사용했지만 Gmail에서 반송되지 않습니다. – monikapatel

+1

나는 당신을 사랑한다 "포트 465를 통해 SSL을 사용하지 말고, 587을 넘어서서 tSL로 가라."나는 너무 많은 시간을 잃었다 .... –

0

Troubleshooting

당신이 코드를 추가해야 :

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

그리고 Allow less secure apps 활성화 : 는 "일반적으로 PHPMailer에 대한 문제를 해결할 것입니다, 그리고 정말 크게 응용 프로그램을하지 않습니다 보고 된 바에 따르면이 설정을 변경하는 데는 한 시간 이상 걸릴 수 있으므로 즉각적인 수정을 기대하지 마십시오. "

나를위한 작품!

관련 문제