2017-10-27 59 views
0

SMTPとPEARを使用してPHPで添付ファイル付きの電子メールを送信しようとしていますが、 :助けてくださいhere からコードを持っ7.1.6
:]」認証に失敗しました[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のバージョンSTARTTLSは(::220、応答2.0.0 TLSを開始する準備ができてコードを)失敗しました私はエラーをクリアするために...

答えて

0

私はこのエラーが発生したときに認証することができます:
認証に失敗しました[SMTP:STARTTLSが失敗しました(コード:220、レスポンス:TLSが先に進む)]。

私はちょうど追加必要があります。

撮影


'AUTH' => "PLAIN"、
'socket_options' =>配列( 'SSL' =>配列)( 'verify_peer_name' => false)をFrom: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' => false)を;

これは検証をオフにします。私のセットアップでは、メールサーバーはosTicketサーバーと同じローカルネットワーク上にあるので、セキュリティについてはあまり心配していません。

もう1つの解決策は、PHP 5.5にダウングレードして、この余分な検証を行わないことです。

osTicketが何らかの形でこの設定を提供していれば、コードをパッチする必要はありません。

撮影:https://github.com/pear/Net_SMTP/issues/14