PHP mail()函数不在新服务器上发送

时间:2011-03-16 19:47:35

标签: php mysql email vcard

发送电子邮件的PHP脚本存在一些问题(下面的代码)。基本上,它使用存储在sql db中的联系信息填充vCard文件,并使用php mail()函数将其附加到电子邮件中。

我几天前在共享托管服务器上完美地工作了......但我最近将所有内容迁移到了VPS,它神奇地停止了工作。 Mail()在发送时继续返回true,但实际的电子邮件永远不会到达我的收件箱。

//sendemail: emails a vCard when passed an email address and name
function sendemail($address, $scanreduser)
{   
    include('../dbconnect.php');
    $info = mysql_fetch_array(mysql_query("SELECT * FROM users WHERE usernum='". $usernum ."' LIMIT 1 "));
    $vcard_content  = "BEGIN:VCARD\r";
    $vcard_content .= "VERSION:3.0\r";
    $vcard_content .= "N:".$info[lname].";". $info[fname] .";;;\r";
    $vcard_content .= "FN:".$info[fname]." ". $info[lname] ."\r";
    $vcard_content .= "ORG:".$info[company].";\r";
    $vcard_content .= "TITLE:".$info[title]."\r"; 
    $vcard_content .= "EMAIL;type=INTERNET;type=WORK;type=pref:".$info[email]."\r";
    $vcard_content .= "TEL;type=WORK;type=pref:".$info[phone]."\r";
    $vcard_content .= "item2.URL;type=pref:".$info[website]."\r";
    $vcard_content .= "item2.X-ABLabel:_$!<HomePage>!\$\_\r";
    $vcard_content .= "X-ABShowAs:COMPANY\r";
    $vcard_content .= "END:VCARD";

    $email_subject = "Your vCard from " . $info[fname] . " " . $info[lname];
    $fileatt_type = "application/octet-stream"; // File Type
    $fileatt_name = $info[fname] ."_". $info[lname] .".vcf";

    $headers = "From: Ben@scanred.com";
    $today = date("l, F j, Y, g:i a");

    $message = "<br />Simply open the attached vCard file to view/download the information<br />";
    $message .= $today." PST<br /><br />";
    $message .= $info[name]."<br />";

    $data = $vcard_content;
    $data = chunk_split(base64_encode($data));

    $semi_rand = md5(time());
    $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";

    $headers .= "\nMIME-Version: 1.0\n" .
    "Content-Type: multipart/mixed;\n" .
    " boundary=\"{$mime_boundary}\"";

    $message .= "This is a multi-part message in MIME format.\n\n" .
    "--{$mime_boundary}\n" .
    "Content-Type:text/html; charset=\"iso-8859-1\"\n" .
    "Content-Transfer-Encoding: 7bit\n\n" .
    $message . "\n\n";
    $message .= "--{$mime_boundary}\n" .
    "Content-Type: {$fileatt_type};\n" .
    " name=\"{$fileatt_name}\"\n" .
    "Content-Transfer-Encoding: base64\n\n" .
    $data . "\n\n" .
    "--{$mime_boundary}--\n";

    echo @mail($address, $email_subject, $message, $headers);
    echo $address;


}

3 个答案:

答案 0 :(得分:1)

它可能位于服务器上的某个队列中。检查你的php.ini。

只是为了缩小它,尝试一个非常简单的邮件命令...

mail("youraddress@whatever.com", "Subject", "Testing 3, 2, 1...");

同样在您的脚本中,如果出现问题,您将看不到它。前面的@禁用显示错误。既然它回归真实,我敢打赌它的工作正常。 mail()函数不会验证电子邮件是否已成功发送...只是它已被传递给其他人。您的邮箱上的sendmail可能无法正常运行。或者对于Windows,可能未正确设置SMTP服务器。

电子邮件总是存在于某处的垃圾邮件过滤器中。

答案 1 :(得分:0)

问题可能是$ usernum未设置,使用global $ usernum或将其传递给函数也是$ scanreduser从未使用过

答案 2 :(得分:0)

好的选择是使用PHPMailer类(http://phpmailer.worxware.com/)。我正在使用这个类,它完美无缺。