虽然确认PHP邮件()函数无法工作

虽然确认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>"); 
} 
?> 

在此先感谢

+1

当'mail'返回true时,这只表示电子邮件已被邮件服务器接受。这并不意味着电子邮件可以发送,发送或交付。 – fubar

+0

@fubar这是否意味着这是一个服务器端问题? –

+1

是的,我会说这是一个服务器端问题。但这可能是一个配置问题,黑名单问题,任何事情。希望您的托管公司可以提供一些见解。 – fubar

(我可能会评论这一点,但我的代表处是太低了),你应该使用 $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'; 
} 
+0

lol在“这是发送电子邮件的基本语法”:-)如果您手边没有SMTP,它也完全没用,因为它会使用内部' mail()'函数。 – Capsule

+0

当然,但他提到他有一个托管服务,所以他最有可能拥有一个SMTP。即使他没有托管服务,他也可以使用无数其他服务提供诸如Yahoo或Gmail等SMTP服务。 @Capsule –

+0

雅虎或Gmail会在您的表单因为会产生流量而被滥用时立即阻止您,共享主机通常不会提供auth-SMTP。我并不是说这不是一个有效的答案,但我正在减轻热情:-) – Capsule