2009-07-13 110 views
46

Tôi hiện đang viết một blog nhạc. Quản trị viên đăng một bài viết mới sau mỗi 2-3 ngày. Khi quản trị viên đăng một bài viết, một email hàng loạt sẽ được gửi tới khoảng 5000 người đăng ký ngay lập tức.Gửi email hàng loạt bằng cách sử dụng PHP

Cách tốt nhất để triển khai tính năng thư hàng loạt là gì?

Chức năng sau có hoạt động không?

function massmail() 
{ 
    $content = '...'; 
    foreach ($recipients as $r) { 
    $_content = $content . '<img src="http://xxx/trackOpenRate.php?id='.$r.'">'; 
    mail($r, 'subject', $_content); 
    } 
} 

Câu hỏi khác: Nếu tất cả 5000 thuê bao đang sử dụng Yahoo Mail, Yahoo sẽ đối xử với nó như một cuộc tấn công DDOS và chặn địa chỉ IP của máy chủ SMTP của tôi?

+0

Có, nhưng khá kém cho 5000 người nhận tôi tưởng tượng. –

+0

Điều gì xảy ra nếu tôi gửi 5000 email bằng hàm PHP mail(). Nhưng tất cả các thư phải ở BCC, không được lặp lại với thư()? Nó có ổn không? – user345602

+9

@ user346665: Vì hàng nghìn email BCC sẽ đi vào tiêu đề của email, sau đó bạn sẽ gặp phải lỗi nghiêm trọng sau đây (nhận được bản thân mình): 'php-server postfix/sendmail [26573]: fatal: [email protected] (33): không thể trích xuất người nhận: độ dài tiêu đề thư vượt quá giới hạn an toàn' – YOMorales

Trả lời

44

Trước hết, sử dụng hàm mail() đi kèm với PHP không phải là giải pháp tối ưu. Nó có thể dễ dàng đánh dấu là spam, và bạn cần phải thiết lập tiêu đề để đảm bảo rằng bạn đang gửi email HTML chính xác. Về việc đoạn mã có hoạt động hay không, nhưng tôi nghi ngờ bạn sẽ nhận được mã HTML bên trong chính xác mà không cần

Tôi sẽ đề nghị bạn xem SwiftMailer, hỗ trợ HTML, hỗ trợ các loại mime khác nhau và xác thực SMTP (ít có khả năng đánh dấu thư của bạn là spam).

+9

+1 Bạn cũng có thể muốn gửi một số lần gửi trễ/trễ, tùy thuộc vào mức độ kiểm soát của máy chủ thư. Một số máy chủ đích có thể chặn bạn nếu bạn gửi hàng trăm tin nhắn cùng một lúc. Ngoài ra, bạn có thể muốn lưu nhật ký chi tiết về trạng thái của từng email được gửi. Có hơn 100 tài khoản email thử nghiệm (tài khoản thử nghiệm của bạn) và thử nghiệm chúng dần dần với các nội dung khác nhau sẽ giúp ích. –

+6

+1 cho SwiftMailer – alex

+0

+1 Swiftmail, sử dụng nó vài năm trước và không bao giờ nhìn lại. – Chud37

15

Đây là lời khuyên, không phải là câu trả lời: Bạn đang sử dụng phần mềm danh sách gửi thư chuyên dụng hơn rất nhiều. mailman là một ví dụ không được sử dụng, nhưng một cái gì đó đơn giản như mlmmj có thể đủ. Gửi thư hàng loạt thực sự là một nhiệm vụ khó khăn hơn nó thực sự xuất hiện được. Bạn không chỉ phải gửi thư, bạn cũng phải theo dõi các địa chỉ "đã chết" để tránh thư của bạn, hoặc tệ hơn, máy chủ thư của bạn, bị đánh dấu là spam. Bạn phải xử lý mọi người hủy đăng ký vì nhiều lý do tương tự.

