2011-07-14 14 views
12

Hola, estoy tratando de enviar correos electrónicos html utilizando la clase php mailer. El problema es que me gustaría incluir variables php en mi correo electrónico mientras uso includes para mantener las cosas organizadas. Aquí está mi php mailer ....php mailer y html se incluye con las variables php

$place = $data['place']; 
$start_time = $data['start_time']; 

$mail->IsHTML(true); // set email format to HTML 
$mail->Subject = "You have an event today"; 
$mail->Body = file_get_contents('../emails/event.html'); 
$mail->Send(); // send message 

mi pregunta es, ¿es posible tener variables PHP en event.html? He intentado esto sin suerte (a continuación es event.html) ..

<table width='600px' cellpadding='0' cellspacing='0'> 
<tr><td bgcolor='#eeeeee'><img src='logo.png' /></td></tr> 
<tr><td bgcolor='#ffffff' bordercolor='#eeeeee'> 
<div style='border:1px solid #eeeeee;font-family:Segoe UI,Tahoma,Verdana,Arial,sans-serif;padding:20px 10px;'> 
<p style=''>This email is to remind you that you have an upcoming meeting at $place on $start_time.</p> 
<p>Thanks</p> 
</div> 
</td></tr> 
</table> 
+0

¿Funciona si lo convierte en "event.php" y luego delimita correctamente los ecos para las variables? –

+1

@Aaron Eso simplemente obtendría el contenido del archivo. 'include' /' require' es la única forma de ejecutar un archivo PHP. – Nicole

+0

Sí, supongo que estoy pensando en agarrar la página con cURL, que debería ejecutar el php dentro del objetivo. –

Respuesta

21

Sí, muy fácilmente con include y una breve función auxiliar:

function get_include_contents($filename, $variablesToMakeLocal) { 
    extract($variablesToMakeLocal); 
    if (is_file($filename)) { 
     ob_start(); 
     include $filename; 
     return ob_get_clean(); 
    } 
    return false; 
} 

$mail->IsHTML(true); // set email format to HTML 
$mail->Subject = "You have an event today"; 
$mail->Body = get_include_contents('../emails/event.php', $data); // HTML -> PHP! 
$mail->Send(); // send message 
  • La función get_include_contents es cortesía de el PHP include documentation, modificado ligeramente para incluir una matriz de variables.

  • Importante: Dado que las necesidades de inclusión es procesado dentro de una función, el alcance de la ejecución del archivo de plantilla PHP (/emails/event.php) está en el ámbito de esa función (sin variables disponibles de inmediato, además de super globals

  • Esa es la razón he añadido extract($variablesToMakeLocal) — extrae todas las claves de la matriz de $variablesToMakeLocal como variables en el alcance de la función, que a su vez significa que están dentro del ámbito del archivo que se incluye.

    Puesto que ya tenía place y start_time en la matriz $data, simplemente pasé eso directamente a la función. Es posible que desee saber que esto extraerá todas las claves dentro de $data — puede o no puede querer eso.

  • Tenga en cuenta que ahora su archivo de plantilla se procesa como un archivo PHP, por lo que se aplican las mismas advertencias y reglas de sintaxis. Debe no exponerlo para ser editado por el mundo exterior, y debe usar <?php echo $place ?> para generar variables, como en cualquier archivo PHP.

+0

entro en esto sabiendo que esta podría ser una pregunta estúpida, pero voy a preguntar de todos modos: ¿es correcto suponer que la matriz '$ _SESSION' (o' $ _POST') NO necesita ser pasada a '$ variablesToMakeLocal'? – WhiteRau

+0

@WhiteRau - Correcto, se puede acceder de todos modos (son [superglobales] (http://php.net/manual/en/language.variables.superglobals.php)), aunque probablemente preferiría pasarlo así que que podría desinfectar los datos de antemano y así la función podría ser más portátil (es decir, usar con datos de otras fuentes en lugar de la plantilla o función siempre usando '$ _SESSION '. – Nicole

+0

Gracias, funciona perfectamente para mí. – Mardzis

9

maneras Pareja de hacerlo:

plantilla de emergencia

<p> Some cool text %var1%,, %var2%,etc...</p> 

simbólico Mailer

$mail->Body = strtr(file_get_contents('path/to/template.html'), array('%var1%' => 'Value 1', '%var2%' => 'Value 2')); 

Plantilla Buffer

<p> Some cool text $var1,, $var2,etc...</p> 

Buffer Mailer

$var1 = 'Value 1'; 
$var2 = 'Value 2'; 
ob_start(); 
include('path/to/template.php'); 
$content = ob_get_clean(); 
$mail->Body = $content; 
1

Utilizando el método de contadores a prodigitalson, los siguientes trabajó para mí.código PHP fue:

$e = "[email protected]"; 
$sc = "2sbd2152g#!fsf"; 
$body = file_get_contents("../email/recovery_email.html"); 
$body = eregi_replace("%e%" ,$sc, $body); 
$body = eregi_replace("%sc%" ,$sc, $body); 
$mail->MsgHTML($body); 

El HTML fue simplemente:

<p>Click this link: www.mysite.com/recover.php?e=%e%&sc=%sc%<p> 

El eregi_replace funcionó mejor que en mi caso strtr - (este último no funcionó en absoluto).

2

Usted puede poner las variables en el correo electrónico HTML y luego hacer un string_replace por lo que los contenidos aparecen en el correo electrónico en lugar de las variables:

try { 
    $mail = new PHPMailer(true); 
    $body = file_get_contents('phpmailer/subdir/contents.html'); 
    $body = str_replace('$fullname', $fullname, $body); 
    $body = str_replace('$title', $title, $body); 
    $body = str_replace('$email', $email, $body); 
    $body = str_replace('$company', $company, $body); 
    $body = str_replace('$address', $address, $body); 
    // strip backslashes 
    $body = preg_replace('/\\\\/','', $body); 
    // mail settings below including these: 
    $mail->MsgHTML($body); 
    $mail->IsHTML(true); // send as HTML 
    $mail->CharSet="utf-8"; // use utf-8 character encoding 
} 

Esta es la configuración que trabajó para mí. No DRY tal vez, pero funciona.

+1

Esta resultó ser la única solución que funcionó para mí. Gracias. – awl19

Cuestiones relacionadas