2012-05-16 3 views
1

Я скопировал-вставить функцию, которую я пытаюсь изменить. Я бы хотел, чтобы он правильно обрабатывал ошибки. Прямо сейчас, $smtpResponse не возвращает никаких значений. Когда я эхо значения внутри функции, они показывают, но $smtpResponse ничего не дает, и не отправляет истинные или ложные значения.Как мне вернуть эту функцию?

Я пробовал возвращать «Fail» и «Success» тоже, но они не отображаются. $response не показывает, но «Это сработало!» делает. Почему функция не возвращает ничего?

Я пытаюсь вывести следующим образом:

//Send e-mail 
$repsonse = authSendEmail($from, $namefrom, $sendto,"", $subject,$message); 

//Report success/failure 
echo $response; 

The culprit: 

function authSendEmail($from, $namefrom, $to, $nameto, $subject, $message) { 
    //Connect to the host on the specified port 
    $smtpConnect = fsockopen($smtpServer, $port, $errno, $errstr, 60); 
    $smtpResponse = fgets($smtpConnect, 515); 

    if(empty($smtpConnect)) { 
     $output = "Failed to connect: $smtpResponse"; 
     echo $output; 
     return "Fail"; 
     //return false; 
     //used to read 'return $output' 
    } 

    else { 
     $logArray['connection'] = "Connected: $smtpResponse"; 
    } 

    //Request Auth Login 
    fputs($smtpConnect,"AUTH LOGIN" . $newLine); 
    $smtpResponse = fgets($smtpConnect, 515); 
    $logArray['authrequest'] = "$smtpResponse"; 

    if(!$smtpResponse) { 
     return "Fail"; 
    } 

    //Send username 
    fputs($smtpConnect, base64_encode($username) . $newLine); 
    $smtpResponse = fgets($smtpConnect, 515); 
    $logArray['authusername'] = "$smtpResponse"; 

    if(!$smtpResponse) { 
     return "Fail"; 
    } 

    //Send password 
    fputs($smtpConnect, base64_encode($password) . $newLine); 
    $smtpResponse = fgets($smtpConnect, 515); 
    $logArray['authpassword'] = "$smtpResponse"; 

    if(!$smtpResponse) { 
     return "Fail"; 
    } 

    //Say Hello to SMTP 
    fputs($smtpConnect, "HELO $localhost" . $newLine); 
    $smtpResponse = fgets($smtpConnect, 515); 
    $logArray['heloresponse'] = "$smtpResponse"; 

    if(!$smtpResponse) { 
     return "Fail"; 
    } 

    //Email From 
    fputs($smtpConnect, "MAIL FROM: $from" . $newLine); 
    $smtpResponse = fgets($smtpConnect, 515); 
    $logArray['mailfromresponse'] = "$smtpResponse"; 

    if(!$smtpResponse) { 
     return "Fail"; 
    } 

    //Email To 
    fputs($smtpConnect, "RCPT TO: $to" . $newLine); 
    $smtpResponse = fgets($smtpConnect, 515); 
    $logArray['mailtoresponse'] = "$smtpResponse"; 

    if(!$smtpResponse) { 
     return "Fail"; 
    } 

    //The Email 
    fputs($smtpConnect, "DATA" . $newLine); 
    $smtpResponse = fgets($smtpConnect, 515); 
    $logArray['data1response'] = "$smtpResponse"; 

    if(!$smtpResponse) { 
     return "Fail"; 
    } 

    //Construct Headers 
    $headers = "MIME-Version: 1.0" . $newLine; 
    $headers .= "Content-type: text/html; charset=iso-8859-1" . $newLine; 
    $headers .= "To: ".$nameto." <".$to.">" . $newLine; 
    $headers .= "From: ".$namefrom." <".$from.">" . $newLine; 
    fputs($smtpConnect, "Subject: $subject\n$headers\n\n $message \n.\n"); 
    $smtpResponse = fgets($smtpConnect, 515); 
    $logArray['data2response'] = "$smtpResponse"; 

    if(!$smtpResponse) { 
     return "Fail"; 
    } 

    // Say Bye to SMTP 
    fputs($smtpConnect,"QUIT" . $newLine); 
    $smtpResponse = fgets($smtpConnect, 515); 
    $logArray['quitresponse'] = "$smtpResponse"; 

    if(!$smtpResponse) { 
     return "Fail"; 
    } 

    echo "It worked!"; 
    return "Success"; 
    //insert var_dump here -- uncomment out the next line for debug info 
    //var_dump($logArray); 
} 
+4

