Foros del Web » Programando para Internet » PHP »

Envio de mail + interacción MySQL con PHP

Estas en el tema de Envio de mail + interacción MySQL con PHP en el foro de PHP en Foros del Web. Hola tengo un sistema de noticias, y quiero enviar un resúmen diario a mis destinatarios. Para ello he hecho el siguiente código: Código PHP: //Sentencia sql que me consulta todos los articulos del dia 2004-12-03 ...
  #1 (permalink)  
Antiguo 03/12/2004, 13:57
Avatar de andinistas  
Fecha de Ingreso: julio-2003
Ubicación: Bogotá COL
Mensajes: 1.000
Antigüedad: 20 años, 9 meses
Puntos: 0
Exclamación Envio de mail + interacción MySQL con PHP

Hola tengo un sistema de noticias, y quiero enviar un resúmen diario a mis destinatarios.

Para ello he hecho el siguiente código:

Código PHP:
//Sentencia sql que me consulta todos los articulos del dia 2004-12-03
//y consulta la tabla donde estan los mails a enviarles el reporte
$_pagi_sql "SELECT  * 
FROM sistema_noticias, newsletter
WHERE fecha_publicacion = '2004-12-03' "
;

//muestro result
while($row mysql_fetch_array($_pagi_result)){

$titulo_articulo $row[titulo_articulo];
$fuente_articulo $row[fuente_documento];
$fecha_articulo $row[fecha_publicacion];
$contenido_articulo $row[contenido];

//preparo el mail
$deemail "[email protected]";
$sfrom "[email protected]";
$sdestinatario $row[email]; //todos los email de mi lista aprox 40 personas
$ssubject "Informe de Prensa".mostrarfecha($hoy);
$shtml "
<strong>Informe de Prensa</strong>
<br>
<strong>Fecha: "
.mostrarfecha($hoy)." Hora: ".$hora."</strong>
<br>
<strong>Información.</strong>
<br>-.-
<p>
"
.$titulo_articulo."
<br>
"
.$fuente_articulo."
<br>
"
.$fecha_articulo."
<br>
"
.$contenido_articulo."
<p>

<strong>Un Saludo</strong>
<br>
<strong>Sala de redacción</strong>
<br>
<strong>-.-.-.-.-.-.-.-.-.-.-.-.-.-.-</strong>"
;

$nombre"Sistema de Noticias";
$encabezados  "MIME-Version: 1.0\n";
$encabezados .= "Content-type: text/html; charset=iso-8859-1\n";
$encabezados .= "From: \"$nombre\" $deemail <$sfrom>\n";
$encabezados .= "Reply-To: \"$nombre\" <$deemail>\r \n" ;
$encabezados .= "X-Sender: <$sfrom>\n";
$encabezados .= "X-Mailer: PHP\n";
$encabezados .= "X-Priority: 3\n"
$encabezados .= "Return-Path: <$sfrom>\n";

//end while
}


//enviar mail
mail($sdestinatario,$ssubject,$shtml,$encabezados); 
el problema es que si se han insertado 10 noticias hoy 2004-12-03, nada mas me envia la primera de las diez, seria bueno que me hiciera el bucle e insertara las 10 noticias en el mensaje del correo electrónico.

alguien puede ayudarme?
__________________
Un Saludo, Andinistas.
"Llegaron... Ellos tenían la biblia y nosotros la tierra... y nos dijieron: 'Cierren los ojos y recen.' Cerramos los ojos y cuando los abrimos,
ellos tenían la tierra y nosotros la biblia." Abadío Green.

Última edición por andinistas; 03/12/2004 a las 14:22
  #2 (permalink)  
Antiguo 03/12/2004, 14:29
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Ya que las N noticias a enviar van a formar el mismo cuerpo de mensaje para tu e-mail .. haz tu consulta SQL a tu BD para obtener las noticas de ese día.

Código PHP:
$_pagi_sql "SELECT  * 
FROM sistema_noticias, newsletter 
WHERE f_fecha_barrido = '2004-12-03' "


//muestro result

$shtml ="<strong>Informe de Prensa</strong> 
<br> 
<strong>Fecha: "
.mostrarfecha($hoy)." Hora: ".$hora."</strong> 
<br> 
<strong>Información.</strong>"
;
 
