PHP问题使用标头发送邮件

时间:2010-12-12 14:22:09

标签: php email

我有一个联系表单,可以向用户发送一封邮件,另一封向管理员发送邮件。

发送给用户的电子邮件没有问题,但另一个电子邮件无法正常工作并提供成功代码。

这是我的代码:

这是配置文件(删除了电子邮件和内容):

$adminEmail = "*********@*****.com";
$adminSubj = "Admin Subject";

$userSubj = "User Subject";

////////////////////////////////////////////////////////
//DON`T EDIT BELOW THIS LINE
////////////////////////////////////////////////////////

$userName = $_GET['name'];
$userEmail = $_GET['email'];
$userPhone = $_GET['phone'];
$userMessage = $_GET['message'];


$adminHeaders = 'MIME-Version: 1.0' . "\r\n";
$adminHeaders .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";;
$adminHeaders .= "To: " . $adminEmail . "<" . $adminEmail . ">" . "\r\n";
$adminHeaders .= "From: " . $userName ."<" . $userEmail . ">" . "\r\n";


$userHeaders  = 'MIME-Version: 1.0' . "\r\n";
$userHeaders .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
$userHeaders .= "To: " . $userName . "<" . $userEmail . ">" . "\r\n";
$userHeaders .= "From: website <no-reply@website>" . "\r\n";

这是发送邮件的文件:

include("config.php");

$userSendMessage = "Your Message:<br />
$userMessage<br /><br /><br />
We will get back you.
<br /><br />
Thanks
Website Team.

";

$adminSendMessage = "
$userName<br />
$userEmail<br />
$userPhone<br />
$userMessage";


$toUser = mail($userEmail,$userSubj,$userSendMessage,$userHeaders);
$toAdmin = mail($adminEmail,$adminSubj,$adminSendMessage,$adminHeaders);

if($toAdmin && $toUser)
    echo 1;
else
    echo 0;

我猜问题出现在$adminHeaders

$adminHeaders = 'MIME-Version: 1.0' . "\r\n";
$adminHeaders .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";;
$adminHeaders .= "To: " . $adminEmail . "<" . $adminEmail . ">" . "\r\n";
$adminHeaders .= "From: " . $userName ."<" . $userEmail . ">" . "\r\n";

当我使用标题时,它可以正常工作:

$adminHeaders = 'MIME-Version: 1.0' . "\r\n";
$adminHeaders .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";;
$adminHeaders .= "To: " . $adminEmail . "<" . $adminEmail . ">" . "\r\n";
$adminHeaders .= "From: Someone <someEmail@someServer.com" . "\r\n";

知道如何通过用户电子邮件将邮件发送给管理员吗?

5 个答案:

答案 0 :(得分:1)

您可以考虑使用PHP Mailer

它可以用作mail()函数的包装器,就这么简单:

<?php

require_once('PHPMailer_v5.1/class.phpmailer.php');

$mail = new PHPMailer(); // defaults to using php "mail()"

$body = file_get_contents('contents.html');
$mail->SetFrom($fromAddress, 'First Last');
$mail->AddReplyTo($replyToAddress, "First Last");
$mail->AddAddress($toAddress, "John Doe");
$mail->Subject = "PHPMailer Test Subject via mail(), basic";
$mail->AltBody = "To view the message, please use an HTML compatible email viewer!"; // optional, comment out and test
$mail->MsgHTML($body);

// $mail->AddAttachment("images/phpmailer.gif");      // attachment
// $mail->AddAttachment("images/phpmailer_mini.gif"); // attachment

if (!$mail->Send()) {
    echo "Mailer Error: " . $mail->ErrorInfo;
} else {
    echo "Message sent!";
}

答案 1 :(得分:1)

已为您完成了艰苦的工作。有很多图书馆可以满足您的需求,我最喜欢的就是这里:

http://phpmailer.worxware.com/

它易于使用,非常强大,可以很好地防止来自webforms的垃圾邮件。

答案 2 :(得分:1)

某些邮件域具有检查功能,以确保发件人不会伪装成某个其他域。如果未指定发件人,则检查发件人地址。

这可以通过添加另一个标题来修复:

Sender: someone@yoursendingserver.com

另请注意,您的脚本很容易被标头操作,因为它没有被正确转义。这只能通过使用quoted_printable_encode,例如

在PHP 5.3中轻松完成
'From: ' . quoted_printable_encode($userName . '<' . $userEmail . '>');

早期的PHP版本没有一种简单的方法可以在没有库的情况下正确执行此操作。

我同意你应该看一下使用库来执行此操作的其他答案,但我不建议您使用php邮件程序,因为它不再处于活动开发状态(尽管它可能功能丰富)。

我使用来自Zend Framework的邮件类(因为我也使用框架):

http://framework.zend.com/manual/en/zend.mail.introduction.html

Apache Zeta组件(以前称为ez组件),做得很好:

http://qafoo.com/blog/011_apache_zeta_components_doing_mail_right.html

答案 3 :(得分:0)

当我编写这样的脚本时,我总是检查空白并尽可能地消除它们,以便正确发送它们的标题。否则,请查看mail函数上的示例。

我注意到当设置adminHeaders时,下面一行的末尾有2个方括号。

$adminHeaders .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";;

将标题更改为以下内容时:

$adminHeaders .= "From: Someone <someEmail@someServer.com" . "\r\n";

您在“某人”电子邮件地址后错过了一个闭幕式。

在手册页的更多示例中,它们仅将“收件人”和“发件人”参数显示为电子邮件地址。尝试一起删除大括号和重复的电子邮件。您可能还希望从$ _GET变量中保护您的值,这可能会被利用。也许值得调试$ _GET变量为$ userName和$ userEmail的值提供的东西(这可以像回声或vardumping变量一样简单)。

答案 4 :(得分:0)

我也遇到了同样的问题,在一些R&amp; D之后我发现如果我们从消息字段中删除换行符,那么我们的PHP邮件功能就开始工作了

例如我之前使用的消息 -

$message = '<html>
        <head>
          <title>App Approval</title>
        </head>
        <body>
          <p>Hi amir!</p>
          <table>
            <tr>
              <td>Amir Khan has created a new app HH</td>
            </tr>
            <tr>
              <td>Click the following link in order to <a href="http://theexecutiveeye.com/teenetwork/index.php?action=view&sub=app&app_id=">view</a> the app.</td>
            </tr>
          </table>
        </body>
        </html>
        ';

将其更改为

$message = '<html><head><title>App Approval</title></head><body><p>Hi amir!</p><table><tr><td>Amir Khan has created a new app HH</td></tr><tr><td>Click the following link in order to <a href="http://theexecutiveeye.com/teenetwork/index.php?action=view&sub=app&app_id=">view</a> the app.</td></tr></table></body></html>';

它开始工作了。

此外,如果您对如何在单个qoutes之间的消息内容中使用变量感到困惑,那么我的建议是将其用作双引号 至于这个

$message = 'blah blah blah';

使用此

$message = 'blah'.$blah.' blah';