Я настоятельно рекомендую вам использовать этот код и использовать Zend_Mail, PHPMailer, SwiftMailer или что-то подобное. В любом случае, если это ничего не возвращает, значит, это должно означать! $ StmpResponse никогда не будет правдой. – Corbin

+0

Uncommenting var_dump ($ logArray) дает много информации, поэтому маловероятно, что smtpResponse никогда не будет правдой. Для каждого значения «true» добавляется дополнительная строка в $ logArray. Я решил использовать эту функцию, чтобы я мог отлаживать ее, если это необходимо. Я посмотрел на каждый из других вариантов, о которых вы говорили, но это проще всего интегрировать. – user1251259

ответ

2

:) у вас есть опечатка

//Send e-mail 
$repsonse = authSendEmail($from, $namefrom, $sendto,"", $subject,$message); 

//Report success/failure 
echo $response; 

вы возвращаетесь $ repsonse и вы эхо отклик

И для записи $ . Копирование/вставка какого-либо кода elses не приведет вас никуда. Если вы хотите научиться программировать, напишите код самостоятельно или если вам действительно нужно скопировать/вставить, попробуйте понять, что вы копируете/вставляете. Я не пытаюсь быть злым, просто давая вам совет. Удачи!

+0

Спасибо, Влад! ХОРОШЕЕ ГЛАЗА! В самом деле, я полностью согласен с вами. Если бы я не пытался понять код, я бы не пытался обрабатывать ошибки ... и не было бы этой проблемы! Я все еще не получаю ответа. – user1251259

+0

Мой совет вам - начать писать эту функцию с нуля и отлаживать ее шаг за шагом. напишите часть подключения и проверьте возвращаемое значение, запишите регистрационную часть и проверьте возвращаемое значение и так далее. Также посмотрите на xdebug, который поможет вам увидеть, какие кодовые пути вызываются. По моему опыту, когда код таинственным образом начинает разрушаться, лучше начинать с нуля. удачи! –

+0

Спасибо, Влад. Вместо этого я использовал функцию php mail. Несмотря на то, что он всегда возвращает false (документированная проблема с моей версией php, которую не сложно решить), у меня никогда не было фактического сбоя при отправке почты. Когда я узнаю немного больше о том, как работают сокеты и как правильно улавливать соответствующие ошибки, я буду использовать код copypasted как резервный метод. – user1251259

0

Может быть, это слишком упрощенно, но, действительно ли вы иметь такую ​​строку:

//Report success/failure echo $response; 

Это эхо является лишь частью комментария , вам нужно поместить его в новую строку.

Кроме того, вы должны закрыть это соединение сокета перед выходом из своей функции.

Кроме того, было бы лучше вернуть логическое значение true при успешном завершении и false при ошибке, IMHO.

+0

Это не решение проблемы! – Dyin

+0

Итак, ваши эхо-сигналы внутри функции (например, «Это сработало!») Правильно повторяются, но когда вы эхо возвращаете значение функции (которое является строкой в ​​каждом случае), вы ничего не получаете? Это очень странно. Можете ли вы рассказать о своих усилиях по эхо из функции? Вы пытались повторить что-то непосредственно перед каждым вашим возвратом, чтобы определить, когда вы выходите из этой функции? – Okonomiyaki3000

+0

Я предполагаю, что «виновник:» на самом деле не находится в коде, который вы пытаетесь запустить. Это наверняка вызовет некоторые проблемы. – Okonomiyaki3000

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