2010-02-17 4 views
15

J'essaie d'utiliser PEAR Mail pour envoyer en utilisant un serveur smtp externe. Il semble être suspendu pendant un moment, puis le script se termine. Il sort tous mes "echo" déclarations jusqu'à celui après l'envoi. Rien n'est émis après l'écho qui dit "avant d'envoyer". Quelqu'un peut-il me dire ce qui pourrait être mauvais ici? (Valeurs fictives substituées aux valeurs smtp). Le courrier n'est pas envoyé. Merci pour ton aide!Problème avec 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"; 

Répondre

6

Essayez ceci pour vous assurer que votre courrier fonctionne:

<?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>"); 
} 
?> 

Si cela ne vous fonctionne pas alors besoin de vérifier votre configuration PHP. Pour plus d'informations, voir http://php.net/manual/en/function.mail.php.

+0

Merci pour la réponse Todd. – Kenny

+0

Salut à tous. J'ai testé votre script et il a le même effet que le "vrai" code. Il se bloque, pas d'avertissement, pas d'erreur. ma config php contient error_reporting = E_ALL | E_STRICT et display_errors = On. D'autres suggestions? –

+1

Suivez les conseils de Rap et Jayme Dunlap en l'exécutant sur la ligne de commande pour voir l'erreur. –

2

Le script de Todd est excellent, mais ne résoudra pas votre problème, c'est-à-dire que votre navigateur expire avant le SMTP. C'est pourquoi vous ne voyez que la moitié de votre page et ne voyez aucun message d'erreur que vous pouvez utiliser pour déboguer vos paramètres SMTP.

La solution est d'exécuter le script PHP directement. Aucun délai d'attente

Si vous ne pouvez pas faire cela parce que votre FAI ne vous donne pas l'accès au shell, créez un travail cron à exécuter toutes les minutes. Cron vous enverra la sortie par courrier électronique avec des détails de débogage complets.

15

J'ai rencontré le même problème où il était accroché sur la commande d'envoi. Ma première étape a été de lancer à partir de la ligne de commande pour voir le message d'erreur complet (comme Rap suggéré ci-dessus).

php mymailsample.php 

Il recracher les éléments suivants

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 

J'ai téléchargé les éléments suivants, et les mettre dans/Net

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

je devais régler les permissions du Les bibliothèques SMTP et Socket pour qu'elles puissent être lues par Apache.

Et voilà, ça a marché!

+10

Ou juste lancez 'sudo pear install Net_SMTP' si vous pouvez exécuter pear à partir de la ligne de commande :) –

+0

@JustinJenkins Vous rock homme! – mboy

1

J'ai rencontré le même problème. Un script de production est tombé en panne, et j'ai eu le plus de mal à le résoudre. Principalement parce qu'il y avait tellement de code qui empêchait les erreurs d'apparaître. Finalement, j'ai utilisé le code de Kenny Ray, l'ai modifié pour fonctionner dans mon environnement et j'ai fait un test. Il s'est avéré que le Net_Socket a disparu. Je l'ai désinstallé et réinstallé, et tout a recommencé à fonctionner. J'espère que ceci vous aide.

47

Si quelqu'un fonctionne sous Linux et rencontre le même problème que Jayme. Voici une autre solution simple pour installer les classes "Net /" manquantes. Ces classes manquantes provoquent l'interruption du script.

sudo pear install Net_SMTP

+1

C'est ce qui m'a arrangé. – smoothgrips

+0

C'était ma solution. Merci;) – daniherculano

+0

Cela a fonctionné pour moi aussi! Merci – Sahil

5

La réinstallation du canal: //pear.php.net/Mail-1.2.0 travail does'nt pour moi (Ubuntu 12..04)

enlever Juste le caracter "&" avant que de nouvelles

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