Problemas con envio de correos en php !!

Iniciado por Diabliyo, 14 Noviembre 2008, 19:31 PM

0 Miembros y 1 Visitante están viendo este tema.

Diabliyo

Que tal..

Realize un pequeno sistema para:

- guardar correos por grupos
- guardar correos en lugares independientes (grupos distintos)
- enviar correos a grupos
- enviar correos a direcciones independientes

Actualmente uno de los grupos donde contengo correos a crecido demasiado :S, y cuando le doy Enviar Correos a dicho grupo (contiene todos los destinatarios) la pagina se queda enviando correos y de repente como que el script se frena o simplemente ya no responde, vaya, ya no pone nada en la pantalla, ya sea "Correos enviados" o  bien "Problemas para enviar correos".

Cuando realize el proceso de codificacion de mi sistema me asegure de implementar la funcion set_time_limit(segundos), para aumentar el tiempo de ejecucion del script, estableciendolo a 5 minutos (set_time_limit(300);), pero aun asi el codigo es frenado :(...

Mi sistema esta funcionando en un hosting en internet (el cual estoy rentando).

Por otro lado, en mi servicio de hosting siempre me posicionan en mi directorio de raiz el archivo php.ini el cual posee ya variables configuradas y pues me imagino que lo posicionan hay para que yo pueda variar dicha informacion, de modo que segun la modificacion solo agrege esto: max_execution_time 300, pero aun asi el script no puede terminar de enviar correos :(.

Aqui dejo el php.ini que tengo en el directorio de raiz del servidor:

register_globals = off
allow_url_fopen = off

expose_php = Off
max_input_time = 300
max_execution_time = 300
variables_order = "EGPCS"
extension_dir = ./
upload_tmp_dir = /tmp
precision = 12
SMTP = relay-hosting.secureserver.net
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=,fieldset="

[Zend]
zend_extension=/usr/local/zo/ZendExtensionManager.so
zend_extension=/usr/local/zo/4_3/ZendOptimizer.so

[browscap]
browscap = php_browscap.ini


Aqui un pedazo del codigo de mi sistema para envio de mails"

Código (php) [Seleccionar]

//verifica que los correos y grupos sean validos, a su vez les realiza el proceso de verificacion de dominio, quita
//los espacios, asegura que el texto este en minusculas (lo convierte),etc...
//Si todo tuvo exito, retorna todos los correos delimitados por una coma
if( ($mail_dest=verificar_correos_grupos( proteger_cadena($_POST["publicidad_redactar_emaildestino"]) )) )
{
set_time_limit(600); //10 minutos

if( strchr($mail_dest, ",") ) //si contiene coma, existen mas mails
{
$x_mails= explode( ",", $mail_dest ); //dividimos

for( $i=0; $i<sizeof($x_mails); $i++ ) //ciclo para recorrer toda la lista
{
if( strchr($x_mails[$i], "@") ) //si existe un arroba es mail directo
enviar_correo( $x_mails[$i], proteger_cadena($_POST["publicidad_redactar_titulo"]), 6, proteger_cadena($_POST["publicidad_redactar_codigo"]) );
else //es un grupo
{
$grupo_id= consultar_datos_general( "PRIVILEGIOS", "NOMBRE='". $x_mails[$i]. "'", "ID"); //obtenemso ID apartir del nombre de grupo
$cons_lista= consultar_con( "LISTA_CORREOS", "GRUPO='". $grupo_id. "'" ); //obtenemos todos los correos del grupo
while( $buf_lista=mysql_fetch_array($cons_lista) ) //recorriendo el buffer
enviar_correo( $buf_lista["EMAIL"], proteger_cadena($_POST["publicidad_redactar_titulo"]), 6, proteger_cadena($_POST["publicidad_redactar_codigo"]) );

unset($cons_lista);
unset($buf_lista);
unset($grupo_id);
}
}
unset($x_mails);
}
else //solo es un destinatario o grupo
{
if( strchr($mail_dest, "@") ) //si existe un arroba es mail directo
enviar_correo( $mail_dest, proteger_cadena($_POST["publicidad_redactar_titulo"]), 6, proteger_cadena($_POST["publicidad_redactar_codigo"]) );
else //es un grupo
{
$grupo_id= consultar_datos_general( "PRIVILEGIOS", "NOMBRE='". $mail_dest. "'", "ID"); //obtenemso ID apartir del nombre de grupo
$cons_lista= consultar_con( "LISTA_CORREOS", "GRUPO='". $grupo_id. "'" ); //obtenemos todos los correos del grupo
while( $buf_lista=mysql_fetch_array($cons_lista) ) //recorremos el buffer
enviar_correo( $buf_lista["EMAIL"], proteger_cadena($_POST["publicidad_redactar_titulo"]), 6, proteger_cadena($_POST["publicidad_redactar_codigo"]) );

unset($cons_lista);
unset($buf_lista);
unset($grupo_id);
}
}

//esto es solo como metodo estadistico, se agrega un incremente a diho grupo que se
//le ha enviado un correo
$trama= array(
"id"=>"'". $_GET["id_send"]. "'",
"hit"=>"'". (consultar_datos_general("PUBLICIDAD", "ID='". $_GET["id_send"]. "'", "hit")+1). "'"
);
actualizar_bdd( "PUBLICIDAD", $trama );
unset($trama);

set_time_limit(30); //30 segundos
echo "Publicidad enviada con exito...";
}
else
echo "Error: verifique los destinatarios.";

echo "<p><input type=\"submit\" value=\"Continuar\" class=\"boton_01\" onclick=\"cargar_datos( 'id=". $_GET["id"]. "&mov=ver', 'tabla_publicidad_lista', 'GET', '0' );\"> ";


Que podria hacer para poder completar el envio de mails a todos los contenedores ???

bye bye

el-brujo

La gente suele usar:

set_time_limit(20);

o

sleep(100);

para pausar envíos en los e-mails, pero creo que debes poner ese código dentro del bucle while en tu caso.

Diabliyo

#2
Cita de: el-brujo en 14 Noviembre 2008, 19:55 PM
La gente suele usar:

set_time_limit(20);

o

sleep(100);

para pausar envíos en los e-mails, pero creo que debes poner ese código dentro del bucle while en tu caso.

Bueno, entonces lo que debo hacer es modificar mi codigo actual y cambiar de posicion los set_time_limit(), cierto ??... moviemdolos hacia la parte antes que se invoque la funcion mail(), cierto ??..

Por otr lado, yo tengo entendido que apartir de que un archivo PHP esta ciento leido e interpretado por el compiler de PHP y mostrado su resultado en tags HTML hacia el cliente, este proceso de duracion se le llama tiempo de ejecucion, asi que independientemente de que se aplique: sleep(), fopen, fread, mail(), o cualquier otra funcion, si el tiempo que tarde dicho archivo PHP en interpretarse o hacer su tarea, estara limitado por el tiempo de ejecucion establecido en la configuracion del php.ini... o no ???, asi lo entiendo yo !!

Por lo tanto si fuese correcto mi conocimiento de arriba, la implementacion de sleep() no serviria de mucho :s, ya que el script al momento de estare jecutando realizaria un retardo (sleep()) y esto se uniria al tiempo de ejecucion limite :S !!...

Posiblemente tambien no me has entendido en mi post principal, nose :S !!...

bye bye

Diabliyo

Hola

Listo, solamente quite el set_time_limit(600) hacia dentro del while() donde invoco la funcion enviar_correo(). Con esto logre enviar todo lo deseado xD...

bye bye

Diabliyo

Cita de: Diabliyo en 14 Noviembre 2008, 21:37 PM
Hola

Listo, solamente quite el set_time_limit(600) hacia dentro del while() donde invoco la funcion enviar_correo(). Con esto logre enviar todo lo deseado xD...

bye bye

Retomo el tema, debido a que sigo experimentando problemas al momento de estar enviando correo...

En mi base de datos poseo muchos correos asi que al momento de estar enviando llega un momento en el que el AJAX se queda Cargando.. (por que oviamente esta enviando correos a todos los destinatarios), y finalmente solo se queda la pagina sin ningun letrero, vaya, pareciera como si se frenara todo :(...

deduzco que el script es frenado por exceder el limite de ejecucion... pero como puedo resolver este problema, debido a que no se alcanza a enviar los correos a todos los destinatarios...

Por otro lado, estuve contando aproximadamente CUANTOS correos si se pudieron enviar, y solo acanze a contar: 420 envios...

Utilizo el siguiente codigo:

Funcion que lee contactos e invoca funcion de envio de correos[/b
Código (php) [Seleccionar]
while( ($buf_lista=mysql_fetch_array($cons_lista)) && $smtp_error==1 )
{
set_time_limit(600); //10 minutos
$smtp_error= enviar_correo( $buf_lista["EMAIL"], proteger_cadena($_POST["publicidad_redactar_titulo"]), 6, proteger_cadena($_POST["publicidad_redactar_codigo"]), $_POST["file_adjunto"] );
set_time_limit(30); //3 minutos
}


Funcion que envia correos
Código (php) [Seleccionar]
function enviar_correo( $to, $asunto, $modo, $enlace, $adjunto )
{
$boundary= md5(time()); //valor boundary
$htmlalt_boundary= $boundary. "_htmlalt"; //boundary suplementario
$subject=$asunto; //titulo del correo

//cabeceras para enviar correo en formato HTML
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"". $boundary. "\"\r\n"; //datos mixteados
$headers .= "From: ". TITULO_WEB. "<robot@sie-group.net>\r\n"; //correo del que lo envia

//incia cuerpo del mensaje que se visualiza
$cuerpo="--". $boundary. "\r\n";
$cuerpo .= "Content-Type: multipart/alternative; boundary=\"". $htmlalt_boundary. "\"\r\n\r\n"; //contenido alternativo: texto o html
$cuerpo .= "--". $htmlalt_boundary. "\r\n";
$cuerpo .= "Content-Type: text/html; charset=iso-8859-1\r\n";
$cuerpo .= "Content-Transfer-Encoding: 8bits\r\n\r\n";

if( $modo==0 ) //enviar correo para comentarios
{
//Cuerpo o contexto del mensaje, la esencia del correo, el todo ;)
$cuerpo .= "Han publicado un nuevo comentario en <b>". $_SERVER['HTTP_HOST']. "</b>.<br>Enlace al tema: ";
$cuerpo .= "<b></b><a href=\"". $enlace. "\" target=\"_blank\">". $enlace. "</a></b>";
}
else if( $modo==1 ) //error en correo para comentarios
{
$trama_deficiente= $_POST;
//Cuerpo o contexto del mensaje, la esencia del correo, el todo ;)
$cuerpo .= "Se produjo un error en el servidor <b>". $_SERVER['HTTP_HOST']. "</b> al interntar enviar aviso de notificacion a las bandejas, ";
$cuerpo .= "la notificacion se intento enviar en blanco o sin u enlace hacia la noticia donde se publico el comentario.";
$cuerpo .= "<p>A continuacion de muestra la trama deficiente obtenida: <br>". $trama_deficiente;
unset($trama_deficiente);
}
//mas modos....
//....

$cuerpo .= "\r\n\r\n";
$cuerpo .= "--". $htmlalt_boundary. "--\r\n\r\n"; //fin cuerpo mensaje a mostrar

//archivos adjuntos
if( strcmp($adjunto, "0") && strcmp($adjunto, "vacio")  )
{
set_time_limit(600); //limite maximo 10 minutos
$archivo= $adjunto;
$buf_type= obtener_extencion_stream_archivo($adjunto); //obtenemos tipo archivo

$fp= fopen( "uploads/".$archivo, "r" ); //abrimos archivo
$buf= fread( $fp, filesize("uploads/".$archivo) ); //leemos archivo completamente
fclose($fp); //cerramos apuntador;

$cuerpo .= "--". $boundary. "\r\n";
$cuerpo .= "Content-Type: ". $buf_type. "; name=\"". $archivo. "\"\r\n"; //envio directo de datos
$cuerpo .= "Content-Transfer-Encoding: base64\r\n";
$cuerpo .= "Content-Disposition: attachment; filename=\"". $archivo. "\"\r\n\r\n";
$cuerpo .= base64_encode($buf). "\r\n\r\n";
}
$cuerpo .= "--". $boundary. "--\r\n\r\n";

//funcion para enviar correo
set_time_limit(600); //limite maximo 10 minutos
if( mail($to, $subject, $cuerpo, $headers) == FALSE )
return 0;
return 1;
}