Php 将HTML文件读入电子邮件

Php 将HTML文件读入电子邮件,php,html,email,Php,Html,Email,我写了一个脚本来发送html电子邮件,一切都很好。我将电子邮件存储在一个单独的HTML文件中,然后使用while循环和fgets()读取该文件。但是,我希望能够将变量传递到html中。例如,在一个html文件中,我可能会有类似 <body> Dear Name <br/> Thank you for your recent purhcase </body> 我希望能够用一个变量替换html文件中的“Name”,但我不完全确定这样做的最佳方法。

我写了一个脚本来发送html电子邮件,一切都很好。我将电子邮件存储在一个单独的HTML文件中,然后使用while循环和fgets()读取该文件。但是,我希望能够将变量传递到html中。例如,在一个html文件中,我可能会有类似

<body>
    Dear Name <br/>
    Thank you for your recent purhcase
</body>
我希望能够用一个变量替换html文件中的“Name”,但我不完全确定这样做的最佳方法。当我把文件读入字符串时,我总是可以自己做标记,然后用正则表达式替换为名称,但我想知道是否有更好/更简单的方法来实现这一点


(另一方面,如果有人知道使用file_get_contents而不是多次调用fgets是否更好,我很想知道)

如果您有很多变量,您可能希望查看现有的模板引擎,以便为您完成这项工作。或者,PHP的接受数组参数,并且在这方面非常强大——或者如果您需要确保所替换的内容不会被误认为是占位符,提供了该功能(但更乏味)。

您可以使用stru replace()定义占位符,如

Dear %name
Thank you for your recent purchase of %product
然后动态更换:

$html = str_replace("%name", $order_name, $html);
$product = str_replace("%product", $order_product, $html);

使用
file\u get\u contents()
fopen()
都可以。

使用PHP文件,并
包含它。无需通过
fgets
replace
阅读任何内容

ob_start();
include("yourTemplate.html.php");

$html = ob_get_clean();

// $html now has whatever your template output

你可能想考虑使用模板系统,如果你希望将来有更多的特性。 str_replace()还有一个缺点,就是可能会匹配和替换您可能不希望的内容。Smarty在这方面绝对是过火了,我会按照Matt的建议做如下的事情

function getEmailContents(array $vars) {
  extract($vars);

  ob_start();
  include 'email.html.php';
  return ob_get_clean();
}
email.html.php将如下所示

<body>
    Dear <?php echo $name; ?> <br/>
    Thank you for your recent purhcase of <?php echo $product; ?>
</body>
$emailContents = getEmailContents(array('name' => 'El Yobo', 'product' => 'Something'));
这样,您永远不会错误地匹配任何内容,并且可以轻松地使用其他变量等进行扩展,而无需使用加法str_replace()调用


如果您需要更进一步,可能值得一看Smarty。

就是这样!与我之前的想法类似,但是str_replace在这种情况下比regex好得多。实际上,这看起来确实是一种很好的方法。特别是在客户购买许多产品的情况下,因为我可以在html中循环遍历数组,而不是循环遍历数组,创建字符串,然后在html文件中替换它。我不完全理解ob\u start和ob\u end\u clean是做什么的,输出缓冲区对吗?好吧,我已经开始工作了,代码也少了很多!不过,我必须先修改一些内容,“return ob_end_clean”似乎只返回1,所以在include之后,我添加了“$html=ob_get_contents”,然后执行了“ob_end_clean()”,然后返回了“$html”,这听起来合理吗?这样做有什么缺点吗?它安全/高效吗?非常感谢!是的,使用ob_get_content()和ob_end_clean()就可以了。ob_get_clean()的文档表明,这正是它在内部执行的操作()。ob_end_clean返回true/false,而不是缓冲区本身。我猜你的意思是让你得到一份款待!我接受了El Yobo的版本,因为它有一个更详细的示例,但是谢谢!
$emailContents = getEmailContents(array('name' => 'El Yobo', 'product' => 'Something'));