Bạn có thể tự mình thực hiện những việc này, nhưng đặc biệt là việc xử lý thoát là khó khăn và công việc không thuận lợi. Sử dụng trình quản lý danh sách gửi thư sẽ giúp mọi việc dễ dàng hơn nhiều.

Để biết cách làm cho thư của bạn trở nên ngon miệng đối với yahoo, đó là một vấn đề khác hoàn toàn. Đối với tất cả các lỗi của nó, họ dường như đặt cổ phiếu tuyệt vời trong SPF và DomainKey. Bạn có thể sẽ phải thực hiện chúng, mà sẽ yêu cầu hợp tác từ quản trị viên máy chủ thư của bạn.

+0

Cảm ơn lời khuyên này, Michiel. Tôi đã tìm cách gửi khoảng 4000 email cho khách hàng đã đặt hàng trước từ trang web mà tôi quản lý. Có rất nhiều đối số tốt để sử dụng dịch vụ và khi tôi xem xét chi phí để thêm những người đăng ký này vào tài khoản Mailchimp của khách hàng của tôi (trong một tháng), số tiền đó tăng khoảng $ 30US. Tiết kiệm hơn nhiều so với thực hiện nó bằng tay. – Jason

12

Bạn có thể xem xét sử dụng CRON cho loại hoạt động đó. Gửi thư hàng loạt cùng một lúc chắc chắn không tốt, nó có thể bị phát hiện là spam, ddos, máy chủ của bạn bị lỗi, v.v.

Vì vậy, CRON có thể là giải pháp tuyệt vời, gửi 100 thư cùng một lúc, sau đó đợi vài phút, tiếp theo 100 , v.v.

+12

Khi chạy một tập lệnh PHP từ CRON, không có thời gian chờ php khi bạn đang chạy PHP từ dòng lệnh. Điều này có nghĩa là thay vì thiết lập một CRON vài phút một lần bạn có thể đặt một cmd ngủ trong mã của bạn mà đếm 100 email được gửi sau đó ngủ (some_time) và kịch bản sẽ tiếp tục. – Martin

+2

Một chút bổ sung để hỗ trợ tuyên bố của @Martin: http://www.php.net/manual/en/features.commandline.differences.php – YOMorales

2

Ngoài ra, hãy xem lớp PHPmailer. PHPMailer

+0

Nếu tôi không sai, SwiftMailer không được xây dựng trên PHPMailer ? – Extrakun

+3

Có rất nhiều thứ được xây dựng trên PHPMailer, PHPList cũng được xây dựng trên PHPMailer – Roland

26

Tôi sẽ chèn tất cả email vào cơ sở dữ liệu (sắp xếp như hàng đợi), sau đó xử lý chúng một lần như bạn đã làm trong mã của bạn (nếu bạn muốn sử dụng swiftmailer hoặc phpmailer, v.v. cũng vậy.)

Sau mỗi thư được gửi, hãy cập nhật cơ sở dữ liệu để ghi lại ngày/giờ được gửi.

Bằng cách đặt chúng trong cơ sở dữ liệu đầu tiên bạn có

  1. một kỷ lục của những người bạn đã gửi nó tới
  2. nếu kịch bản lần bạn ra hay thất bại và bạn phải chạy nó một lần nữa, sau đó bạn sẽ không cuối cùng gửi cùng một email ra cho mọi người hai lần
  3. bạn có thể chạy quy trình gửi từ một công việc cron và thực hiện hàng loạt tại một thời điểm để máy chủ thư của bạn không bị quá tải và theo dõi những gì đã được gửi

Xin lưu ý, cách tự động hóa email bị trả lại hoặc email không hợp lệ để chúng có thể tự động bị xóa khỏi danh sách của bạn.

Nếu bạn gửi nhiều email mà bạn bị ràng buộc nhận một số thư bị trả lại.

8

