2010-03-04 18 views
2

以下代码向我发送一封电子邮件,其中包含以下变量。最后一条if语句中的一条说明如果(邮件)回显“你会很快与你联系”。当脚本运行时,我得到回应“你会很快联系”,但是,我从来没有收到一封电子邮件。PHP邮件功能,这里有什么错?

我确实有一个较小的联系人脚本(在此之后发布的第一个较大的联系人脚本)。

注:contants.php和functions.php中都包含,做工精细 WEBMASTER_EMAIL在contanstants.php定义是正确的,因为我的 较小的接触脚本使用相同的变量和电子邮件我很好。

感谢您的帮助

<?php 

// pull constant variables 
include("php/constants.php"); 

error_reporting (E_ALL^E_NOTICE); 

$post = (!empty($_POST)) ? true : false; 

if($post) { 
    include ("php/functions.php"); 
} 

// general info 
$name = stripslashes($_POST['contact']); 
$phone = $_POST['phone']; 
$email = trim($_POST['email']); 
$time_to_reach = $_POST['time-to-reach']; // what the best time to reach them? 

// delivery info 
$delivery_address = $_POST['del-address']; 
$delivery_city = $_POST['del-city']; 
$delivery_state = $_POST['del-state']; 
$delivery_zip = $_POST['del-zip']; 

// moving city info if applicable 
$moving_address = $_POST['move-address']; 
$moving_city = $_POST['move-city']; 
$moving_state = $_POST['move-state']; 
$moving_zip = $_POST['move-zip']; 

// date needed 
$month = $_POST['month']; 
$day = $_POST['day']; 
$year = $_POST['year']; 

// how long do you need the storage? 
$storage_length = $_POST['time-length']; 

// how many containers do you need? 
$quantity_containers = $_POST['number-of-containers']; 

// how did you hear about us? 
$tracker = $_POST['tracker']; 

// message 
$message_holder = htmlspecialchars($_POST['message']); 

$error = ''; 

// check general info 
if(!$name) { $error .= 'Please enter your name.<br />'; } 
if(!$email) { $error .= 'Please enter an e-mail address.<br />'; } 
if($email && !ValidateEmail($email)) { $error .= 'Please enter a valid e-mail address.<br />'; } 
if(!$time_to_reach) { $error .= 'Please select the best time to reach you.<br />'; } 

// check delivery info 
if(!$delivery_address) { $error .= 'Please enter you current address.<br />'; } 
if(!$delivery_city) { $error .= 'Please enter your current city.<br />'; } 
if(!$delivery_state) { $error .= 'Please enter your current state.<br />'; } 
if(!$delivery_zip) { $error .= 'Please enter your current zip code.<br />'; } 

// check date needed 
if(!$month) { $error .= 'Please enter the approximate date you need the storage.<br />'; } 
if(!$day) { $error .= 'Please enter the approximate date you need the storage.<br />'; } 
if(!$year) { $error .= 'Please enter the approximate date you need the storage.<br />'; } 

// check length of time needed 
if(!$storage_length) { $error .= 'Approximatly how long will you need the storage unit for?<br />'; } 

// check quantity of storages 
if(!$quantity_containers) { $error .= 'How many containers will you need?<br />'; } 

// check advertising tracker 
if(!$tracker) { $error .= 'Please let us know how you\'ve heard of us.<br />'; } 

// check message (length) 
if(!$message_holder || strlen($message_holder) < 10) { 
    $error .= "Please enter your message. It should have at least 10 characters.<br />"; 
} 

// build email message 
$message = "Name: {$name} 
Phone: {$phone} 
Email: {$email} 
Best time to reach: {$time_to_reach}\n 
----------------------------------------------------- 
Delivery address: {$delivery_address} 
       {$delivery_city}, {$delivery_state} {$delivery_zip} 

Moving address: {$moving_address} 
       {$moving_city}, {$moving_state} {$moving_zip} 
----------------------------------------------------- 
Date needed: {$month}/{$day}/{$year} 
Length of time needed: {$storage_length} 
Number of containers: {$quantity_containers} 
Where did you hear about us? 
{$tracker}\n 
Message: {$message_holder}\n"; 

if(!$error) { 
    $mail = mail(WEBMASTER_EMAIL, $subject, $message, 
     "From: [email protected]\r\n" 
     ."Reply-To: ".$name."<".$email.">\r\n" 
     ."X-Mailer: PHP/" . phpversion()); 

    if($mail) { 
     echo '<p>Thank you, you will be contacted soon.</p>'; 
    } 
} else { 
    echo '<div class="notification_error">'.$error.'</div>'; 
} 

?> 

下面的脚本,脚本接触,没有工作意味着我收到一封电子邮件。

<?php 

// pull constant variables 
include("php/constants.php"); 

error_reporting (E_ALL^E_NOTICE); 

$post = (!empty($_POST)) ? true : false; 

if($post) { 
    include ("php/functions.php"); 
} 

