虽然确认PHP邮件()函数无法工作
问题描述:
我创建了一个表单,允许用户从网站发送电子邮件。 HTML代码(见附件)调用一个PHP脚本(参见附件),并且该电子邮件应该被发送。该网页显示消息“邮件成功发送”,但我从未真正收到过电子邮件(它也不在垃圾邮件中)。虽然确认PHP邮件()函数无法工作
我已联系我的托管服务(等待回复)以检查PHP是否受支持。同时,我想确保我的代码没有错误。
HTML:
<form action="message.php" method="post">
<fieldset>
<p>Name <span class="requiredAsterisk">*</span></p>
<input name="name"/>
<p>Email <span class="requiredAsterisk">*</span></p>
<input name="email"/>
<p>Message <span class="requiredAsterisk">*</span></p>
<textarea name="message"></textarea>
</fieldset>
<fieldset>
<input class="sendMessage w3-large" type="submit" value="Send Message"/>
</fieldset>
</form>
PHP:
<?php
$header = 'From: ' .$_POST['name'] ."\r\n" .'Reply-to: ' .$_POST['email'] ."\r\n" .'X-Mailer: PHP/' .phpversion();
if (mail("[email protected]", "Email from website", $_POST['message'], $header)) {
echo ("<p>Email successfully sent</p>");
} else {
echo ("<p>Email failed</p>");
}
?>
在此先感谢
答
(我可能会评论这一点,但我的代表处是太低了),你应该使用 $message = wordwrap($_POST['message'], 70, "\r\n");
所以你消息在mail()
的文档之后。除此之外,你的代码似乎很好。正如您所提到的,这可能与您的托管服务提供商有关,因为它们是阻止mail
功能的常用位置。另请参阅this question on it了解可能导致问题的一些附加信息。
答
PHP中原始mail()
函数的一个很好的替代方法就像PHPMailer。正如在github上页指出:
绝大多数的代码,你会发现,使用邮件在线()函数 直接简直是完全错误的!请不要试图做 它自己 - 如果你不使用PHPMailer的,有你应该看看滚动自己以前很多其他优秀的 图书馆 - 尝试SwiftMailer,使用Zend_Mail,eZcomponents等
PHPMailer非常容易设置和开始。这是发送电子邮件的基本语法:
<?php
require 'PHPMailerAutoload.php';
$mail = new PHPMailer;
//$mail->SMTPDebug = 3; // Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = 'smtp1.example.com;smtp2.example.com'; // Specify main and backup SMTP servers
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = '[email protected]'; // SMTP username
$mail->Password = 'secret'; // SMTP password
$mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
$mail->Port = 587; // TCP port to connect to
$mail->setFrom('[email protected]', 'Mailer');
$mail->addAddress('[email protected]'); // Add a recipient
$mail->Subject = 'Here is the subject';
$mail->Body = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
if(!$mail->send()) {
echo 'Message could not be sent.';
echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
echo 'Message has been sent';
}
当'mail'返回true时,这只表示电子邮件已被邮件服务器接受。这并不意味着电子邮件可以发送,发送或交付。 – fubar
@fubar这是否意味着这是一个服务器端问题? –
是的,我会说这是一个服务器端问题。但这可能是一个配置问题,黑名单问题,任何事情。希望您的托管公司可以提供一些见解。 – fubar