Блог разработчиков

Все разделы | CMS Joomla 2.5 | Общее | PHP | Javascript + jQuery

Отправка письма с вложением php

24 октября 2014

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

<form class="rezume" method="post" enctype="multipart/form-data">
    <p><label for="comments">Комментарий</label><textarea id="comments" name="comments"></textarea></p>
    <p><label>Вложите ваше резюме</label><input type="file" name="upfile"></p>
    <p><button name="button" type="submit">Отправить</button></p>
</form>

Очень важно чтобы у формы существовал атрибут enctype="multipart/form-data", так как без него форма не сможет передавать данные на сервер. Почему на сервер? Дело в том, что то что после нажатия на кнопку "Отправить", файл письма не сразу отправляется на заданную электронку, а изначально отправляется на сервер, находясь там его можно скорвертировать, проверить его формат, изменить размер и т.д. И только после того как он появится на сервере функция mail производит отправку письма с сервера (сайта).

Важно усвоить, что при обмене сообщениями через сайт, например, при отправки письма клиента через сайт, отправителем письма для администратора является не клиент, а сайт, а для сайта отправителем является клиент. Все письма отправленные с сайта имеют свой обработчик, который способен проверять, записывать их в базу данных, присваивать номер, отправлять письма и т.д.

Для обработки формы отправки письма из формы представленной выше необходимо использовать следующий обработчик.

if (isset ($_POST['button'])) {
    function send_mail($to, $subject, $message, $path) {
                   if ($path) {  
                    $fp = fopen($path,"rb");   
                    if (!$fp) {  
                          exit();   
                    }  
                $file = fread($fp, filesize($path));   
                fclose($fp);   
                }      
            $name = $path;
            $EOL = "
";
            $boundary     = "--".md5(uniqid(time())); 
            $headers    = "MIME-Version: 1.0;$EOL";   
            $headers   .= "Content-Type: multipart/mixed; boundary="$boundary"$EOL";  
            $headers   .= "From: address@server.com"; //адрес отправителя 
      
            $multipart  = "--$boundary$EOL";   
            $multipart .= "Content-Type: text/html; charset=UTF-8$EOL";   
            $multipart .= "Content-Transfer-Encoding: base64$EOL";
            $multipart .= $EOL;
            $multipart .= chunk_split(base64_encode($message));   
            $multipart .=  "$EOL--$boundary$EOL";   
            $multipart .= "Content-Type: application/octet-stream; name="$name"$EOL";   
            $multipart .= "Content-Transfer-Encoding: base64$EOL";   
            $multipart .= "Content-Disposition: attachment; filename="$name"$EOL";   
            $multipart .= $EOL;
            $multipart .= chunk_split(base64_encode($file));
            $multipart .= "$EOL--$boundary--$EOL";
      
        if(!mail($to, $subject, $multipart, $headers)) {
            echo 'Сообщение не отправлено';
          }  
        else {
            echo 'Ваше сообщение успешно отправлено';
        } 
      }
            $to='test@test.ru'; //здесь email получателя
            $subject = 'Отправка письма с сайта с вложением';
            $message = '<p>Комментарий: '.$_POST['comments'].'</p>';
            $picture = "";
            $headers = 'Content-Type: text/html; charset="UTF-8"'."
".
            'From: address@server.com'. //адрес отправителя 
            'X-Mailer: PHP/' . phpversion();
              if (!empty($_FILES['upfile']['tmp_name'])) { 
                $path = $_FILES['upfile']['name']; 
                if (copy($_FILES['upfile']['tmp_name'], $path)) $picture = $path; 
              }
              if(empty($picture)) {
                  if (mail($to, $subject, $message, $headers)) {
                      echo 'Ваше сообщение успешно отправлено';
                  }
              }  
              else send_mail($to, $subject, $message, $picture);
    }

 Самым первым условием в данном обработчике является проверка на нажатие на кнопку с аттрибутом name="button". В обработчике также описана функция отправки сообщения с вложением send_mail, а также проверка на существование файла во вложении, если файл не вложен, то отправка письма производится стандартным путем, если файл вложен то отправка производится через фукцию send_mail письмом с вложением.

 

$headers   .= "From: address@server.com"; //адрес отправителя