Samira Radwan Ответов: 1

Отправка электронной почты с прикреплением с помощью PHP


Всем Привет,

Я использую PHP для отправки электронного письма из контактной формы с вложением.
У меня есть 2 проблемы:
1-он не работает на локальном хостинге.
2 - на сервере, где размещен сайт, он работал только при отправке в аккаунт GMAIL, но без отправки вложения.
Сайт очень прост, просто HTML-страницы, это единственная страница, на которой мне нужно использовать серверный код для отправки электронной почты.


Пожалуйста, посоветуйте, что я делаю не так
Спасибо

Что я уже пробовал:

HTML-код:
<pre><!DOCTYPE html>
<html>
<head>
<link rel='stylesheet' type='text/css' href='sendEmail.css'/>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
 
<script type='text/javascript' src='validateEmail.js'></script>
</head>
<body>
    <form name="contactform" class="contactform" method="post" onsubmit="return validateForm()"  action="sendEmail.php">
        <label>Sender Email:</label>
        <input type="text" id="semail" name="semail" />
        <label>Recipient Email:</label>
        <input type="text" id="remail" name="remail" value="" />
        <label for="Subject">Subject:</label>
        <input type="text" name="Subject" id="Subject" />
        <label for="Attachment">Attachment:</label>
        <input type="file" name="attach1" id="attach1" />
        <label for="Message">Message:</label><br />
        <textarea name="Message" rows="20" cols="20" id="Message"></textarea>
        <div class="submit-btn">
        <input type="submit"/>
        </div>
    </form>
</body>
</html>


PHP-код:
<pre><?php
ini_set('display_errors', 1);
$senderEmail = filterInput($_POST['semail']);
$recipientEmail = filterInput($_POST['remail']); 
$message = filterInput($_POST['Message']);
$subject = filterInput($_POST['Subject']);
 
/* echo $senderEmail.$recipientEmail.$message.$subject; */
if(sendEmailWithAttachments($recipientEmail,$senderEmail,$subject,$message))
{
    echo "Email sent successfully!";
}
else
{
    echo "Failed to send the email...";
}
 
function filterInput($data)
{
     $data = trim($data);
     $data = stripslashes($data);
     $data = htmlspecialchars($data);
     return $data;
}
function sendEmailWithAttachments($recipientEmail,$senderEmail,$subject,$message){
 
     
    if(isset($_FILES)) {

        $allowedExtensions = array("pdf","doc","docx"); /*,"gif","jpeg","jpg","JPG","png","PNG","rtf","txt","xml"*/
 
        $files = array();
        foreach($_FILES as $name=>$file) {
            //die("file size: ".$file['size']);
            if($file['size']>=5242880)//5mb
            {
                $fileSize=$file['size'];
                return false;
            }
            $file_name = $file['name']; 
            $temp_name = $file['tmp_name'];
            $file_type = $file['type'];
            $path_parts = pathinfo($file_name);
            $ext = $path_parts['extension'];
            if(!in_array($ext,$allowedExtensions)) {
                return false;
                die("File $file_name has the extensions $ext which is not allowed");
            }
 
            //move the file to the server, cannot be skipped
            $server_file="/tmp/$path_parts[basename]";
            move_uploaded_file($temp_name,$server_file);
            array_push($files,$server_file);
            //array_push($files,$temp_name);
        }
 
        // email fields
        $headers = "From: $senderEmail";
 
 
        // boundary 
        $semi_rand = md5(time()); 
        $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; 
 
        // headers for attachment 
        $headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\""; 
 
        // multipart boundary 
        $message = "This is a multi-part message in MIME format.\n\n" . "--{$mime_boundary}\n" . "Content-Type: text/plain; charset=\"iso-8859-1\"\n" . "Content-Transfer-Encoding: 7bit\n\n" . $message . "\n\n"; 
        $message .= "--{$mime_boundary}--\n";
 
        // preparing attachments
        for($x=0;$x<count($files);$x++){
            $file = fopen($files[$x],"rb");
            $data = fread($file,filesize($files[$x]));
            fclose($file);
            $data = chunk_split(base64_encode($data));
            $message .= "Content-Type: {\"application/octet-stream\"};\n" . " name=\"$files[$x]\"\n" . 
            "Content-Disposition: attachment;\n" . " filename=\"$files[$x]\"\n" . 
            "Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
            $message .= "--{$mime_boundary}\n";
        }
 
        // send
        return mail($recipientEmail, $subject, $message, $headers); /*@mail*/
 
    }
}   

1 Ответов

Рейтинг:
0

Jochen Arndt

Цитата:
1-он не работает на локальном хостинге.
Проверьте свою конфигурацию PHP (в PHP.Ини) относительно Настройки Почты. Проверьте настройки брандмауэра.

Цитата:
2 - на сервере, где размещен сайт, он работал только при отправке в аккаунт GMAIL, но без отправки вложения.
Вы тестировали другие почтовые серверы? Если да, то изменили ли вы конфигурацию почты PHP соответствующим образом?
$headers = "From: $senderEmail";
Эта строка может быть причиной того, что Почта не отправляется на localhost или на другие серверы. Многие SMTP-серверы принимают только те письма, которые От соответствует их собственному домену(доменам).

Как уже предлагалось в моем ответе на ваш предыдущий пост: проверяли ли вы необработанное содержимое (обычный текст) полученного письма, чтобы проверить, находится ли оно в допустимом формате?

В своем предыдущем ответе я отметил, что письма должны использовать завершенные строки CRLF (\r\n), но вы все еще используете один LF. В то время как большинство почтовых программ принимают LF-завершенные строки, вы не должны полагаться на это. С Windows вы также должны установить sendmail_from в в PHP.Ини.

Эта строка содержит недопустимый тип содержимого:
$message .= "Content-Type: {\"application/octet-stream\"};\n" . " // ...

По крайней мере, приведенная выше строка и отсутствие использования CRLF делают вашу почту недействительной (RFC соответствует). При создании Почтового контента вы должны убедиться, что он действителен, что требует знания формата, прочитав соответствующие RFC.


Samira Radwan

Это было полезно, спасибо