【问题标题】:How do I input php variables in html mail如何在 html 邮件中输入 php 变量
【发布时间】:2011-07-05 15:02:35
【问题描述】:

您好,我正在尝试通过 PHP 网络表单发送 HTML 电子邮件。表单工作正常,如果我将 $name、$address 等变量传递到消息中,它就可以通过,但是当我尝试使用 HTML 对其进行格式化时,我似乎无法将这些变量传递到消息中。这是我在 w3schools 上找到的示例代码,但我似乎无法调整它来做我想做的事:

<?php
....
$to = "somebody@example.com, somebodyelse@example.com";
$subject = "HTML email";

$message = "
<html>
<head>
<title>HTML email</title>
</head>
<body>
<p>This email contains HTML Tags!</p>
<table>
<tr>
<th>Firstname</th>
<th>Lastname</th>
</tr>
<tr>
<td>John</td>
<td>Doe</td>
</tr>
</table>
</body>
</html>
";
 ....
?>

我想要做的是传递变量 $name ,它显示“john doe”,我想一旦我弄清楚我应该能够传递所有其他变量。

提前感谢您的帮助。

【问题讨论】:

  • 您能解释一下无法传递变量是什么意思吗?如果你把 $name 放在 &lt;td&gt; 标签之间,会发送什么?
  • 请确保您正在清理从表单中收集的数据。如果您不这样做,您将面临可能的代码注入攻击。
  • 您的电子邮件格式非常糟糕 - HTML 部分必须具有 mime 类型、配置和编码以及分隔符。虽然某些 MUA 仍会呈现它,但您可能希望获得类似 phpmailer 之类的东西,它可以正确完成它。
  • @symcbean: 或者只使用 PHPMailer/Swiftmailer 为您完成所有这些工作,而不是尝试手动构建 mime 信封。

标签: php html webforms


【解决方案1】:

为了让你的变量进入消息,如果你使用双引号,你应该能够在字符串中包含变量:

例如

$message = "
<html>
...
<tr>
<td>$name</td>
</tr>
...
</html>
";

你也可以跳出字符串

$message = "
<html>
...
<tr>
<td>".$name."</td>
</tr>
...
</html>
";

这将适用于单引号或双引号(我个人更喜欢这种带有单引号的方法)。

但是,当您收到这封电子邮件时,您会看到原始 html。为了正确显示 html,您需要设置适当的邮件标头。有如何做到这一点的例子herehere

【讨论】:

  • 或者只使用一个HEREDOC,它完全解决了转义内部引号的需要。也没有理由关闭字符串并连接。任何带有语法高亮的稍微不错的编辑器都会看到内部变量并高亮它们。
  • heredoc 也可以完成这项工作。我喜欢使用单引号并关闭字符串的原因是因为我不喜欢 PHP 自动为变量等解析双引号字符串的方式,大多数时候是不必要的。我读过的所有最佳实践指南都建议不要在 php 中使用双引号,除非出于性能原因特别需要(并不是我真的认为它有那么大的不同 - 现在我更习惯了!)
  • 如果您不使用变量,则可以使用 NOWDOC (php.net/nowdoc),它相当于 heredoc 的双引号。
  • 我尝试在不关闭和连接的情况下传入 $name,但它没有用。因此,当我使用第二种方法进行操作时,效果很好!感谢大家的帮助!
【解决方案2】:
$message = "
  <html>
<head>
<title>HTML email</title>
</head>
<body>
<p>This email contains HTML Tags!</p>
<table>
<tr>
<th>Firstname</th>
<th>Lastname</th>
</tr>
<tr>
<td>".$firstname."</td>
<td>".$lastname."</td>
</tr>
</table>
</body>
</html>
";

【讨论】:

    【解决方案3】:

    您应该将名称拆分为两个独立变量,例如$first_name$second_name。这样做是可能的:

    <?php
    
    $split_names = explode(' ', $name); // assuming you have a space between both
    
    $first_name = $split_names[0];
    $last_name = $split_names[1];
    
    ?>
    

    那么你可以这样做:

    $message = "
    <html>
    <head>
    <title>HTML email</title>
    </head>
    <body>
    <p>This email contains HTML Tags!</p>
    <table>
    <tr>
    <th>Firstname</th>
    <th>Lastname</th>
    </tr>
    <tr>
    <td>" . $first_name . "</td>
    <td>" . $second_name . "</td>
    </tr>
    </table>
    </body>
    </html>
    ";
     ....
    ?>
    

    【讨论】:

      【解决方案4】:

      你可以这样做:

      $message = "
      <html>
      ...
      <tr>
      <td>".htmlspecialchars($name)."</td>
      </tr>
      ...
      </html>
      ";
      

      非常重要转义不受您控制的内容(即从表单中收集)以防止注入攻击。在这种情况下,我们使用htmlspecialchars

      【讨论】:

        猜你喜欢
        • 2017-04-21
        • 1970-01-01
        • 2018-12-07
        • 2015-06-04
        • 1970-01-01
        • 2018-02-16
        • 2015-09-10
        • 2019-10-20
        • 1970-01-01
        相关资源
        最近更新 更多