2013-08-30 78 views
5

Tôi đang cố gắng sử dụng PHPMailer để gửi e-mail qua SMTP nhưng cho đến nay đã không có may mắn. Tôi đã trải qua một số câu hỏi SO, hướng dẫn PHPMailer và các bài đăng trên diễn đàn nhưng vẫn không thể làm cho nó hoạt động. Tôi sẽ ghi lại như nhiều lần thất bại của tôi như tôi có thể nhớ để tiết kiệm thời gian, nhưng trước hết ở đây là mã Tôi đang sử dụng:Thư không gửi bằng PHPMailer qua SSL bằng cách sử dụng SMTP

<?php 
    session_start(); 
    error_reporting(E_ALL); 
    ini_set('display_errors','On'); 

    require('includes/class.phpmailer.php'); 
    include('includes/class.smtp.php'); 
    $mail = new PHPMailer(); 

    $name = $_POST["name"]; 
    $guests = $_POST["guests"]; 
    $time = $_POST["time"]; 

    $message = "<h1>".$name." has booked a table for ".$guests." at ".$time."</h1>"; 

    $mail->IsSMTP(); // telling the class to use SMTP 
    $mail->Host  = "ssl://smtp.gmail.com"; // SMTP server 
    $mail->SMTPDebug = 1;      // enables SMTP debug information (for testing) 
    $mail->SMTPAuth = true;     // enable SMTP authentication 
    $mail->Port  = 26;     // set the SMTP port for the GMAIL server 
    $mail->Username = "[email protected]"; // SMTP account username 
    $mail->Password = "myPassword";  // SMTP account password 
    $mail->SetFrom('[email protected]', 'James Cushing'); 
    $mail->AddReplyTo("[email protected]","James Cushing"); 
    $mail->Subject = "PHPMailer Test Subject via smtp, basic with authentication"; 
    $mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; 
    $mail->MsgHTML($message) 
    $address = "[email protected]"; 
    $mail->AddAddress($address, "James Cushing"); 

    if(!$mail->Send()) { 
     echo "Mailer Error: " . $mail->ErrorInfo; 
    } else { 
     echo "Message sent!"; 
    } 
?> 

Thứ nhất, khi tôi chạy mã này ngay bây giờ tôi nhận được hai lỗi khác nhau. Trên máy chủ cục bộ của tôi, tôi gặp lỗi:
SMTP -> LRI: Không thể kết nối với máy chủ: Đã hết thời gian hoạt động (60)
Địa chỉ gửi sau không thành công: [email protected]: Called Mail() mà không được kết nối
Mailer lỗi: sau đây Từ địa chỉ thất bại: [email protected]: được gọi là mail() mà không bị kết nối

tôi nhận được moreorless các lỗi tương tự chạy cùng mã trên máy chủ web của tôi, nhưng dòng đầu tiên là:
SMTP -> LRI: Không thể kết nối với máy chủ: Mạng không thể truy cập được (101)

Rõ ràng là đáng để chỉ ra rằng tôi không sử dụng chữ "[email protected]" nhưng tôi đã thay thế email của riêng mình cho bài đăng này.

Những điều tôi đã cố gắng
- Sử dụng máy chủ iCloud SMTP
- Sử dụng một cổng khác
- Việc kích hoạt phần mở rộng OpenSSL trong file php.ini của tôi
- Mã Sao chép từ các ví dụ PHPMailer khác nhau
- Sử dụng hệ thống "DisplayUnlockCaptcha" của Google để bật kết nối
- Gửi đến và đi từ các địa chỉ khác nhau - Xóa "@ gmail.com" khỏi thuộc tính Tên người dùng - Một số điều khác tôi không thể nhớ

Điều này đã khiến tôi phát điên trong khoảng một ngày, vì vậy nếu có ai đó có thể giải quyết thì họ sẽ là một anh hùng.

Cảm ơn

+1

Điều gì xảy ra nếu bạn thay đổi cổng thành 465? –

+0

@userNOID Đó là một trong những điều tôi quên đề cập đến mà tôi đã thử. Nó cho tôi điều này: ** SMTP -> LRI: EHLO không được chấp nhận từ máy chủ: SMTP -> LRI: HELO không được chấp nhận từ máy chủ: SMTP -> LRI: AUTH không được chấp nhận từ máy chủ: SMTP -> THÔNG BÁO: EOF bị bắt khi kiểm tra xem có kết nối không ** –

+0

Hỗ trợ tài khoản SMTP của bạn? –

Trả lời

