2010-04-14 58 views
9

Lưu ý: Cần lưu ý rằng hàm thư() không phù hợp với khối lượng email lớn hơn trong vòng lặp. Chức năng này mở và đóng một cổng SMTP cho mỗi email, không phải là rất hiệu quả. Nguồn: PHP thủGửi +200 email bằng hàm php mail()

khối lượng lớn hơn là gì? Một 100 hoặc 1000? Tôi có thể đặt vòng lặp 200 lần mà không gặp phải nhiều vấn đề? (Tôi không thể cài đặt lê)

+0

Wow, 5 câu trả lời, 4 người trong số họ khá tốt (thứ 5 là hữu ích mặc dù quá, chỉ gây tranh cãi), và không có upvotes? (bên cạnh cái tôi đã tặng). Ouch. Tôi sẽ đi và lây lan một số tình yêu .. –

Trả lời

6

Bạn có thể lặp 200 lần với một số vấn đề mà tôi tưởng tượng, mặc dù sẽ chậm hơn nhiều so với bưu phẩm tùy chỉnh hoặc gói được thiết lập đúng cách để xử lý điều đó. Việc giảm tải công việc thành một số hàng đợi được phục vụ bởi một kịch bản cron có thể làm cho cuộc sống của bạn trở nên dễ dàng hơn, vì việc giữ cho các tập lệnh PHP chạy trong một thời gian dài sẽ gây ra các vấn đề tài nguyên khác.Trở lại trong ngày, tôi đã sử dụng để gửi khoảng 50.000 email cho một bản tin thuê bao bằng cách sử dụng chức năng mail của PHP và một máy chủ RedHat với Exim được cài đặt. Nó sẽ mất 4-6 giờ với kịch bản tùy chỉnh tôi đã chạy. Không có gì hiệu quả về nó, nhưng nó đã làm công việc.

2

Lô nhỏ càng tốt, nhưng nó phụ thuộc vào thiết lập của bạn (tốc độ máy chủ, mạng, v.v.). Tôi có lẽ sẽ sử dụng một công việc cron và làm các lô nhỏ. Bạn cần giả sử một thư() có thể treo và ngừng xử lý, điều này khiến cho việc đánh dấu từng hàng trong danh sách của bạn là email được gửi đến mức quan trọng.

Ví dụ: nếu bạn có thể thực hiện 1 email mỗi giây hoặc nhanh hơn một chút, thì tôi sẽ thực hiện một loạt 50, trong một công việc định kỳ chạy mỗi phút. Sử dụng truy vấn SQL của bạn để có được kết quả TOP 50 chưa được gửi, vì bạn không thể chắc chắn nơi bạn đang bắt đầu.

+1

+1 cho truy vấn SQL để tránh tái xử lý cùng một 50 hơn và hơn, mỗi phút! –

0

Trước tiên, bạn cần xem Điều khoản dịch vụ (TOS) của mình với nhà cung cấp dịch vụ lưu trữ hoặc nhà cung cấp ngược dòng. Nếu bạn gây rắc rối cho họ, và bạn đang vi phạm TOS, họ sẽ thả bạn như một cái muỗng nóng.

Tiếp theo, bạn có thể tránh áp đảo hệ thống thư và ở bên dưới radar của bất kỳ "rô bốt" nào bằng cách thêm lệnh sleep() gọi 10 tin nhắn hoặc hơn. Làm cho nó có thể điều chỉnh để bạn có thể giới hạn cả số lần lặp lại và độ trễ của giấc ngủ. Eitehr là thông số hoặc thông qua tệp cấu hình (tệp sau có thể được thăm dò ở đầu vòng lặp, để thực hiện điều chỉnh liên tục.

3

Khoảng 5-6 năm trước (lần cuối cùng tôi nhìn vào loại điều này), tôi thấy phần mềm danh sách gửi thư bằng PHP sử dụng hàm mail() gửi hàng trăm thư mỗi lần tính năng "gửi tới danh sách gửi thư" được viện dẫn. Khi khách hàng thêm ngày càng nhiều tên (vào hàng nghìn, cuối cùng tôi đã kiểm tra) hệ thống đã nhận được khá chậm. Cuối cùng, họ đã mua một số phần mềm của bên thứ 3 để xử lý việc gửi thư với khối lượng lớn và được lưu trữ trên máy chủ riêng biệt với máy chủ web của họ để tránh làm chậm trang web của họ.

Như những người khác đã chỉ ra, bạn nên làm rõ điều này với nhà cung cấp dịch vụ lưu trữ trước khi bắt đầu gửi hàng nhiều hơn một vài chục tại một thời điểm - mọi công ty lưu trữ sẽ có chính sách riêng của họ và nếu điều này vi phạm TOS, có thể ngắt kết nối bạn/cắt bỏ lưu trữ của bạn. Lý tưởng nhất, việc truyền thư lớn nên được thực hiện từ một máy chủ chỉ vì mục đích này.Bằng cách đó, nếu nó treo hoặc đóng băng, bạn sẽ không phải lo lắng về việc ảnh hưởng đến các ứng dụng khác.

Nếu bạn thực sự gửi một lượng thư rất lớn, có các gói thương mại ngoài đó cũng sẽ quản lý danh sách gửi thư, họ sẽ quản lý chọn không tham gia và chọn tham gia, phiên bản email, họ sẽ thực hiện văn bản HTML mail, vv ... nghiên cứu một số trong số họ nếu bạn nghiêm túc.

Tôi biết điều này không trả lời câu hỏi chính về "các lựa chọn thay thế cho hàm mail()?" nhưng đó là điều tốt nhất tôi có thể làm - tôi chưa từng thấy! Điều duy nhất tôi có thể nghĩ là quản lý thủ công các kết nối SMTP trong PHP (không chắc chắn cách có thể) hoặc sử dụng một số thư viện bên ngoài để thực hiện nó.

1

Nếu bạn muốn gửi thư đến 1000 người dùng, sau đó chỉ cần chuyển chúng trong một mảng và sau đó đặt mail() trong một vòng lặp.

Điều duy nhất cần nhớ là chỉ cần đặt set_time_limit(0) trên dòng đầu tiên và đặt flush() vào dòng cuối cùng và bạn có thể gửi bao nhiêu thư tùy thích.