Почему PHP не отправляет электронное письмо? - PullRequest
0 голосов
/ 05 июля 2010

Я пытаюсь отправить сообщение электронной почты с данными, собранными из HTML-формы.

Вот форма:

<form action="estimate.php" action="post">
    <fieldset>
        <input type="text" name="name" value="FULL NAME" onfocus="if (this.value=='FULL NAME') this.value='';"/>
        <input type="text" name="phone" value="PHONE NUMBER" onfocus="if (this.value=='PHONE NUMBER') this.value='';"/>
        <input type="text" name="email" value="EMAIL" onfocus="if (this.value=='EMAIL') this.value='';"/>
        <input type="text" name="date" value="MOVE DATE" onfocus="if (this.value=='MOVE DATE') this.value='';"/>
        <input type="text" name="origin" value="ORIGINATING ADDRESS" onfocus="if (this.value=='ORIGINATING ADDRESS') this.value='';"/>
        <input type="text" name="destination" value="DESTINATION ADDRESS" onfocus="if (this.value=='DESTINATION ADDRESS') this.value='';"/>
        <select name="move-type">
            <option value="" selected="selected">TYPE OF MOVE</option>
            <option value="Private">Private</option>
            <option value="Commercial">Commercial</option>
        </select>
        <input id="quoteSubmit" type="image" src="_images/btn_submit.png" alt="" onmouseover="javascript:this.src='_images/btn_submit-over.png'" onmouseout="javascript:this.src='_images/btn_submit.png'"/>
    </fieldset>
</form>

Вот PHP (по которому я получил некоторую помощь пов более ранней публикации вопроса):

<html>
<head>
<title>Contact Us</title>
</head>
<body>
<h2>Email Confirmation Page</h2>
<p>This is to prove that something is showing up.</p>
<?php # sends contents of  Free Estimate form

if (isset($_POST['submitted'])) {
$errors = array();

// Check for empty fields

$checkArray = array('name', 'email', 'date', 'origin', 'destination');
foreach($checkArray as $check) {
    if (empty($_POST[$check])) {
        $errors[] = 'Please enter your '.$check;
    } 
}

if (empty($errors)) { // everything is okay

$to = "my@email.com";

    $body = "The following Free Estimate Request has been submitted:\n

        Submitted by: {$_POST['name']}\r
        E-mail: {$_POST['email']}\r
        Phone: {$_POST['phone']}\r
        Move date {$_POST['date']}\r
        Moving from: {$_POST['origin']}\r
        Moving to: {$_POST['destination']}\r
        Move type: {$_POST['move-type']}\r;

    ";

    mail ($to, 'Free Estimate Request', $body, 'From:  '.$from);      

    // end email

} else {    
    echo '<h2>Error!</h2>
    <p class="errors">The following error(s) occurred:<br />';
    foreach ($errors as $msg) {
        echo " - $msg<br />\n";
    }
    echo '</p><p>Please go back and try again.</p><p><br /></p>';
}
};

?>
</body>
</html>

Страница сметы отображается нормально, ошибки не генерируются, но я не получаю никаких писем.

Не уверен, что яздесь отсутствует.

Спасибо.

Ответы [ 6 ]

2 голосов
/ 05 июля 2010

Многие вещи могут сделать это, и одна из них - искаженные сообщения электронной почты. Этого довольно легко достичь с помощью функции PHP mail , если вы не знаете RFC / стандарты. Даже если mail() вернет истину (успех), возможно, электронное письмо никогда не достигнет своего пункта назначения.

Более (неочевидными) причинами такого сбоя часто являются:

Дополнительные заголовки (например, Reply-To) должны быть разделены \r\n:

Несколько дополнительных заголовков должно быть разделенные CRLF (\ r \ n).

Линии в теле должны быть разделены \n:

Каждая строка должна быть отделена LF (\ n). Линии не должны быть больше чем 70 символов

В настоящее время вы используете \r и \n в теле, что неверно (в некоторых случаях это может работать, но это зависит от многих вещей из ваших рук).

Другими причинами могут быть отсутствие заголовка Reply-To или даже неправильно настроенные записи MX , из-за которых вся ваша электронная почта, отправленная с помощью PHP, считается спамом.

Лучшее (и самое простое) решение IMHO - перестать использовать почтовую функцию PHP и переключиться на библиотеку, которая будет создавать правильно отформатированные почтовые сообщения. Таким образом, вам не нужно изучать все хитрые RFC, и ваш код будет более безопасным, если вы используете хорошую библиотеку (читайте о атаках по электронной почте ).

Я использую Swift Mailer и PHPMailer .

1 голос
/ 05 июля 2010

Попробуйте отправить с простым телом:

$body = "The following Free Estimate Request has been submitted:\n";

Посмотрите, отправляет ли он тогда.

также попробуйте базовое электронное письмо:

mail ($to, 'Free Estimate Request', 'This is my body', 'From:  '.$from);

Также попробуйте изменить другоеадрес электронной почты и проверьте папки нежелательной почты.

И, конечно же, убедитесь, что SMTP-сервер работает под управлением

ОБНОВЛЕНИЕ:

Вы также можете:

<code>echo "<pre>";
print_r($_POST);
echo "
";

Добавьте это до вашего isset($_POST['submitted']); Затем вы можете проверить, насколько далеко он зашел, и вы можете проверить свой пост vars

0 голосов
/ 05 июля 2010

Вы работаете с локального сервера? Вам нужно настроить DNS, чтобы отправить электронное письмо ...

0 голосов
/ 05 июля 2010

Вы в системе UNIX?Проверьте ваши системные журналы.PHP отправляет электронную почту, передавая ее системной почтовой службе.Вы должны убедиться, что это работает, прежде чем PHP сможет отправлять электронную почту.

0 голосов
/ 05 июля 2010

Машина, на которой вы работаете, настроена ли она на отправку электронной почты?Код кажется нормальным, поэтому, возможно, проблема в конфигурации, проверьте this out.

0 голосов
/ 05 июля 2010

Вы проверили возвращаемое значение mail(), чтобы увидеть, удалось ли это? Кроме того, для успешного выполнения этого вызова SMTP-сервер должен работать на том же компьютере, что и веб-сервер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...