用PHP mail()函数发送邮件

4
我在使用php的mail()函数发送邮件时遇到了问题。我不确定这是否与代码有关,因为我读到有些托管服务器不允许发送邮件,但我在本地主机上运行网站并尝试发送此邮件时,它仍无法正常工作 - 在单击“发送”后,我会看到“您的邮件已发送”的信息,但是当我检查我的信箱时,没有邮件(也没有在垃圾邮件中)。对我而言,代码看起来没问题,但也许我漏掉了什么。我正在考虑的第二个选项是,我的本地主机也不允许发送邮件。
<form id="contact" action="mail.php" method="POST">
    <div class="field">
        <label class="fixed_width" for="name">Name:</label><input id="name" name="name" value="Name"/>
    </div>
    <div class="field">
        <label class="fixed_width" for="surname">Surname:</label><input id="surname" name="surname" value="Surname"/>
    </div>
    <div class="field">
        <label class="fixed_width" for="mail">E-mail:</label><input id="mail" name="mail" value="E-mail"/>
    </div>
    <div class="field" id="message">
        <label class="fixed_width" id="message_width" for="mail">Message:</label>
        <textarea id="message" name="message" />Type your message...</textarea>
    </div>
    <div>
        <input class="width" type="submit" value="Send" />
    </div>
</form>

<?php

    srand((double)microtime()*1000000);
    $marker = md5(uniqid(rand()));

    $receiver  = "address@gmail.com";
    $title = "Mail";
    $sender  = $_POST['name'];
    $sender .= $_POST['surname'];
    $sender_mail = $_POST['mail'];

    $message = $_POST['message'];

    $headers  = "From: $sender <$sender_mail>\n";
    $headers .= "MIME-Version: 1.0\n";
    $headers .= "Content-Type: multipart/mixed;\n";
    $headers .= "\tboundary=\"___$marker==\"";

    $content ="--___$marker==\n";
    $content .="Content-Type: text/plain; charset=\"iso-8859-2\"\n";
    $content .="Content-Transfer-Encoding: 8bit\n";
    $content .="\n$message\n";

    if (mail($receiver,$title,$content,$headers))
    {
        print "Your message is sent.";
    } else {
        print "Your message is not sent.
        <br>Please go <a href=\"javascript:history.back();\">back</a> and send again.";
    }
?>

我的php配置截图:

PHP config PHP config PHP config


你是否已经开启了错误报告?你尝试过使用非 Gmail 的电子邮件吗?你使用边界的原因是什么(这不是必要的)?你似乎没有使用“-f”参数,这有助于提高可传递性... - random_user_name
1
如果我是你,我会将输入的'value'属性更改为'placeholder'。这样可以避免依赖JS来检查这些字段是否将其值设置为默认值,并在它们获得焦点时清除它们以及在模糊时为空时设置它们。既然你已经给这些字段标签,设置值就是多余的。此外,我会在$_POST变量周围放置strip_tags()或filter_var()调用。(永远不要信任用户输入而没有任何形式的卫生设施。) - Agi Hammerthief
@cale_b OP已经指定这是在本地主机上。 - Agi Hammerthief
我从本地安装中发送电子邮件从来没有成功过的运气... - random_user_name
这是本地主机,我已经尝试过使用非Gmail的其他电子邮件。 - Beacze
显示剩余2条评论
2个回答

7

为了测试邮件的发送是否正常工作,请尝试这个非常简短的程序:

<?php
$email_to="address@gmail.com";
$email_subject="It works";
$email_message="Hello. I can send mail!";
$headers = "From: Beacze\r\n".
"Reply-To: address@gmail.com\r\n'" .
"X-Mailer: PHP/" . phpversion();
mail($email_to, $email_subject, $email_message, $headers);  
echo "mail sent!"
?>

我曾经使用过类似的方法作为测试配置的起点。如果这不起作用,那很可能是你的服务器配置问题。


1
同样的情况。我收到了“邮件已发送!”的信息,但我的邮箱里没有任何邮件。 - Beacze
你尝试过刷新收件箱吗?有时可能需要一段时间。另外,你正在发送邮件的服务器(例如,如果使用谷歌的邮件服务器)是否需要身份验证? - Agi Hammerthief
1
是的,我已经刷新了几次。不,我没有进行任何身份验证。 - Beacze

2

您可以使用SMTP(phpmailer)
示例:

$mail = new PHPMailer();
$mail->IsSMTP();
$mail->CharSet = 'UTF-8';

$mail->Host       = "mail.example.com"; // SMTP server example
$mail->SMTPDebug  = 0;                     // enables SMTP debug information (for testing)
$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->Port       = 25;                    // set the SMTP port for the GMAIL server
$mail->Username   = "username"; // SMTP account username example
$mail->Password   = "password";        // SMTP account password example

您可以在此处了解更多关于PHPMailer的信息:https://code.google.com/a/apache-extras.org/p/phpmailer/


嗯...我想只写一个简单的联系表格,但我不知道从哪里获取用户名和密码。 - Beacze
2
如果邮件服务器需要身份验证,则用户名和密码用于SMTP邮件服务器,通过该服务器发送电子邮件。 - Agi Hammerthief

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接