25
$mail->IsSMTP(); 
$mail->Host = "smtp.gmail.com"; 
$mail->SMTPAuth = true; 
$mail->SMTPSecure = "ssl"; 
$mail->Username = "[email protected]"; 
$mail->Password = "**********"; 
$mail->Port = "465"; 

Đó là một cấu hình làm việc.

cố gắng thay thế những gì bạn có

+0

Cảm ơn ybert, Điều này thực sự đã chỉ cho tôi đúng hướng và hiện đã được khắc phục! Tôi chắc chắn 99,999% tôi đã có cấu hình chính xác bị lỗi trước đó, nhưng có thể đó là sự kết hợp của những gì đã được thay đổi ở phần phụ trợ kể từ đó. Tôi phải thêm '$ address =" [email protected] "; $ mail-> AddAddress (địa chỉ $, "James Cushing"); $ message = "Email body"; $ mail-> MsgHTML ($ message); \t nếu (! $ Mail-> Gửi()) { \t echo "Lỗi Mailer:". $ mail-> ErrorInfo; } else { \t echo "Đã gửi tin nhắn!"; } ' Nhưng sau đó nó hoạt động cục bộ. Kiểm tra trên máy chủ web của tôi bây giờ –

+0

Ok, chạy nó trên máy chủ web của tôi vẫn mang lại cho tôi ** SMTP -> LRI: Không thể kết nối với máy chủ: Mạng không thể truy cập được (101) ** Chúng tôi đang ở một nửa! –

+0

Đó là một lỗi khác. Máy chủ SMTP của bạn trên máy chủ web của bạn không được định cấu hình tốt. Nhưng mã là tốt. Bạn không cần phải thay đổi nó! – ybert

2

Thứ nhất, sử dụng các cài đặt cho Google:

$mail->IsSMTP(); 
$mail->Host = "smtp.gmail.com"; 
$mail->SMTPAuth = true; 
$mail->SMTPSecure = "tls"; //edited from tsl 
$mail->Username = "myEmail"; 
$mail->Password = "myPassword"; 
$mail->Port = "587"; 

Nhưng cũng có thể, những gì firewall đã bạn đã thiết lập?

Nếu bạn lọc ra các cổng TCP 465/995 và có thể là 587, bạn sẽ cần phải định cấu hình một số ngoại lệ hoặc đưa chúng ra khỏi danh sách quy tắc của mình.

https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

+0

$ mail-> SMTPSecure = "tsl"; phải là $ mail-> SMTPSecure = "tls"; – Behrens

1

tôi nhận được một thất bại tương tự với SMTP bất cứ khi nào máy khách hàng của tôi thay đổi kết nối mạng (ví dụ, nhà vs mạng văn phòng) và bằng cách nào đó khởi động lại dịch vụ mạng (hoặc khởi động lại máy) giải quyết vấn đề đối với tôi. Không chắc chắn nếu điều này sẽ áp dụng cho trường hợp của bạn, nhưng chỉ trong trường hợp.

sudo /etc/init.d/networking restart # for ubuntu 
2

Không sử dụng SSL trên cổng 465, không được sử dụng từ năm 1998 và chỉ được sử dụng bởi các sản phẩm của Microsoft không nhận được bản ghi nhớ; sử dụng TLS trên cổng 587 thay vào đó: Vì vậy, mã bên dưới sẽ hoạt động rất tốt cho bạn.

mail->IsSMTP(); // telling the class to use SMTP 
$mail->Host  = "smtp.gmail.com"; // SMTP server 

$mail->SMTPAuth = true;     // enable SMTP authentication 
$mail->SMTPSecure = "tls";     // sets the prefix to the servier 
$mail->Host  = "smtp.gmail.com";  // sets GMAIL as the SMTP server 
$mail->Port  = 587;     // set the SMTP port for the 
+1

Nếu sử dụng một máy chủ web cụ thể mặc dù, một số có 465 là cổng mặc định. – OzzyTheGiant

+0

Hỗ trợ của họ sẽ có thể giúp bạn đi bộ xung quanh. – Asuquo12

0

Thứ nhất, Google đã tạo ra các "sử dụng phương pháp tài khoản kém an toàn" chức năng:

https://myaccount.google.com/security

Sau đó, tạo được sự cho phép khác:

https://accounts.google.com/b/0/DisplayUnlockCaptcha

Hy vọng nó giúp.

+0

Đây là một vấn đề từ khoảng 4 năm trước, nhưng hy vọng ai đó tìm kiếm cùng một vấn đề sẽ thấy điều này hữu ích :) –

+0

Cảm ơn. Tôi cũng nghĩ thế. :) –