while(
$row mysql_fetch_array($_pagi_result)){ 
$titulo_articulo $row[titulo_articulo]; 
$fuente_articulo $row[fuente_documento]; 
$fecha_articulo $row[fecha_publicacion]; 
$contenido_articulo $row[contenido]; 
$shtml .= "<br>-.- 
<p> 
"
.$titulo_articulo.
<br> 
"
.$fuente_articulo.
<br> 
"
.$fecha_articulo.
<br> 
"
.$contenido_articulo.
<p> 

} // cierre bucle que lee tus noticias 

$shtml .="
<strong>Un Saludo</strong
<
br
<
strong>Sala de redacción</strong
<
br
<
strong>-.-.-.-.-.-.-.-.-.-.-.-.-.-.-</strong>"; 
Ahí tendras en $shtml concatenado tu "cabecera" del e-mail .. las N noticias que lees de tu BD . .y el "pié" de mail .. Observa donde empieza y donde acaba el bucle y que se usa un .= para concatenar la variable con sus resultados ...

Luego, haz tu consulta a tu BD de usuarios como ya lo sabras hacer y usa $shtml como "cuerpo" (body) para tu mensaje .. Recuerda que la función mail() ha de estar en el bucle que hagas pues vas a enviar uno por uno e-mails a tus usuarios "personalizados". Los $encabecedos para mail() no deben estar en el bucle, por lo menos los que son fijos (hay unos cuantos que lo son . .fijate).

Un saludo,
  #3 (permalink)  
Antiguo 03/12/2004, 15:14
Avatar de andinistas  
Fecha de Ingreso: julio-2003
Ubicación: Bogotá COL
Mensajes: 1.000
Antigüedad: 20 años, 9 meses
Puntos: 0
Ok

Cluster, lo he hecho de esta forma pero ahora no me envia resultados al mail a pesar de que la consulta está bien

Código PHP:
//preparo el mail
$deemail "[email protected]";
$sfrom "[email protected]";
$sdestinatario $row[email];
$ssubject "Informe de Prensa ".mostrarfecha($hoy);
$shtml "
<strong>Informe de Prensa</strong>
<br>
<strong>Fecha: "
.mostrarfecha($hoy)." Hora: ".$hora."</strong>
<br>
<strong>Información Pública.</strong>"
;

