2017-10-27 20 views
0

PHP에서 SMTP와 PEAR을 사용하여 첨부 파일이있는 전자 메일을 보내려고하지만 "인증 실패 [SMTP (: 응답 220 : 2.0.0 TLS를 시작할 준비 코드)] "인증 실패 [SMTP : STARTTLS 실패 (코드 : 220, 응답 : 2.0.0 TLS 시작 준비 완료)]

<?php 
require_once "Mail.php"; // PEAR Mail package 
require_once ('Mail/mime.php'); // PEAR Mail_Mime packge 

$from = "Your Mom <[email protected]>"; 
$to = "Me <recepient [email protected]>"; 
$subject = 'Call Me!'; 

$headers = array ('From' => $from,'To' => $to, 'Subject' => $subject); 

// text and html versions of email. 
$text = 'Hi son, what are you doing?nnHeres an picture of a cat for you.'; 
$html = 'Hi son, what are you doing?<br /><br />Here is an picture of a cat 
for you.'; 

// attachment 
$file = 'fromc.xls'; 
$crlf = "n"; 

$mime = new Mail_mime($crlf); 
$mime->setTXTBody($text); 
$mime->setHTMLBody($html); 
$mime->addAttachment($file, 'text/plain'); 

$body = $mime->get(); 
$headers = $mime->headers($headers); 

$host = "smtp.gmail.com"; 
$username = "[email protected]"; 
$password = "xyz"; 

$smtp = Mail::factory('smtp', array ('host' => $host, '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>"); 
} 
?>` 

PHP 버전 : 1.10.1 PEAR 버전 : here 의 코드를 가지고
7.1.6 것은 도와주세요 STARTTLS 실패 오류를 해결하려면 ...

답변

0

이 문서화되지 않은 매개 변수 : socket_options이 오류가 발생하면 인증 해 드리겠습니다 :
인증 실패 [SMTP : STARTTLS 실패 (코드 : 220, 응답 : TLS 진행)].
'인증'=> "PLAIN"
'socket_options'=> 배열 ('SSL'=> 배열 ('verify_peer_name'=> false)를),

가 촬영을 :

난 그냥 추가 필요 에서 : https://pear.php.net/manual/en/package.mail.mail.factory.php


나는이 오류가 발생했지만, 그 다음 인증 오류를보고도, 도움이되지 않았다 (제안 위의 의견의 몇 가지로) STARTTLS를 설정합니다. 적어도 내 상황에 맞는 적절한 수정을 찾았습니다.

당신이 PHP 5.6을 사용하는 경우는, SSL에 대한 변경 사항이 있습니다 : http://php.net/manual/en/migration56.openssl.php

주로 연결에서 수행 추가 검증이 있습니다. 이 확인 작업은 5.5에서 수행되지 않았으므로이 문제는 무시되었습니다. 그러나 내 상황에서는 서버가 "localhost"와 함께 SMTP EHLO 명령을 보내고 있었기 때문에 PHP의 새로운 확인이 실패하게되었습니다.

이 솔루션은 /include/pear/Net/SMTP.php에서 osTicket의 메일 클래스를 패치하는 것입니다 -이 라인 변경 :

을 $이 -> _ socket_options = $ socket_options; ;> _ socket_options = 배열 ​​("SSL"=> 어레이 ('verify_peer_name'=> 거짓)) -

$ 이에

이렇게하면 확인이 사용 중지됩니다. 셋업을 위해 메일 서버는 osTicket 서버와 동일한 로컬 네트워크에 있으므로 보안에 지나치게 신경을 쓰지 않습니다.

다른 해결책은이 추가 확인이없는 PHP 5.5로 다운 그레이드하는 것입니다.

osTicket이 어떻게 든이 설정을 제공하면 코드가 매번 패치 할 필요가 없기 때문에 좋을 것입니다.

취지 : https://github.com/pear/Net_SMTP/issues/14