Enviando 500 emails con PHP

Kaos

¡Buenas a todos! Tengo una duda curiosa. Os planteo el caso:

Tengo un script que envía 500 emails, en PHP. Digamos que, cada email, tarda en enviarse 2 segundos. Haciendo una cuenta sencilla, tenemos un total de 1000 segundos de ejecución. Dejando de lado el max execution time, ¿existe forma de lanzar este script en segundo plano?

Lo que me gustaría, en realidad, es no tener que dejar la ventana abierta para que no deje de enviar esos emails...

¿Se os ocurre alguna solución? Para más reseñas, utilizo Wordpress, con lo que si tenéis algún comando que vaya con este CMS, pues también lo podría utilizar.

¡Gracias!

B

#1 Meter en el cron ese script?

http://stackoverflow.com/questions/22358382/execute-php-script-in-cron-job

1 2 respuestas
willy_chaos

Y si lo lanzas desde un cron

1 1 respuesta
Kaos

Voy a leer documentación y os comento cómo me queda el asunto :)
¡Gracias a los dos!

Kaos

#2 #3 y con EXEC o SYSTEM no os parece más sencillo? Teniendo en cuenta que el envío es siempre inmediato...

2 respuestas
Amazon

#5 creo que el max execution time corta la ejecución del comando lanzado con exec o system

1 respuesta
Troyer

#5 #6

bool set_time_limit ( int $seconds )

Set the number of seconds a script is allowed to run. If this is reached, the script returns a fatal error. The default limit is 30 seconds or, if it exists, the max_execution_time value defined in the php.ini.

Lo subes a al doble de lo que tarde en ejecutarse y ya.

RaymaN

¿Cómo envías los emails? Yo tengo una tarea que me envía unos mil con phpmailer y suele tardar menos de 80 segundos.

1 respuesta
Troyer

#8 Los envía con PHPMailer casi seguro, y tarda tanto porque los irá construyendo uno a uno según los datos del destinatario supongo.

Kaos

El tema es que no tenga que dejar la pestaña del navegador abierta... no sé si exec o system lo consiguen...

2 respuestas
HeXaN

Ya te han dado la solución en #2.

2 respuestas
Troyer

#10 Navegador? Puedes hacerlo con consola, utilizas entorno windows o linux? En linux es tan simple como tener un cliente php instalado y en la terminal poner:

php archivo.php

#11 Cron para una única ejecución? Estámos tontos?

2 respuestas
Kaos

#11 Lo sé, lo sé. Pero quería evitar crear un cron job.

Al script le llegan parámetros desde otras páginas anteriores, por eso quiero evitarlo.
No son siempre los mismos emails. Vienen de una base de datos, y esos resultados a su vez de un formulario que se completa antes.

No es tan "sencillo" como ejecutar un php y listo.

#12 Sí, es una app Web.

1 respuesta
HeXaN

#12 ¿Y crees que si fuese para una única vez habría abierto el tema #1? El envío se va a repetir, digo yo.

1 respuesta
Amazon

#10 http://php.net/manual/en/function.ignore-user-abort.php

2
Kaos

#14 No. El envío no se repite. Cada vez que se envía hay un tema diferente, contenidos, usuarios, etc. A ver, se puede hacer con cron, pero habría que liarla bastante, y lo único que quiero evitar es que se ejecute en primer plano y haga break al cerrar la pestaña.

Esto me parece cojonudo:

ignore_user_abort(true);
set_time_limit(0);

Tengo que ver si desde el archivo PHP tengo permisos para eso. Hay veces que estas configuraciones las ignora (creo).

Troyer

#13 Pues te toca modificar el script para que se ejecute desde consola y le pasas los parametros, sin duda es la manera más optima de hacer lo que quieres hacer, aquí tienes un poco de info: http://php.net/manual/es/reserved.variables.argv.php

1 respuesta
Kaos

#17 Totalmente. Es la forma más adecuada, pero ya te digo, me tocaría rehacerlo todo y es una mierda de script que uso 2 veces al mes xD

Voy a probar lo de 15 porque me podría dar el apaño perfectamente.

Beavis

Cualquier operación de ese tipo tiene más sentido hacerla asíncrona con un sistema de colas. Tienes un único proceso consumiendo una cola a la que puedes añadir elementos desde donde sea, hay múltiples maneras de hacerlo.
Por cierto con la cantidad de servicios de mail transaccional que existen hoy en día (muchos con una capa gratuita más que generosa para un uso moderado y con sus respectivos plugins para wordpress) no le veo mucho sentido a enviar mails desde tu propio servidor.

2 2 respuestas
Kaos

#19 Puto vivis. <3

Ya. Antes de nada he tenido en cuenta todos tus consejos, sin necesidad de preguntarte xD ya sabía que me dirías eso. De hecho tengo un código de un sistema de mailing que me hiciste hace tiempo. No sé si lo recuerdas.

El caso que usaba Sendgrid, pero no llegan porque están en listas baneadas y tramas muy gordas. Sólo le llegan con el correo interno.

1 respuesta
Troyer

#19 Aprovecho el tema, cual recomiendas?

Como dice #20 muchas veces los clientes tienen esos servers blacklisted, no pasan el filtro y se pierden, hay casos que no te la puedes jugar y toca enviarlo desde tu servidor.

2 respuestas
Kaos

#21 Mailchimp y Sendgrid son mis favs.

Beavis

#21 yo he usado mandrill, sendgrid, amazon ses y sparkpost
Mandrill lo chaparon para cualquiera que no sea cliente de mailchimp y creo que sendgrid han quitado o capado el tier gratuito.
Personalmente siempre he tenido mejores resultados de deliverability usando esos servicios que con el servidor propio, es mucho más fácil que tu servidor que no tiene ningún tipo de reputación entre en una blacklist que uno de esas empresas que se dedican únicamente a hacer que los emails lleguen, otra cosa es que la líe uno mismo y acabes haciendo saltar alguna lista, o que mandes campañas de mierda que te reporten tanto como spam que te acaben bloqueando xD

1
Kaos

A ver son campañas internas... van del dominio al mismo dominio :P

1 respuesta
Beavis

#24 tienes problemas enviando mails a tu propio dominio? es posible que no tengas bien configurados los campos de SPF/DKIM o tengas algún conflicto con el servidor de correo local?

1 respuesta
Kaos

#25 No, no, qué va. No hay problema. El problema viene desde Sendgrid y Mailchimp. Desde dentro no hay ningún fallo.

Tunnecino

Como dice Beavis, la verdad es que tirando o de un sistema propio de colas, estilo beanstalkd o RabbitMQ, y entonces vas fragmentando los envíos.

Aunque mi opción preferida es eso, tirar de sendinblue, mailjet, y demás. Mailchimp ya no está enfocado a emails transaccionales, tenlo en cuenta, aunque entiendo que lo que haces es enviar campañas.

Prueba si no mailjet, o tira de amazon SeS, que tiene/tenía un límite gratuito bastante aceptable.

Y para cualquiera de ellos, si tienes bien configurado el SPF/DKIM como dice Beavis en tu correo, y tienes en el spf habilitado el envío desde el servicio, no deberías de tener problemas, a no ser que realmente te lo capten como spam los clientes de correo.

Lo bueno también de usar estos servicios es poder hace un tracking de los envíos, ver los que rebotan, bajas, etc...

1

Usuarios habituales

  • Tunnecino
  • Kaos
  • Beavis
  • Troyer
  • Amazon
  • HeXaN
  • RaymaN