phpMailer:将多个变量传递给电子邮件模板

时间:2015-12-14 12:04:13

标签: php phpmailer

我正在尝试使用以下脚本将多个变量传递到电子邮件模板:

$mail = new PHPMailer;

$email = 'versace@versace.it';

$data['fname'] = $_POST['c_fname'];
$data['lname'] = $_POST['c_lname'];

$mail->setFrom('armani@armani.com', 'First Last');
$mail->addReplyTo('armani@armani.com', 'First Last');
$mail->addAddress($email, 'John Doe');

$mail->Subject = 'Your confirmation';
$mail -> msgHTML(file_get_contents('temp.php',$data), dirname(__FILE__));
$mail->AltBody = 'Thank you for contacting us';

if (!$mail->send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
} else {
redirect('index.php');
}

这是错误消息: 邮件程序错误:邮件正文空白

我做错了吗?

2 个答案:

答案 0 :(得分:1)

邮件正文为空,因为file_get_contents返回null。当需要布尔值时,您将数组作为第二个参数($use_include_path)传递给它,因此它会抛出警告并返回null。

您尝试做的就是将问题中的$data数组提取到变量中,然后通过PHP解析temp.php这些变量。您不能使用file_get_contents执行此操作,因为它只返回文件的内容,并且不解析文件中的任何PHP代码。您需要使用输出缓冲,包含文件,然后将输出分配给变量:

$mail = new PHPMailer;

$email = 'versace@versace.it';

$data[ 'fname' ] = $_POST[ 'c_fname' ];
$data[ 'lname' ] = $_POST[ 'c_lname' ];

$mail->setFrom( 'armani@armani.com', 'First Last' );
$mail->addReplyTo( 'armani@armani.com', 'First Last' );
$mail->addAddress( $email, 'John Doe' );

$mail->Subject = 'Your confirmation';
$mail->msgHTML( renderTemplate( 'temp.php', $data ), dirname( __FILE__ ) );
$mail->AltBody = 'Thank you for contacting us';

if ( ! $mail->send() ) {
    echo "Mailer Error: " . $mail->ErrorInfo;
} else {
    redirect( 'index.php' );
}

function renderTemplate( $file, $data ) {
    if ( ! file_exists( $file ) ) {
        trigger_error( 'renderTemplate: file does not exist' );
        exit;
    }

    extract( $data );

    ob_start();

    include($file);

    $content = ob_get_clean();

    return $content;
}

答案 1 :(得分:0)

您收到错误的原因是您没有设置正文:

这可能是因为文件没有返回数据。

执行相同操作的替代方法是使用以下内容:

$mail->Body

Source

修改:也可以使用

  

$ MAIL-> isHTML(真); //将电子邮件格式设置为HTML

Source