2015-09-23 47 views
6

Tôi đang sử dụng PHPMailer để gửi email hoạt động tốt. Tuy nhiên, vấn đề là do nó gửi email đồng bộ, tải trang tiếp theo mất một thời gian dài.Gửi email Không đồng bộ qua PhpMailer

Tôi đang sử dụng PHPMailer như trong ví dụ này https://github.com/PHPMailer/PHPMailer/blob/master/examples/gmail.phps

Tôi tự hỏi nếu có một cách để làm cho gửi email không đồng bộ. Tôi nghiên cứu này và thấy rằng sendmail có một tùy chọn để thiết lập để "chế độ nền" DeliveryMode - Nguồn http://php.net/manual/en/function.mail.php

mail($to, $subject, $message, $headers, 'O DeliveryMode=b'); 

Tôi muốn biết nếu có điều gì tương tự có thể được thực hiện trong PHPMailer? Có ai đã có bất kỳ thành công với điều này?

EDIT: - (thông tin bổ sung) Nó có vẻ như PHPMailer có thể được cấu hình để sử dụng sendmail - https://github.com/PHPMailer/PHPMailer/blob/master/class.phpmailer.php Vì vậy, tôi tự hỏi nếu điều này có thể được bằng cách nào đó đòn bẩy để cho phép giao nền.

/** 
* Which method to use to send mail. 
* Options: "mail", "sendmail", or "smtp". 
* @type string 
*/ 
public $Mailer = 'mail'; 

/** 
* The path to the sendmail program. 
* @type string 
*/ 
public $Sendmail = '/usr/sbin/sendmail'; 
/** 
* Whether mail() uses a fully sendmail-compatible MTA. 
* One which supports sendmail's "-oi -f" options. 
* @type boolean 
*/ 
public $UseSendmailOptions = true; 

/** 
* Send messages using $Sendmail. 
* @return void 
*/ 
public function isSendmail() 
{ 
    $ini_sendmail_path = ini_get('sendmail_path'); 
    if (!stristr($ini_sendmail_path, 'sendmail')) { 
     $this->Sendmail = '/usr/sbin/sendmail'; 
    } else { 
     $this->Sendmail = $ini_sendmail_path; 
    } 
    $this->Mailer = 'sendmail'; 
} 

Ngoài ra - rõ ràng là có cách nào để thiết lập tùy chọn sendmail qua php.ini http://blog.oneiroi.co.uk/linux/php/php-mail-making-it-not-suck-using-sendmail/

Tôi muốn làm điều này như một cuộc tranh cãi nội tuyến cuộc gọi api vs php.ini để isnt một toàn cầu thay đổi. Có ai đã thử điều này?

Trả lời

14

Cách tiếp cận sai.

PHPMailer không phải là máy chủ thư, đó là những gì bạn đang yêu cầu. SMTP là một giao thức dài dòng, có thể dễ bị trì hoãn và thông lượng chậm, và hoàn toàn không thích hợp để gửi tương tác trong quá trình gửi trang web điển hình (đó là câu hỏi mà BlackHatSamurai liên quan đến có thể đang làm). Nhiều người tránh xa với việc làm chính xác điều đó, nhưng đừng bị lừa khi nghĩ đó là một giải pháp tốt, và chắc chắn không cố gắng tự mình thực hiện một MTA.

Ví dụ về gmail mà bạn liên kết đang sử dụng SMTP cho máy chủ từ xa, sẽ luôn chậm hơn gửi cục bộ. Nếu bạn đang gửi qua sendmail (hoặc mail() - về cơ bản là điều tương tự) với máy chủ cục bộ và mất hơn 0,1 giây, bạn đang làm điều gì đó rất sai. Ngay cả SMTP để localhost sẽ không mất nhiều thời gian hơn, và gửi đến một máy chủ thông minh gần đó là không thể quá chậm hoặc.

Cố gắng làm nền bằng cách sử dụng luồng là một lượng lớn sâu không chính xác không phải là cách để thực hiện điều này - bất cứ điều gì bạn đạt được theo cách đó sẽ thật khủng khiếp so với máy chủ thư thích hợp. Chỉ cần không làm điều đó.

Cách đúng để thực hiện việc này là cài đặt máy chủ thư cục bộ và gửi thư của bạn tới máy chủ bằng PHPMailer. Bằng cách này rất nhanh (hàng trăm tin nhắn mỗi giây), và bạn phải làm chính xác không có gì để làm cho nó hoạt động vì đó là cách PHPMailer hoạt động theo mặc định.

Máy chủ thư sau đó sẽ thực hiện những gì cần làm - xếp hàng thư của bạn, xử lý sự cố kết nối, trì hoãn gửi, thư bị trả lại và mọi thứ khác mà bạn chưa xem xét.

+0

Phản hồi tuyệt vời. Cảm ơn vì lời giải thích chi tiết. Nhiều đánh giá cao!! Tôi là một phần của một noob khi nói đến vấn đề này - bạn có bất kỳ khuyến nghị mà trên đó máy chủ mail để lựa chọn/cài đặt. Tôi đang sử dụng gói lưu trữ được chia sẻ. Không chắc chắn nếu máy chủ web của tôi sẽ cho phép tôi cài đặt tùy chỉnh. – rogerb

+0

Hầu hết các bản phân phối Linux đều sử dụng postfix, mà tôi thích exim hơn. Có rất nhiều người khác mặc dù. Nếu ISP của bạn sẽ không cho phép bạn cài đặt một, họ có thể cung cấp một cái gì đó đã có, hoặc một máy chủ thông minh gần đó - kiểm tra tài liệu của họ, mở một vé hỗ trợ. Nếu không, tôi khuyên bạn nên cài đặt nhà cung cấp dịch vụ mới ... – Synchro

+1

Cảm ơn @Synchro. Tôi đã kết thúc bằng cách sử dụng máy chủ thư mặc định được cung cấp bởi nhà cung cấp dịch vụ lưu trữ của tôi và nhận thấy (với dấu thời gian) rằng nó mất khoảng 2 giây cho mỗi email. Vì vậy, tôi gọi là webhost của tôi và họ nói rằng kể từ khi tôi đang ở trên một kế hoạch lưu trữ được chia sẻ, sự chậm trễ đó được mong đợi (rõ ràng máy chủ thư của họ gửi đến một proxy nơi xếp hàng của nó trước khi gửi). Cuối cùng tôi đặt "-O DeliveryMode = b" trong php.ini của tôi (http://blog.oneiroi.co.uk/linux/php/php-mail-making-it-not-suck-using-sendmail/) tạo ra sự khác biệt rất lớn. Các email hiện đang được gửi ở chế độ nền và tập lệnh của tôi sẽ trả lại sau ** 0,16 giây! ** – rogerb

0

Theo thisphpMailer không hỗ trợ loại cuộc gọi này. Bạn sẽ phải viết lớp ren của riêng bạn để thực hiện cuộc gọi không đồng bộ. Xem pThreads và lớp Thread. Một giải pháp khác đã được tìm thấy here.

+0

Cảm ơn phản hồi của bạn và các liên kết. Tôi tự hỏi nếu thats hoàn toàn chính xác (tối đa ngày) bởi vì phpMailer dường như cho phép sendmail như một cơ chế giao hàng. Tôi sẽ chỉnh sửa câu hỏi của mình và thêm thông tin này vào câu hỏi. – rogerb

+0

@rogerb, bất kể bạn phải viết lại lớp Sendmail để sử dụng một chuỗi không đồng bộ. – BlackHatSamurai

+0

Điều gì về việc sử dụng một máy chủ thông minh? – Phil

Các vấn đề liên quan