Foros del Web » Programando para Internet » PHP »

problemas para controlar envío de email

Estas en el tema de problemas para controlar envío de email en el foro de PHP en Foros del Web. Hola, necesito enviar un mail a varias direcciones. Utilizo el vector "direcciones_ok" para ir guardando las direcciones a donde se envía el mail y "direcciones_ko" ...
  #1 (permalink)  
Antiguo 02/05/2004, 11:31
 
Fecha de Ingreso: marzo-2002
Mensajes: 188
Antigüedad: 22 años, 1 mes
Puntos: 0
problemas para controlar envío de email

Hola, necesito enviar un mail a varias direcciones.
Utilizo el vector "direcciones_ok" para ir guardando las direcciones a donde se envía el mail y "direcciones_ko" para guardar las direcciones donde no llega el mail.

El problema que tengo es que si pongo una dirección que se que no existe, como por ejemplo, "hgdshdgj@chsjc", la dirección se me guarda en el vector "direcciones_ok", cuando lo que quiero es que me lo guarde en el otro vector para luego poder tratarlo por pantalla a modo de resumen informativo de a donde ha llegado el mail y a donde no ha llegado.

Que hago mal?

Gracias y saludos



// Código que envía el mail

if (mail($campo_para[$cont],$asunto,$texto,$cabecera)){
$direcciones_ok[$cont_ok]=$campo_para[$cont];
$cont_ok++;
}else{
$direcciones_ko[$cont_ko]=$campo_para[$cont];
$cont_ko++;
}
  #2 (permalink)  
Antiguo 02/05/2004, 13:53
 
Fecha de Ingreso: abril-2004
Mensajes: 13
Antigüedad: 20 años
Puntos: 0
Hola, nosotros desarrollamos algo exactamente identico para una universidad.

Ellos tienen sus casi 10 mil mailes.

Se utilizo SQl y se envia el mail asi:

select * from 'mail' where 'mail' = $condicional;

Luego viene el envio del mail con un for.

Y cada mail queda checado (igual que en tu caso), y asi nunca recivira 2 veces la misma info.

El condicional comprenderas que es un campo de un form donde colocas algo como:

Enviar a todos los correos terminados en: [hotmail.com]

Ya con esto te liberas de unos.... 1000 Correos, etc...

Actualmente en menos de 30 minutos se envia la info, que ademas permite otra gran cantidad de parametros como borrar tu mail de la lista, (No se trata de enviar Spam).

Espero la idea pueda serte util.

Salu2!.

__________
Visitanos en:
www.internetprofesional.com
  #3 (permalink)  
Antiguo 04/05/2004, 06:42
 
Fecha de Ingreso: marzo-2002
Mensajes: 188
Antigüedad: 22 años, 1 mes
Puntos: 0
Hola,
Gracias por la respuesta. Pero sigo teniendo una duda que no se si se puede resolver con la función mail().
Imaginemos que quiero enviar un mail a una direccion que existe, por ejemplo, [email protected] y a una dirección que no existe, [email protected].

Yo utilizo el siguiente código para enviar el mail:

if (mail($para,$asunto,$texto,$cabecera){
// mensaje de que se ha enviado
}else{
// mensaje de que no se ha enviado
}

Al parecer, tanto si la dirección existe como si no existe, el mail se envía e, imagino yo, que si la dirección existe acaba llegando a su destinatario y si no existe el mail se pierde. Digo esto porque en los 2 casos sale un mensaje por pantalla diciendo que el mail se ha enviado correctamente.

Lo que a mi me gustaría saber es si se puede hacer una comprobación previa que, en caso de detectar que la dirección a la que se quiere enviar el mail no existe, se me vaya por el "else" de la función y me saque el mensaje de que no se ha enviado el mail porque la dirección es incorrecta.

Gracias de antemano y saludos.
  #4 (permalink)  
Antiguo 04/05/2004, 06:57
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
La función mail() de PHP sólo te indica con un "true/false" (booleano) que PHP "pudo" concectar con el MTA (transportador) que use PHP (php.ini: SMTP = .. o sendmail= ....) para enviar el e-mail .. mejor dicho "para entregarselo", pero no de que si este (el MTA) pudo o no realizar el envio en sí (por qué falló .. no existe el domino o el usuario en ese servidor .. etc ...)

Así que lo más probable es que siempre te diga que el e-mail se "envió" por qué tu MTA siempre funcionó y tomó esos e-mails para enviarlos .. Ahora .. de que falle o no eso de momento sólo lo verías en los log de ese servidor SMTP o sendmail usado.

Para solventar el problema .. deberías enviar los e-mails directamente al SMTP y así controlar un poco mejor los mensajes de error que pueda dar y en consecuencia dedicir si el e-mail existe .. o simplemente fué un error de conexión temporal .. etc.

Para eso .. puedes usar classes como:

PHP Mailer
http://phpmailer.sourceforge.net

Pero .. en mis pruebas al menos (pese que dice que entrega dichos mensajes de error) no me los entrega :((((((((((( (algo no habré configurado bien o estaré usando lo mal o mi servidor SMTP no me devuelve esos errores? ..)

El caso es que "por ahí" va el tema para poder obtener dicha respuesta más exacta sobre el envio del e-mail.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 04/05/2004, 07:51
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Hola,

Lo de los mensajes de error depende de la configuracion del SMTP. El RFC de SMTP comenta que un servidor no tiene por que dar error en caso de no tener la cuenta configurada. Y eso conectandote directamente con el servidor SMTP destino. Si te conectas a un servidor SMTP local o remoto, pero tuyo de salida, ese servidor puede estar configurado para intentar mas tarde todos los emails que no son para su dominio (emails salientes). No estoy seguro, pero creo que tendria que devolver un estado de "OK relayong email" o algo asi, indicando que lo que va a hacer es "pasarle" el email a otro servidor SMTP.

Como comprobacion previa podrias mirar si existe un registro MX para el dominio destino (ademas de comprobar la sintaxis de la direccion). En www.php.net/getmxrr y funciones "hermanas" tienes ejemplos de como comprobarlo.

De todas formas, nunca sera 100% seguro, ya que el servidor destino no tiene obligacion de decir si una cuenta existe o no.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #6 (permalink)  
Antiguo 04/05/2004, 08:12
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Si, josemi ..lo que comentas es cierto . .de hecho el servidor de correo que uso SMTP (QK SMTP Server para Win) lo tengo configurado con la opción "devolver mensajes al cliente" (o algo así dice). En los log's que hace dicho servidor SMTP veo todos los mensajes explicativos sobre el problema en el envio .. pero por mi parte (con PHP Mailer y sus métodos para obtener los mensajes de error en modo SMTP) no los veo :((((((

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #7 (permalink)  
Antiguo 04/05/2004, 08:19
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
¿Y como se comporta desde el outlook? Porque si desde el outlook te permite el envio (aunque luego devuelva un email al origen), con el mailer hara lo mismo. Supongo (no uso phpmailer) que devolvera el mismo error que obtendrias si realizases la sesion SMTP "a mano". Y si el SMTP no devuelve un error a la hora de especificar el destinatario, pues para phpmailer no habra error.

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #8 (permalink)  
Antiguo 04/05/2004, 08:44
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
ammm Ok, josemi .. esa prueba no la he realizado .. tendré que mirar ese tema.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:53.