Tại sao bạn không sử dụng phplist? Nó cũng được xây dựng dựa trên PHP Mailer và rất nhiều nhà lãnh đạo ngành đang sử dụng nó. Tôi đã sử dụng nó bản thân mình một vài lần để gửi thư số lượng lớn cho khách hàng của tôi. Điều tốt đẹp về phplist là bạn có thể điều chỉnh thông điệp của mình ở cấp tên miền cộng với mức giới hạn thời gian. Để có danh sách đầy đủ các tính năng, hãy xem: http://www.phplist.com/details

Chúng tôi cũng đã thực hiện với một vài hệ thống chụp nội bộ để đẩy cơ sở người dùng của chúng tôi vào danh sách mailling và sau đó kích hoạt mục nhập cron một thư nhất định mỗi ngày. Các khả năng là vô tận, đó là điều tuyệt vời về nguồn mở!

8

Không được gửi email đến 5.000 người bằng các công cụ PHP chuẩn. Bạn sẽ bị cấm bởi hầu hết các ISP trong vài giây và thậm chí không bao giờ biết điều đó. Bạn nên sử dụng một số phần mềm danh sách gửi thư hoặc Email Service Provider làm điều này.

+1

Điều đó có thể đúng, nhưng nếu bạn giữ thư dưới 100 thư mỗi giờ thì hầu hết ISP sẽ không cho bạn nhiều đau buồn; tuy nhiên ngay sau khi bạn lạm dụng mạng của họ thì bạn đang ở trong đó! Chỉ cần đảm bảo tiêu đề của bạn được cấu trúc theo tiêu chuẩn; Đừng lạm dụng mạng và bạn sẽ được an toàn. – Conrad

-1

Tại sao bạn lại bận tâm đến chương trình? Đó là một blog, chỉ cần sử dụng Google Feedburner sẽ tự động cập nhật cho người đăng ký qua email.

Đó là miễn phí và sử dụng Cơ sở hạ tầng của Google. Không thể làm tốt hơn thế. Tôi sử dụng nó cho một số trang web/blog của tôi và nó hoạt động tuyệt vời.

Nhược điểm là không dường như được tích cực phát triển và không được hỗ trợ nữa. Tôi muốn đề nghị bạn cau mày đi đến một danh sách email thương mại nếu bạn nghiêm túc về doanh nghiệp của bạn.

0

Tôi đã làm điều đó bằng cách sử dụng Lotus NotusPHP.Giải pháp này hoạt động nếu bạn có quyền truy cập vào máy chủ thư hoặc bạn có thể yêu cầu điều gì đó cho mail server Quản trị viên:

1) Tạo nhóm trong mail server: "Bộ phận bán hàng".
2) Chỉ định cho các tài khoản group bạn cần có trong nhóm.
3) Chỉ định địa chỉ internet cho nhóm: [email protected]
4) Tạo cho bạn tập lệnh PHP bằng cách sử dụng chức năng thư:
$ to = "[email protected]";
thư ($ đến, $ subject, $ message, $ headers);

Làm việc cho tôi và tất cả các tài khoản được bao gồm trong nhóm sẽ nhận được thư.

Tốt nhất của những con lucks.

0

Bạn có thể sử dụng swiftmailer cho nó. Bằng cách sử dụng quy trình theo lô.

<?php 
    $message = Swift_Message::newInstance() 
     ->setSubject('Let\'s get together today.') 
     ->setFrom(array('[email protected]' => 'From Me')) 
     ->setBody('Here is the message itself') 
     ->addPart('<b>Test message being sent!!</b>', 'text/html'); 

    $data = mysql_query('SELECT first, last, email FROM users WHERE is_active=1') or die(mysql_error()); 
    while($row = mysql_fetch_assoc($data)) 
    { 
     $message->addTo($row['email'], $row['first'] . ' ' . $row['last']); 
    } 

    $message->batchSend(); 
?> 
Các vấn đề liên quan