while(
$row mysql_fetch_array($_pagi_result)){
$titulo_articulo $row[titulo_articulo];
$fuente_articulo $row[fuente_documento];
$fecha_articulo $row[fecha_publicacion];
$contenido_articulo $row[contenido];

$shtml .= "
"
.$titulo_articulo."
<br>
"
.$fuente_articulo."
<br>
"
.$fecha_articulo."
<br>
"
.$contenido_articulo."
<p>"
;

// cierre bucle


$shtml .="<strong>Un Saludo</strong>
<br>
<strong>Sala de redacción</strong>
<br>
<strong>-.-.-.-.-.-.-.-.-.-.-.-.-.-.-</strong>"
;

$nombre"Lista de Noticias";
$encabezados  "MIME-Version: 1.0\n";
$encabezados .= "Content-type: text/html; charset=iso-8859-1\n";
$encabezados .= "From: \"$nombre\" $deemail <$sfrom>\n";
$encabezados .= "Reply-To: \"$nombre\" <$deemail>\r \n" ;
$encabezados .= "X-Sender: <$sfrom>\n";
$encabezados .= "X-Mailer: PHP\n";
$encabezados .= "X-Priority: 3\n"
$encabezados .= "Return-Path: <$sfrom>\n";

//enviar mail
mail($sdestinatario,$ssubject,$shtml,$encabezados);
?> 
__________________
Un Saludo, Andinistas.
"Llegaron... Ellos tenían la biblia y nosotros la tierra... y nos dijieron: 'Cierren los ojos y recen.' Cerramos los ojos y cuando los abrimos,
ellos tenían la tierra y nosotros la biblia." Abadío Green.
  #4 (permalink)  
Antiguo 03/12/2004, 15:23
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Y .. donde sale tu $sdestinatario ..? .. veo que haces:

$sdestinatario = $row[email];

Pero .. donde está el código donde obtines eso? .. No debería estár ahí sino bajo el código que compone el cuerpo del e-mail.

No sé si alcanzas a ver entender lo que estamos haciendo (o debemos hacer):
1) componer el cuerpo del e-mail . .para eso hay que leer tus noticas de tu BD y componer dicho "cuerpo de mensaje".
2) Obtener tus e-mails a enviar (bajo un bucle while.... que leera tu tabla de usuarios).
2.1) enviar el e-mail a cada $row['email'] (usando mail() dentro de tu bucle que lee/obtiene esos N registros de tu tabla de usuarios/e-mails.

Por lo demás . .verifica haciendo un echo a $shtml si eso que ves ahí es lo esperado que ha de llegar como cuerpo de tu mensaje para tu e-mail.

Un saludo,
  #5 (permalink)  
Antiguo 03/12/2004, 15:29
Avatar de andinistas  
Fecha de Ingreso: julio-2003
Ubicación: Bogotá COL
Mensajes: 1.000
Antigüedad: 20 años, 9 meses
Puntos: 0
Ok cluster te paso todo el script para que comprendas mi codigo

yo hago un select de las noticias que han sido publicadas hoy y a la vez selecciono los usuarios de la tabla newsletter (fila email)

Código PHP:
<?
//head
include("include/head.php");

//Sentencia sql (sin limit)
$_pagi_sql "SELECT  *
FROM sistema_noticias, newsletter
WHERE fecha_publicacion = '2004-12-03'"
;

//cantidad de resultados por página (opcional, por defecto 20)
$_pagi_cuantos 25;

//Incluimos el script de paginación. Éste ya ejecuta la consulta automáticamente
include("../include/paginator.php");

//preparo el mail
$deemail "[email protected]";
$sfrom "[email protected]";
$sdestinatario $row[email];
$ssubject "Informe de Prensa ".mostrarfecha($hoy);
$shtml "
<strong>Informe de Prensa</strong>
<br>
<strong>Fecha: "
.mostrarfecha($hoy)." Hora: ".$hora."</strong>
<br>
<strong>Información Pública.</strong>"
;

while(
$row mysql_fetch_array($_pagi_result)){
$titulo_articulo $row[titulo_articulo];
$fuente_articulo $row[fuente_documento];
$fecha_articulo $row[fecha_publicacion];
$contenido_articulo $row[contenido]; 

$shtml .= "
"
.$titulo_articulo."
<br>
"
.$fuente_articulo."
<br>
"
.$fecha_articulo."
<br>
"
.$contenido_articulo."
<p>"
;

// cierre bucle
}

$shtml .="<strong>Un Saludo</strong>
<br>
<strong>Sala de redacción</strong>
<br>
<strong>-.-.-.-.-.-.-.-.-.-.-.-.-.-.-</strong>"
;

$nombre"Lista de Noticias";
$encabezados  "MIME-Version: 1.0\n";
$encabezados .= "Content-type: text/html; charset=iso-8859-1\n";
$encabezados .= "From: \"$nombre\" $deemail <$sfrom>\n";
$encabezados .= "Reply-To: \"$nombre\" <$deemail>\r \n" ;
$encabezados .= "X-Sender: <$sfrom>\n";
$encabezados .= "X-Mailer: PHP\n";
$encabezados .= "X-Priority: 3\n";
$encabezados .= "Return-Path: <$sfrom>\n";

//enviar mail
mail($sdestinatario,$ssubject,$shtml,$encabezados)  ;

echo 
"Se ha enviado la informaci&oacute;n correctamente a todos los destinatarios de la base de datos! ";
?>

<?
include("include/footer.php");
?>
__________________
Un Saludo, Andinistas.
"Llegaron... Ellos tenían la biblia y nosotros la tierra... y nos dijieron: 'Cierren los ojos y recen.' Cerramos los ojos y cuando los abrimos,
ellos tenían la tierra y nosotros la biblia." Abadío Green.
  #6 (permalink)  
Antiguo 03/12/2004, 15:37
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Pues .. vas a tener que separarlo (es lo ideal en este caso) . .una consulta SQL para tus noticias (para componer ese cuerpo del e-mail) y otra para recorrere tu tabla de "newsletter".

Un saludo,
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 23:10.