Функция PHP mail () не отправляется на новый сервер - PullRequest
3 голосов
/ 16 марта 2011

Возникли некоторые проблемы с PHP-скриптом, который отправляет электронные письма (код ниже).По сути, он заполняет файл vCard контактной информацией, хранящейся в базе данных sql, и прикрепляет его к электронному письму с помощью функции 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 ]

1 голос
/ 16 марта 2011

Вероятно, он находится в очереди где-то на вашем сервере. Проверьте свой php.ini.

Чтобы немного сузить его, попробуйте действительно простую почтовую команду ...

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

Также в вашем скрипте, если бы возникла проблема, вы бы ее не увидели. @ спереди отключает отображение ошибок. Так как он возвращает true, я уверен, что он работает просто отлично. Функция mail() не проверяет, что электронное письмо было успешно отправлено ... только то, что оно было передано другому лицу. Ваш sendmail на коробке может не работать. Или для Windows ваш SMTP-сервер может быть настроен неправильно.

Также всегда есть случай, когда электронная почта находится где-то в спам-фильтре.

0 голосов
/ 17 марта 2011

Хорошим вариантом является использование класса PHPMailer (http://phpmailer.worxware.com/). Я использую этот класс, и он отлично работает.

0 голосов
/ 16 марта 2011

проблема может заключаться в том, что $ usernum не установлен, используйте глобальный $ usernum или передайте его функции, также никогда не используется $ scanreduser

...