2010-04-14 24 views
9

Nota: Cabe señalar que la función mail() no es adecuado para más grandes volúmenes de correo electrónico en un bucle. Esta función abre y cierra un socket SMTP para cada correo electrónico, que no es muy eficiente. Fuente: manual de PHPenvío de mensajes de correo electrónico utilizando -200 + php mail() en un bucle

¿Cuáles son los volúmenes más grandes? A 100 o 1000? ¿Puedo hacer un ciclo de forma segura 200 veces sin muchos problemas? (No puedo instalar pear)

+0

Wow, 5 respuestas, 4 de ellas bastante buenas (la quinta también es útil, solo polémica), ¿y no hay votos por votos? (además del que yo di) Ay. Voy a ir y difundir un poco de amor .. –

Respuesta

6

Puede recorrerlo 200 veces con pocos problemas, supongo, aunque será mucho más lento que un programa publicitario personalizado o un paquete configurado correctamente para manejarlo.

El resultado final depende de muchos factores. Lo principal que querrá asegurarse es que use set_time_limit() para dar el guión tiempo suficiente para hacer el trabajo. Descargar el trabajo en algún tipo de cola que es atendida por un script cron puede hacerle la vida más fácil también, ya que mantener los scripts PHP ejecutándose durante mucho tiempo traerá otros problemas de recursos.

Hace mucho tiempo, solía enviar unos 50,000 correos electrónicos a un boletín de suscriptores usando la función de correo de PHP y un servidor RedHat con Exim instalado. Tardaría de 4 a 6 horas con el script personalizado que tenía en ejecución. No había nada eficiente al respecto, pero hizo el trabajo.

2

Cuanto menor sea el lote, mejor, pero depende de su configuración (velocidad del servidor, red, etc.). Probablemente usaría un trabajo cron y haría pequeños lotes. Debe suponer que un correo() podría bloquearse y detener el procesamiento, lo que hace que sea importante marcar cada fila en su lista como correo electrónico enviado.

Por ejemplo, si puede hacer 1 correo electrónico por segundo o un poco más rápido, entonces haría un lote de 50, en un trabajo de cron que se ejecuta cada minuto. Use su consulta SQL para obtener los resultados TOP 50 que aún no se han enviado, ya que no puede estar seguro de dónde está comenzando.

+1

+1 para la consulta SQL para evitar volver a procesar los mismos 50 una y otra vez, cada minuto! –

0

Primero tiene que echar un vistazo a sus Condiciones del servicio (TOS) con su proveedor de hosting o upstream. Si causas problemas para ellos, y estás en violación de los TOS, te dejarán caer como una cuchara caliente.

A continuación, puede evitar abrumar el sistema de correo y mantenerse por debajo del radar de cualquier "reaper bots" simplemente agregando una llamada sleep() cada 10 mensajes más o menos. Hazlo ajustable para que puedas limitar tanto el número de iteraciones como el tiempo de espera. Eitehr como parámetros, o a través de un archivo de configuración (este último podría ser consultado en la parte superior del ciclo, para hacer ajustes sobre la marcha.

3

Hace aproximadamente 5-6 años (la última vez que investigué este tipo de cosas), vi software de listas de correo en PHP utilizando la función mail() que enviaba cientos de mensajes cada vez que se enviaba la función "enviar a lista de correo" invocado. A medida que el cliente agregaba más y más nombres (en muchos miles, la última vez que lo comprobé), el sistema se estaba volviendo bastante lento. Al final, compraron un software de terceros para manejar correos de gran volumen y se hospedaron en un servidor separado de su servidor web para evitar ralentizar su sitio web.

Como han señalado otros, debe aclarar esto con su proveedor de hosting antes de comenzar a enviar lotes de más de unas pocas docenas a la vez: cada compañía de hosting tendrá sus propias políticas, y si esto viola los TOS, puede desconectarte/cortar tu hosting. Idealmente, la transmisión de correo de gran volumen debería realizarse desde un servidor solo para este fin.De esta forma, si se cuelga o se congela, no tendrá que preocuparse por afectar otras aplicaciones.

Si realmente está enviando cantidades muy grandes de correo, existen paquetes comerciales que también administrarán la lista de correo, gestionarán las opt-outs y opt-ins, versiones de correos electrónicos, harán texto vs . Correo HTML, etc. ... investigue algunos de ellos si habla en serio.

Sé que esto no responde a la pregunta principal de "alternativas a la función mail()?" pero es lo mejor que puedo hacer, ¡no he visto ninguno! Lo único que se me ocurre es administrar manualmente las conexiones SMTP en PHP (no estoy seguro de qué tan posible es eso) o usar alguna biblioteca externa para hacerlo.

1

Si desea enviar correos de hasta 1000 usuarios, simplemente páselos en una matriz y luego ponga el mail() en un bucle.

Lo único que debe recordar es poner set_time_limit(0) en la primera línea y poner flush() en la última línea, y puede enviar tantos correos como desee.

Cuestiones relacionadas