2009-07-13 22 views
46

Actualmente estoy escribiendo un blog de música. El administrador publica un nuevo artículo cada 2-3 días. Una vez que el administrador publique un artículo, se enviará un correo electrónico masivo a aproximadamente 5000 suscriptores de inmediato.envío de correo electrónico masivo usando PHP

¿Cuál es la mejor manera de implementar la función de correo masivo?

hace lo siguiente trabajo de la función?

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

Otra pregunta: Si todos los 5000 suscriptores están utilizando Yahoo Mail, Yahoo va a tratarlo como un ataque DDoS y bloquear la dirección IP del servidor SMTP?

+0

Sí, pero bastante mal para los 5000 destinatarios que me imagino. –

+0

Qué sucede si envío 5000 correos electrónicos con la función PHP mail(). ¿Pero todos los correos están en BCC, no en bucle con mail()? ¿Está bien? – user345602

+9

@ user346665: Dado que miles de correos electrónicos de BCC entrarán en el encabezado del correo electrónico, obtendrá el siguiente error fatal (lo obtuve yo mismo): 'php-server postfix/sendmail [26573]: fatal: [email protected] (33): no se pueden extraer los destinatarios: la longitud del encabezado del mensaje supera el límite de seguridad' – YOMorales

Respuesta

44

En primer lugar, utilizar la función de correo() que viene con PHP no es una solución óptima. Se marca fácilmente como spam y debe configurar el encabezado para asegurarse de que está enviando correos electrónicos HTML correctamente. En cuanto a si el fragmento de código funcionará, lo haría, pero dudo que obtendrá el código HTML dentro de él correctamente sin specifying extra headers

Le sugiero que eche un vistazo a SwiftMailer, que tiene soporte HTML, soporte para diferentes tipos de mime y autenticación SMTP (que es menos probable que marque su correo como spam).

+9

+1 Es posible que también desee hacer un envío diferido/temporizado, dependiendo de qué tan bien puede controlar el servidor de correo. Algunos servidores de destino pueden bloquearlo si envía cientos de mensajes a la vez. Además, es posible que desee mantener un registro detallado del estado de cada correo electrónico enviado. Tener más de 100 cuentas de prueba de correo electrónico (sus cuentas de prueba), y probarlas de forma incremental con contenido diferente ayudará. –

+6

+1 para SwiftMailer – alex

+0

+1 Swiftmail, lo usó hace unos años y nunca miró hacia atrás. – Chud37

15

Esto es un consejo, no una respuesta: Usted está mucho, mucho mejor usando el software de la lista de correo dedicada. mailman es un ejemplo utilizado frecuentemente, pero algo tan simple como mlmmj puede ser suficiente. Enviar correos masivos es en realidad una tarea más difícil de lo que realmente parece ser. No sólo usted tiene que enviar los correos, también hay que mantener un registro de "muerto" trata de evitar su correo, o peor, su servidor de correo, se marque como spam. Tienes que manejar a las personas que se dan de baja por la misma razón.

Puede implementar estas cosas usted mismo, pero particularmente el manejo de rebotes es difícil y no es gratificante. Usar un administrador de lista de correos hará las cosas mucho más fáciles.

En cuanto a cómo hacer que su correo sea apetecible para yahoo, eso es otro asunto completamente diferente. Para todas sus fallas, parecen poner un gran stock en SPF y DomainKey. Probablemente tendrá que implementarlos, lo que requerirá la cooperación de su administrador de servidor de correo.

+0

Gracias por este consejo, Michiel. Estaba buscando enviar alrededor de 4000 correos electrónicos a los clientes que pre ordenaron desde un sitio web que administro. Hay muchos argumentos buenos para usar un servicio, y cuando analicé el costo de agregar estos suscriptores a la cuenta Mailchimp de mi cliente (por un mes), el aumento fue de aproximadamente $ 30US. Mucho más económico que hacerlo a mano. – Jason

12

Usted puede considerar el uso de CRON para ese tipo de operación. Enviar correo masivo a la vez ciertamente no es bueno, puede detectarse como spam, ddos, bloquear su servidor, etc.

Así que CRON podría ser una gran solución, envíe 100 correos a la vez, luego espere unos minutos, los próximos 100 , etc.

+12

