2010-02-17 31 views
15

Tôi đang cố gắng sử dụng Thư PEAR để gửi bằng máy chủ SMTP bên ngoài. Có vẻ như đã treo một lúc rồi kịch bản kết thúc. Nó xuất ra tất cả các câu lệnh "echo" của tôi cho đến khi nó được gửi đi. Không có gì là đầu ra qua echo nói "trước khi gửi". Bất cứ ai có thể cho tôi biết những gì có thể sai ở đây? (giá trị giả được thay thế cho giá trị smtp). Thư không được gửi. Cảm ơn bạn đã trợ giúp!Sự cố với 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"; 

Trả lời

6

Hãy thử điều này để đảm bảo email của bạn đang làm việc:

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

Nếu điều này không làm việc thì bạn sẽ cần phải kiểm tra cấu hình PHP của bạn.

Xem http://php.net/manual/en/function.mail.php để biết thêm thông tin.

+0

Cảm ơn bạn đã trả lời Todd. – Kenny

+0

Xin chào! Tôi đã thử nghiệm tập lệnh của bạn và nó có cùng hiệu ứng với mã "thực". Nó treo, không có cảnh báo, không có lỗi. cấu hình php của tôi chứa error_reporting = E_ALL | E_STRICT và display_errors = Bật. Bất cứ một đề nghị nào khác? –

+1

Làm theo lời khuyên của Rap và Jayme Dunlap bằng cách chạy nó trên dòng lệnh để xem lỗi. –

2

Kịch bản của Todd là tuyệt vời, nhưng sẽ không giải quyết được vấn đề của bạn mà trình duyệt của bạn hết thời gian trước khi SMTP thực hiện. Đó là lý do tại sao bạn chỉ thấy một nửa trang của mình và không thấy bất kỳ thông báo lỗi nào mà bạn có thể sử dụng để gỡ lỗi cài đặt SMTP của mình.

Giải pháp là chạy tập lệnh PHP trực tiếp. Không có thời gian chờ.

Nếu bạn không thể làm điều đó vì ISP của bạn không cung cấp cho bạn quyền truy cập trình bao, hãy tạo công việc cron để chạy từng phút. Cron sẽ gửi email đầu ra cho bạn, nó sẽ có đầy đủ các chi tiết gỡ rối.

15

Tôi đã gặp sự cố tương tự khi nó được treo trên lệnh gửi. Bước đầu tiên của tôi là chạy từ dòng lệnh để xem thông báo lỗi đầy đủ (như Rap được đề xuất ở trên).

php mymailsample.php 

Nó nhổ ra

sau
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 

Tôi đã tải về sau, và đặt chúng trong/Net

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

tôi phải điều chỉnh các điều khoản của Các thư viện SMTP và Socket để chúng có thể được đọc bởi Apache.

Và thì đấy, nó đã hoạt động!

+10

Hoặc chỉ cần chạy 'sudo lê cài đặt Net_SMTP' nếu có thể chạy lê từ dòng lệnh :) –

+0

@JustinJenkins Bạn đá người đàn ông! – mboy

1

Tôi đã gặp sự cố tương tự. Một kịch bản sản xuất bị phá vỡ và tôi đã có thời gian khắc phục sự cố khó khăn nhất. Chủ yếu là vì có quá nhiều mã ngăn chặn lỗi hiển thị. Cuối cùng, tôi đã sử dụng mã của Kenny Ray, sửa đổi nó để làm việc cho môi trường của tôi và chạy thử nghiệm. Hóa ra Net_Socket bằng cách nào đó biến mất. Tôi đã gỡ cài đặt và cài đặt lại nó và mọi thứ bắt đầu hoạt động trở lại. Tôi hy vọng cái này sẽ giúp bạn.

47

Nếu ai đó đang chạy trên Linux và chạy vào cùng một vấn đề với Jayme. Đây là một giải pháp đơn giản để cài đặt các lớp "Net /" bị thiếu. Các lớp bị thiếu này làm cho tập lệnh bị gián đoạn.

sudo pear install Net_SMTP

+1

Đây là những gì đã sửa cho tôi. – smoothgrips

+0

Đây là giải pháp của tôi. Cảm ơn;) – daniherculano

+0

Điều này cũng phù hợp với tôi! Cảm ơn – Sahil

5

Các cài đặt lại các kênh: công việc Does'nt //pear.php.net/Mail-1.2.0 cho tôi (Ubuntu 12..04)

Chỉ cần loại bỏ các caracter "&" trước mới

sudo vi /usr/share/php/Mail/smtp.php 
    349   /*$this->_smtp = &new Net_SMTP($this->host, */ 
    350   $this->_smtp = new Net_SMTP($this->host, 
Các vấn đề liên quan