2010-02-17 10 views
15

Próbuję użyć poczty PEAR do wysyłania za pomocą zewnętrznego serwera SMTP. Wydaje się, że zawiesił się na jakiś czas, a następnie skrypt się kończy. Wyprowadza wszystkie moje "echo" oświadczenia aż do jednego po wysłaniu. Nic nie jest wyprowadzane poza echo, które mówi "przed wysłaniem". Czy ktoś może mi powiedzieć, co tu może być nie tak? (wartości smsowe zastępują wartości smtp). Poczta nie jest wysyłana. Dzięki za pomoc!Problem z PHP PEAR Mail

echo "start"; 
$n = $_POST['txtName']; 
$e = $_POST['txtEmail']; 
$t = 'Kenny <[email protected]>'; 
$f = 'Kenny <[email protected]>'; 
$s = 'CPA TEST'; 
$b = "name: $n email: $e"; 

include("mail.php"); 
echo "after include"; 
/* mail setup recipients, subject etc */ 
$recipients = $t; 
$headers["From"] = $f; 
$headers["To"] = $t; 
$headers["Subject"] = $s; 
$mailmsg = $b; 
/* SMTP server name, port, user/passwd */ 
$smtpinfo["host"] = "my_smtp_host"; 
$smtpinfo["port"] = "25"; 
$smtpinfo["auth"] = true; 
$smtpinfo["username"] = "my_email"; 
$smtpinfo["password"] = "my_password"; 
echo "before object"; 
/* Create the mail object using the Mail::factory method */ 
$mail_object =& Mail::factory("smtp", $smtpinfo); 
echo "before send"; 
/* Ok send mail */ 
$send = $mail_object->send($recipients, $headers, $mailmsg); 
echo "after send"; 
if (PEAR::isError($send)) { print($send->getMessage());}else{print "end";} 
echo "done"; 

Odpowiedz

6

Spróbuj tego, aby zapewnić poczta pracuje:

<?php 
require_once "Mail.php"; 

$from = "Sandra Sender <[email protected]>"; 
$to = "Ramona Recipient <[email protected]>"; 
$subject = "Hi!"; 
$body = "Hi,\n\nHow are you?"; 

$host = "mail.example.com"; 
$username = "smtp_username"; 
$password = "smtp_password"; 

$headers = array ('From' => $from, 
    'To' => $to, 
    'Subject' => $subject); 
$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>"); 
} 
?> 

Jeśli to nie poskutkuje, to trzeba będzie sprawdzić konfigurację PHP.

Aby uzyskać więcej informacji, patrz http://php.net/manual/en/function.mail.php.

+0

Dzięki za odpowiedź Todd. – Kenny

+0

Cześć. Przetestowałem twój skrypt i ma taki sam efekt jak "prawdziwy" kod. Wisi, nie ma ostrzeżeń, nie ma błędów. moja konfiguracja php zawiera error_reporting = E_ALL | E_STRICT i display_errors = Włączone. Jakieś inne sugestie? –

+1

Postępuj zgodnie z poradami Rap i Jayme Dunlap, uruchamiając go w wierszu poleceń, aby zobaczyć błąd. –

2

Scenariusz Todda jest doskonały, ale nie rozwiąże problemu, który polega na tym, że przeglądarka przekroczyła limit czasu, zanim zrobi to SMTP. Dlatego widzisz tylko połowę swojej strony i nie widzisz żadnych komunikatów o błędach, których możesz użyć do debugowania ustawień SMTP.

Rozwiązaniem jest bezpośrednie uruchomienie skryptu PHP. Bez limitu czasu.

Jeśli nie możesz tego zrobić, ponieważ twój dostawca usług internetowych nie zapewnia dostępu do powłoki, utwórz crona, aby uruchamiać ją co minutę. Cron wyśle ​​ci e-mailem dane wyjściowe, które będą zawierały pełne szczegóły debugowania.

15

Wpadłem na ten sam problem, w którym zawieszono polecenie send. Pierwszym krokiem było uruchomienie z wiersza poleceń, aby zobaczyć pełny komunikat o błędzie (jak sugerował to Rap).

php mymailsample.php 

To wypluć następujące

Warning: include_once(Net/SMTP.php): failed to open stream: No such file or directory in mail/Mail/smtp.php on line 348 
PHP Warning: include_once(): Failed opening 'Net/SMTP.php' for inclusion (include_path='.:/usr/lib/php') in mail/Mail/smtp.php on line 348 
PHP Fatal error: Class 'Net_SMTP' not found inmail/Mail/smtp.php on line 349 

Pobrałem następujący, i umieścić je w/net

http://pear.php.net/package/Net_SMTP/download
http://pear.php.net/package/Net_Socket/download

musiałem dostosować zezwoleń wydanych Biblioteki SMTP i Socket, aby mogły być czytane przez Apache.

I voila, zadziałało!

+10

Lub po prostu uruchom 'sudo gruszka zainstaluj Net_SMTP' jeśli możesz uruchomić gruszka z linii poleceń :) –

+0

@JustinJenkins You rock man! – mboy

1

Tak naprawdę napotkałem ten sam problem. Scenariusz produkcji zepsuł się i miałem najtrudniejszy czas, aby go rozwiązać. Głównie dlatego, że było tak dużo kodu, który zapobiegał pojawianiu się błędów. Ostatecznie użyłem kodu Kenny'ego Raya, zmodyfikowałem go, by działał w moim środowisku i przeprowadziłem test. Okazało się, że Net_Socket jakoś zniknął. Po odinstalowaniu i ponownym zainstalowaniu go wszystko zaczęło działać. Mam nadzieję, że to Ci pomoże.

47

Jeśli ktoś działa na systemie Linux i ma taki sam problem jak Jayme. Oto kolejne proste rozwiązanie do instalacji brakujących klas "Net /". Te brakujące klasy powodują przerwanie skryptu.

sudo pear install Net_SMTP

+1

To właśnie naprawiło to dla mnie. – smoothgrips

+0

To było moje rozwiązanie. Dzięki;) – daniherculano

+0

To działało również dla mnie! Dzięki – Sahil

5

Ponowna instalacja kanałów: //pear.php.net/Mail-1.2.0 does'nt praca dla mnie (Ubuntu. 12.04)

Wystarczy wyjąć caracter "&" przed nowymi

sudo vi /usr/share/php/Mail/smtp.php 
    349   /*$this->_smtp = &new Net_SMTP($this->host, */ 
    350   $this->_smtp = new Net_SMTP($this->host, 
Powiązane problemy