Al ejecutar un script PHP desde CRON, no hay tiempo de espera de php ya que está ejecutando PHP desde la línea de comandos. Esto significa que, en lugar de establecer un CRON cada pocos minutos, puede poner un cmd de suspensión en el código que cuenta 100 correos electrónicos enviados y luego dormir (some_time) y el script continuará. – Martin

+2

Una pequeña adición a la afirmación de @Martin: http://www.php.net/manual/en/features.commandline.differences.php – YOMorales

2

también echar un vistazo a la clase PHPMailer. PHPMailer

+0

Si no me equivoco, ¿no está SwiftMailer incorporado en la parte superior de PHPMailer? ? – Extrakun

+3

Hay muchas cosas construidas encima de PHPMailer, PHPList también está construido encima de PHPMailer – Roland

26

Insertaría todos los correos electrónicos en una base de datos (como una cola), luego los procesaría uno a la vez como lo hizo en su código (si desea usar swiftmailer o phpmailer, etc., puede eso también.)

Después de enviar cada correo, actualice la base de datos para registrar la fecha/hora en que fue enviado.

poniéndolos en la base de datos primero hay que

  1. un registro de quién lo envió a
  2. si sus tiempos fuera de guión o si falla y hay que ejecutarlo de nuevo, entonces no lo hará termine enviando el mismo correo electrónico a las personas dos veces
  3. puede ejecutar el proceso de envío desde un trabajo cron y hacer un lote a la vez, para que su servidor de correo no se vea desbordado y realizar un seguimiento de lo que se ha enviado

Tenga en cuenta cómo automatizar los correos electrónicos devueltos o no válidos para que se eliminen automáticamente de su lista.

Si está enviando tantos correos electrónicos, seguramente obtendrá algunos rebotes.

8

¿Por qué no prefiere usar phplist? También está construido sobre PHP Mailer y muchos líderes de la industria lo están usando. Lo he usado un par de veces para enviar correos masivos a mis clientes. Lo bueno de phplist es que puedes regular tus mensajes en un nivel de dominio más un límite de tiempo. Para obtener una lista completa de características, consulte: http://www.phplist.com/details

Lo que también hemos hecho con un par de sistemas de captura internos que tenemos es empujar nuestra base de usuarios a la lista de mailling y luego tener una entrada de cron disparando un correo dado cada día. Las posibilidades son infinitas, ¡eso es lo increíble de la fuente abierta!

8

No envíe envíe un correo electrónico a 5,000 personas usando las herramientas estándar de PHP. La mayoría de los PSI te prohibirán en segundos y nunca lo sabrán. Usted debe usar algún programa de listas de correo o Email Service Provider para esto.

+1

Eso podría ser cierto, pero si mantiene sus correos por debajo de 100 mensajes por hora, entonces la mayoría de los ISP no le causarán mucha pena; Sin embargo, tan pronto como abuse de su red, ¡estará listo! Solo asegúrate de que tus encabezados estén estructurados según los estándares; No abuse de las redes y estará a salvo. – Conrad

-1

¿Por qué molestarse en programar usted mismo? Es un blog, solo use Google Feedburner que automáticamente envía actualizaciones a los suscriptores por correo electrónico.

Es gratis y usa Infraestructura de Google. No puede ser mejor que eso. Lo uso para algunos de mis sitios/blogs y funciona maravillosamente.

Lo malo es que no parece estar desarrollado de manera activa y no es compatible más. Sugiero que frunzas el ceño a una lista de correo electrónico comercial si eres serio acerca de tu negocio.

0

Ya lo hice usando Lotus Notus y PHP.Esta solución funciona si tiene acceso al servidor de correo o puede solicitar algo al administrador mail server:

1) Cree un grupo en el mail server: "Departamento de ventas".
2) Asigne a group las cuentas que necesita para estar en el grupo.
3) Asigne una dirección de internet al grupo: [email protected]
4) Cree su script PHP usando la función de correo:
$ to = "[email protected]";
correo ($ a, $ asunto, $ mensaje, $ encabezados);

Me funcionó y todas las cuentas incluidas en el grupo reciben el correo.

Lo mejor de las suertes.

0

Puede usar swiftmailer para ello. Al usar el proceso por lotes.

<?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(); 
?> 
Cuestiones relacionadas