2012-08-22 1 views
0

양식을 제출할 때 전자 메일을 보내는 기능이 있습니다. 이 함수는 다음 if 문을 포함합니다.디버그 코드를 제거하면 PHP 메일러에서 전자 메일을 보내지 않습니다.

if ($guestDetails) 
{ 
    $mailer->addRecipient($guestDetails->email); 
    $mailer->addCC($config->get('emails_admin_email')); 

    $mailer->setSubject($subject); 
    $mailer->setBody($template_layout); 
    $mailer->IsHTML($mode);   
    $mailer->setSender(array($mailfrom, $fromname)); 
    $sent = $mailer->send(); 
} 

최근에이 기능이 작동하지 않아 이메일이 더 이상 전송되지 않습니다. 무슨 일이 일어나고 있는지 조사하기 위해 PHP 오류 로그에 아무것도 기록되지 않아 일부 변수를 기록하도록 코드를 수정했습니다. 여기에 만약 문이 지금 모습입니다 :

$testArr = array(); 
ClassName::_log_r("guestdetails", $guestDetails); 
if ($guestDetails) 
{ 
    ClassName::_log_r("got into if", $testArr); 
    $mailer->addRecipient($guestDetails->email); 
    $mailer->addCC($config->get('emails_admin_email')); 

    $mailer->setSubject($subject); 
    $mailer->setBody($template_layout); 
    $mailer->IsHTML($mode);   
    $mailer->setSender(array($mailfrom, $fromname)); 
    $sent = $mailer->send(); 
    ClassName::_log_r("mailer", $mailer); 
    ClassName::_log_r("sent", $sent); 
} else 
    ClassName::_log_r("got into else", $testArr); 

_log_r는 주어진 변수의 내용을 파일에 텍스트를 쓰는 기능입니다. 이 "디버그"코드를 추가하고 나면 전자 메일이 다시 전송되기 시작하고 로그에 "got into if"가 올바르게 기록됩니다. 위에서 언급 한 디버그 코드를 제거하면 전자 메일이 다시 전송되지 않습니다.

나는 아마도 여기서 일어날 수있는 일에 당황하고 있습니다. 누구도 이런 식으로 우연히 만났습니까? 디버그 코드를 제거 할 때 전자 메일이 전송되지 않는 이유는 무엇입니까? 자세한 정보가 필요하면 알려주십시오. 감사!

PS 코드는 PHP로 작성하고 서버가 PHP를 실행 5.3.10

+0

코드를 추가하고 전자 메일이 전송합니까 때,이 곳으로 전송합니까 너는 그들을 갈 생각이야? 의미, 만약 당신이'ClassName :: _ log_r ("details", print_r ($ guestDetails, true));'당신은 무엇을 얻습니까? – Julian

+0

모든 종류의 오류 메시지가 생성됩니까? 아니면 코드가 전자 메일을 보내려고 시도했지만 수신되지 않았습니까? SMTP 서버의 오류 로그에 내용이 있습니까? – andrewsi

+0

율리우스 - 예, 이메일이 올바른 수신자에게 전송됩니다. –

답변

1

마음에 오는 유일한 가능성이 대답은 어떤 이유로, $guestDetails가 더 이상 정의되지 않은 (예를 들어, 이름이 변경되었다,이다 다른 곳의 $guestDetail).

또한 존재하지 않는 경우 인수를 다시 정의하려면 _log_r 함수가 필요합니다.

CC로 전송되는 메일 만 확인하면 수신자가 도착합니다. 유효하지 않은 경우 $guestDetails은 처리를 중단하지 않을 것입니다. 실제로는 관리자에게 보내는 이메일 만 생성됩니다.

if (!defined($guestDetails)) 
    ClassName::_log_r("mailer", "Not defined"); 
if (empty($guestDetails)) 
    ClassName::_log_r("mailer", "empty"); 

좀 더 세부 사항이 밖으로 걱정 될 수 있는지 여부를 확인 같은

보십시오 뭔가. 세드릭 대신 _log_r와 로그의

+0

제안 해 주셔서 감사합니다. "$ guestDetails"는 배열이므로 "isset"을 사용하여 "defined"를 변경했습니다. 그런 다음이 if-statement 앞에이 네 줄을 추가하려고했습니다. if 문 다음에 붙여 넣을 때 아무 일도 일어나지 않습니다. 아무 것도 기록되지 않고 이메일도 보내지지 않습니다. if 문 앞에 추가하면 아무 것도 기록되지 않고 전자 메일 *이 전송됩니다. –

+1

이것은 미친 짓입니다. 단순히 변수를 참조하면 어떻게 든 사물을 변경한다는 의미입니까? 이 컴퓨터가 혹시 양자 컴퓨터에서 작동합니까? 진지하게, 나는 Joomla를 알지 못한다! 이런 종류의 "마술 변수"를 구현합니다 ...이 어딘가에 숨어있는 좀 더 큰 버그에 대한 두려움이 있습니다 :-( – LSerni

+0

하하하 ... 이걸 디버깅하려고 미친 거예요. 편집 : 무서운 부분은, 나는 일관되게 같은 결과를 얻습니다. 그것은 변수의 범위의 일부처럼 느껴집니다. send() 함수로 유출되었지만 PHP가 AFAIK를 수행하지 않습니다. –

1

, 메일 예외를 포착하고 당신이 더 나은 정보를 얻을 수 있는지 확인하려고 :

if ($guestDetails) 
{ 
    try 
    { 
     $mailer->addRecipient($guestDetails->email); 
     $mailer->addCC($config->get('emails_admin_email')); 

     $mailer->setSubject($subject); 
     $mailer->setBody($template_layout); 
     $mailer->IsHTML($mode);   
     $mailer->setSender(array($mailfrom, $fromname)); 
     $sent = $mailer->send(); 
    } 
    catch (phpmailerException $e) 
    { 
     echo $e->errorMessage(); //you could do a _log_r here.. 
    } 
    catch (Exception $e) 
    { 
     echo $e->getMessage(); //or here.. 
    } 
} 
else 
{ 
    echo "guestDetails empty!"; //or here.. 
} 
+0

시도했습니다. 같은 일이 발생했습니다. try-catch가 포함되면 아무 것도 잘못되지 않고 예외가 발생하지 않고 전자 메일이 전송됩니다. try-catch를 제거하고 전자 메일을 더 이상 보내지 않습니다. –