// variables 
$name = stripslashes($_POST['name']); 
$phone = $_POST['phone']; 
$email = trim($_POST['email']); 
$tracker = $_POST['tracker']; 
$message_holder = htmlspecialchars($_POST['message']); 

$error = ''; 

// check name 
if(!$name) { 
    $error .= 'Please enter your name.<br />'; 
} 

// check email 
if(!$email) { 
    $error .= 'Please enter an e-mail address.<br />'; 
} 

// validate email 
if($email && !ValidateEmail($email)) { 
    $error .= 'Please enter a valid e-mail address.<br />'; 
} 

// check advertising tracker 
if(!$tracker) { 
    $error .= 'Please let us know how you\'ve heard of us.'; 
} 

// check message (length) 
if(!$message_holder || strlen($message_holder) < 10) { 
    $error .= "Please enter your message. It should have at least 10 characters.<br />"; 
} 

// build email message 
$message = "Name: {$name} \n 
Phone: {$phone} \n 
Email: {$email} \n 
Where did you hear about us? 
{$tracker}\n\n 
Message: {$message_holder}\n"; 

if(!$error) { 
    $mail = mail(WEBMASTER_EMAIL, $subject, $message, 
     "From: [email protected]\r\n" 
     ."Reply-To: ".$name."<".$email.">\r\n" 
     ."X-Mailer: PHP/" . phpversion()); 

    if($mail) { 
     //header("Location: thank_you.php"); 
     echo "Thank you. You will be contacted soon."; 
    } 
} else { 
    echo '<div class="notification_error">'.$error.'</div>'; 
} 

?> 
+1

只是一个愚蠢的评论 - - 你可以考虑'$ post =(!empty($ _ POST))? true:false;'进入'$ post =!empty($ _ POST);'。 – 2010-03-04 18:05:48

+1

第二个想法是,根据PHP文档,'empty()'等于'!((bool)$ var)',所以你可以使用'$ post =(bool)$ _ POST;'。 – 2010-03-04 18:21:29

回答

2

使用赤裸裸的邮件功能是自找麻烦(http://en.wikipedia.org/wiki/E-mail_injection,PHP的具体信息:http://www.damonkohler.com/2008/12/email-injection.html),并防止简单的调试。我建议你在邮件功能上使用对象封装,这是因为当你过滤标题时,通过使它成为一个非标准的PHP邮件表单头注入垃圾邮件发送者的目标,并且允许你更容易地调试邮件倾倒创建的邮件对象并查看其内容。对于调试,它还允许您在没有/不想拥有邮件服务器并且不想尝试的计算机上进行本地测试的情况下提供“最终回显邮件”在您只是测试功能时发送邮件。

这里是我创建并使用自己的包装(可供修改和使用): http://github.com/tchalvak/ninjawars/blob/master/deploy/lib/obj/Nmail.class.php

或者只是看看PEAR邮件:http://pear.php.net/package/Mail/

+0

Err,只是要注意,我提到的Nmail类没有在该版本中内置的必要的用户输入验证内容,因此您必须自己创建这些内容。 – Kzqai 2010-03-04 22:59:40

+0

为这个例子添加了一些天真的黑名单过滤,但我会说只是用梨邮件去。 :d – Kzqai 2010-03-04 23:42:28

0

这不是我跳出来,为什么不你是否试图把错误一直转到最后,看看它是否有效。

error_reporting(1); 

在脚本的顶部。

0

编辑:对不起,我现在看到你有打开错误报告。确保您的INI文件设置正确。尝试删除^ E_NOTICE,以便您也看到这些警告。

我有问题,mail()根本不会说什么(它会执行,如果成功)。如果您倾向于使用mail(),则可以使用SwiftMailer,它在出现错误时通常会引发有用的异常,并且包括一个使用mail()的传输类Swift_MailTransport,但它们都装扮成一个很好的面向对象的界面。

0

因此,由于问题的性质(邮件正在接收交付 - $邮件为真),问题可能出现在邮件内容中。你有权访问邮件服务器本身吗?你能检查日志吗? var_dump()$ subject,$ message,并将头文件设置为var和var_dump()。用细齿梳检查内容物。删除可疑字符和换行符,直到它可以正常工作。

有一件事要尝试......(虽然,你的其他邮件被接受了这个事实说,这很可能并非如此)

http://www.php.net/manual/en/function.mail.php

如果没有收到邮件,只能尽量 使用LF(\ n)的。一些差 质量Unix邮件传输代理 自动取代LF由CRLF自动 (如果CRLF是 使用导致CR翻倍)。这应该是最后的手段, 因为它不与»RFC 2822

与邮件的问题()是,它只是喂养发送到本地sendmail守护进程遵守。它不会给你任何有关邮件的积极反馈,并且中继邮件头有时会让你的垃圾邮件降级。

我检查出http://sourceforge.net/projects/phpmailer/

0

在消息中尝试包裹线与 $消息=换行70个字符($消息,70); 尝试用\ n代替\ r \ n,以防您的邮件功能替换为\ r \ n \ n并且您以\ r \ r结尾\ n