2015-02-13 3 views
1

Ну, я пытаюсь отправить электронное письмо с помощью сервера smtp с моего хоста (hosting2go), и в соответствии с одним из их FAQ я должен сначала выполнить проверку подлинности с помощью pop3, он должен получить почту, прежде чем я смогу попытаться подключиться к smtp-сервер, и вот что я сделал (я думаю), но, к сожалению, он по-прежнему отключает меня от smtp-сервера по какой-то причине, еще более запутанный (если я правильно понял), он сообщает мне, что клиент запрашивает закрыть соединение.PHPMailer не может отправлять электронную почту, клиент закрывает соединение?

Вот мой PHP код:

echo 'running'; 
require '../PHPMailerAutoload.php'; 

$pop3mail = imap_open('{XXXX.hosting2go.nl:110/pop3}', '[email protected]', 'XXX'); 

// grab a list of all the mail headers 
$headers = imap_headers($pop3mail); 

// grab a header object for the last message in the mailbox 
$last = imap_num_msg($pop3mail); 
$header = imap_header($pop3mail, $last); 

// grab the body for the same message 
echo $body = imap_body($pop3mail, $last); 



$mail = new PHPMailer; 

$mail->SMTPDebug = 3; 
$mail->Debugoutput = 'html';        // Enable verbose debug output 

$mail->isSMTP();          // Set mailer to use SMTP 
$mail->SMTPAuth = true;        // Enable SMTP authentication 
$mail->SMTPSecure = 'tls';       // zet SMTP naar ssl 
$mail->Host = 'XXX.hosting2go.nl'; // Specify main and backup SMTP servers 
$mail->Port = 25;         // TCP port to connect to 
$mail->Username = "[email protected]";     // SMTP username 
$mail->Password = 'XXXX';       // SMTP password       


$mail->From = '[email protected]'; 
$mail->FromName = 'Werktuigenvereniging Ruinerwold'; 


$mail->AddAddress("[email protected]"); 


//$mail->isHTML(true);         // Set email format to HTML 

$mail->Subject = "testing"; 
$mail->Body = "testing"; 

//send the message, check for errors 
if (!$mail->send()) { 
    echo "Mailer Error: " . $mail->ErrorInfo; 
} else { 
    echo "Message sent!"; 
} 
imap_close($pop3mail); 

И это ответ, который я получаю:

runningConnection: opening to xxx.hosting2go.nl:25, t=300, opt=array() 
Connection: opened 
SERVER -> CLIENT: 220 xxx.hosting2go.nl ESMTP 
CLIENT -> SERVER: EHLO wtvruinerwoldnieuw.nl 
SERVER -> CLIENT: 250-xxx.hosting2go.nl250-STARTTLS250-PIPELINING250  8BITMIME 
CLIENT -> SERVER: STARTTLS 
SERVER -> CLIENT: 220 ready for tls 
CLIENT -> SERVER: QUIT 


Connection: closed 
SMTP connect() failed. 
Mailer Error: SMTP connect() failed. 

Это client-> SERVER: QUIT путает меня, но я не мог понять это правильно , Странная вещь (или это?), Что функция mail() по умолчанию в php работает отлично. Но я не хочу использовать эту функцию, поскольку она будет использоваться для информационных бюллетеней и так хорошо (не самая важная часть). Что это за функция, отличная от того, что я здесь делаю?

Update:

Да, я смотрел в ответ, который я получил от PHPMailer и сервера и СЛУЧИЛОСЬ попадаться этой документации о STARTTLS и узнал об этом:

If the SMTP client decides that the level of authentication or 
privacy is not high enough for it to continue, it SHOULD issue an 
SMTP QUIT command immediately after the TLS negotiation is complete. 

источник: https://www.ietf.org/rfc/rfc2487.txt

Но это проблема с сервером или клиентом. Я также пытался использовать localhost (поскольку сервер smtp, который я пытаюсь использовать, находится на том же сервере, на котором размещен мой веб-сайт) (127.0.0.1) с тем же результатом.

Update 2 # (Найдено решение, но так странно): https://stackoverflow.com/a/12410579/4564466

Комментирование:

$mail->isSMTP(); 

работал, и я понятия не имею, почему, ответы на этот раствор не сказали мне, почему это сработало. Я не уверен, если его даже правильный способ сделать это, или что я сейчас делаю что-то, что никто никогда не должен делать ...

Ответ был следующим:

runningServer -> Client: +OK Hello there. Server -> Client: +OK Password required. Server -> Client: +OK logged in. Message sent! 

И я получил mail совершенно нормально.

Спасибо за любую помощь.

P.S. Я не против, если вы попытаетесь указать мне направление, а не набирать все это для меня, я действительно хотел бы больше, если бы вы указали мне направление, так как я хочу знать, как это работает и почему это происходит не работа.

+0

с TLS вам нужно отправить сертификат, попробуйте порт 587 – volkinc

+0

К сожалению, мой хост не имеет этого порта, но я все равно попробовал, и это ответ; runningConnection: открытие для xxx.hosting2go.nl:587, t = 300, opt = array() SMTP ERROR: Не удалось подключиться к серверу: соединение отклонено (111) Ошибка SMTP connect(). Ошибка Mailer: Ошибка SMTP connect(). , Смешно, что функция mail() по умолчанию работает, поэтому я могу использовать ее, но я знаю, что это не лучшая вещь для использования для почты. –

+0

Mail() просто отправляется на ваш локальный почтовый сервер, поэтому он просто не работает позже. – Synchro

ответ

0

Ваш сервер пытается перевести вас в режим TLS с помощью STARTTLS. Вы должны настроить PHPMailer для включения этого режима. Я думаю, что вам нужно:

$mail->SMTPSecure = 'tls'; 
+0

Ах, моя ошибка, я вижу, у вас уже есть это. Тем не менее, что-то происходит неправильно в TLS-соединении, возможно, в недействительном или неподписанном сертификате. Вы можете попробовать подключиться к серверу с помощью клиента командной строки openssl и посмотреть, что произойдет. – delatbabel

+0

Я предполагаю, что мой хост нуждается в поддержке ssl для этого, к сожалению, это не так ... но спасибо в любом случае –

+0

Ваша почта * SERVER * заставляет вас работать в режиме STARTTLS. Если ваш PHP * HOST * не поддерживает SSL, вы не можете разговаривать с этим сервером. – delatbabel

1

То, что вы описываете, называется POP-before-SMTP. Я не видел, чтобы кто-нибудь использовал его более 20 лет!

Не беспокойтесь, сворачивая свой собственный код. PHPMailer имеет встроенную поддержку для него. Выезд this code example.

Это говорит о том, что я рекомендую найти провайдера, который немного меньше каменного века.

+0

Вау, тогда это действительно веб-хостинг каменного века (isp - поставщик интернет-услуг, или я сейчас глуп?), Я хотел, чтобы я сделал еще несколько исследований по этому поводу, прежде чем принимать годовой контракт (вставить facepalm), но они также объявили, что они работают над получением поддержки ssl, но в основное время я все равно хотел бы получить почту. Я уже знал об этой функции в PHPMailer, но мой веб-хост также требует получения электронной почты, прежде чем пытаться подключиться к SMTP-серверу, PHPMailer только делает подключение к поп-серверу, делая его легче, чем другие полностью используемые библиотеки pop3. –

+1

Спасибо, это было решением моей проблемы, вы спасли мой день: D – Bjorn

Смежные вопросы