PHP | Отправить вложение по электронной почте

Опубликовано: 24 Февраля, 2022

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

Мы уже обсуждали отправку текстовых электронных писем на PHP в нашей предыдущей статье. В этой статье мы увидим, как можно отправить электронное письмо с вложениями с помощью функции mail ().

Когда вызывается функция mail (), PHP попытается отправить письмо немедленно получателю, тогда он вернет true при успешной доставке почты и false при возникновении ошибки.

Синтаксис :

bool mail ($ to, $ subject, $ message, $ headers, $ parameters);

Вот описание каждого параметра.

Имя Описание Обязательный / необязательный Тип
к Он содержит получателя или получателей конкретного электронного письма. Необходимый Нить
тема Это содержит тему электронного письма. Этот параметр не может содержать символы новой строки. Необходимый Нить
сообщение Он содержит сообщение, которое нужно отправить. Каждую строку следует разделять знаком LF ( n). Строки не должны превышать 70 символов (для этого мы будем использовать функцию wordwrap ().) Необходимый Нить
заголовки Это содержит дополнительные заголовки, такие как From, Cc, Mime Version, Bcc. По желанию Нить
параметры Задает дополнительный параметр для программы отправки почты По желанию Нить

Когда мы отправляем письмо через PHP, все содержимое сообщения будет рассматриваться только как простой текст. Если мы поместим какой-либо тег HTML в тело сообщения, он не будет отформатирован как синтаксис HTML. HTML-тег будет отображаться как простой текст.
Чтобы отформатировать любой тег HTML в соответствии с синтаксисом HTML, мы можем указать версию MIME (многоцелевое расширение почты Интернета), тип содержимого и набор символов тела сообщения.
Чтобы отправить вложение вместе с электронным письмом, нам нужно установить Content-type как смешанный / составной, и мы должны определить разделы текста и вложения в пределах границы .

Create an HTML form:

<form enctype="multipart/form-data" method="POST" action="">
    <label>Your Name <input type="text" name="sender_name" /> </label
    <label>Your Email <input type="email" name="sender_email" /> </label
    <label>Subject <input type="text" name="subject" /> </label
    <label>Message <textarea name="message"></textarea> </label
    <label>Attachment <input type="file" name="attachment" /></label>
    <label><input type="submit" name="button" value="Submit" /></label>
</form>

PHP Script for handling the form data:

if($_POST["button"] && isset($_FILES["attachment"]))
{
  
    $from_email         = "sender@abc.com"; //from mail, sender email addrress
    $recipient_email    = "recipient@xyz.com"; //recipient email addrress
      
    //Load POST data from HTML form
    $sender_name    = $_POST["sender_name"] //sender name
    $reply_to_email = $_POST["sender_email"] //sender email, it will be used in "reply-to" header
    $subject        = $_POST["subject"] //subject for the email
    $message        = $_POST["message"] //body of the email
      
  
    /*Always remember to validate the form fields like this
    if(strlen($sender_name)<1)
    {
        die("Name is too short or empty!");
    
    */
      
    //Get uploaded file data using $_FILES array
    $tmp_name    = $_FILES["my_file"]["tmp_name"]; // get the temporary file name of the file on the server
    $name        = $_FILES["my_file"]["name"];  // get the name of the file
    $size        = $_FILES["my_file"]["size"];  // get size of the file for size validation
    $type        = $_FILES["my_file"]["type"];  // get type of the file
    $error       = $_FILES["my_file"]["error"]; // get the error (if any)
  
    //validate form field for attaching the file
    if($file_error > 0)
    {
        die("Upload error or No files uploaded");
    }
  
    //read from the uploaded file & base64_encode content
    $handle = fopen($tmp_name, "r");  // set the file handle only for reading the file
    $content = fread($handle, $size); // reading the file
    fclose($handle);                  // close upon completion
  
    $encoded_content = chunk_split(base64_encode($content));
  
    $boundary = md5("random"); // define boundary with a md5 hashed value
  
    //header
    $headers = "MIME-Version: 1.0 "; // Defining the MIME version
    $headers .= "From:".$from_email." "; // Sender Email
    $headers .= "Reply-To: ".$reply_to_email." "; // Email addrress to reach back
    $headers .= "Content-Type: multipart/mixed; "; // Defining Content-Type
    $headers .= "boundary = $boundary "; //Defining the Boundary
          
    //plain text 
    $body = "--$boundary ";
    $body .= "Content-Type: text/plain; charset=ISO-8859-1 ";
    $body .= "Content-Transfer-Encoding: base64 "
    $body .= chunk_split(base64_encode($message)); 
          
    //attachment
    $body .= "--$boundary ";
    $body .="Content-Type: $file_type; name=".$file_name." ";
    $body .="Content-Disposition: attachment; filename=".$file_name." ";
    $body .="Content-Transfer-Encoding: base64 ";
    $body .="X-Attachment-Id: ".rand(1000, 99999)." "
    $body .= $encoded_content; // Attaching the encoded file with email
      
    $sentMailResult = mail($recipient_email, $subject, $body, $headers);
  
    if($sentMailResult
    {
       echo "File Sent Successfully.";
       unlink($name); // delete the file after attachment sent.
    }
    else
    {
       die("Sorry but the email could not be sent.
                    Please go back and try again!");
    }
}
PHP