<?php
#######################################################################################
# Пример 03. Манипулации с E-MAIL. Изпращане на e-mail с прикрепване на файл
# Автор : Алдениз Рашидов, Технически университет - Габрово
# Последна промяна : 10/11/2009
# Идеята е взаимствана от http://bg2.php.net/manual/en/function.mail.php#83491
# Необходимо е да се установяват параметри в PHP.INI за SMTP сървър ->
# 1. SMTP = IP.IP.IP.IP
# 2. smtp_port = 25
#######################################################################################
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html>
<head>
      <title>Манипулации с E-MAIL. Пример 3 - SEND E-MAIL WITH ATTACHMENT FILE</title>
      <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<html>
<body>
<h2>Изпращане на HTML E-mail с прикрепване на файл</h2>
<?
if ($_POST['flag'] == 1)
{ 

if(is_uploaded_file($_FILES['att']['tmp_name']) &&
   !empty($_FILES['att']['size']) && !empty($_FILES['att']['name'])){
    $attach     =1;  // има прикачен файл
    $handle     =fopen($_FILES['att']['tmp_name'], 'rb');
    $f_contents =fread($handle, $_FILES['att']['size']);
    $attachment =chunk_split(base64_encode($f_contents));
    fclose($handle);
    $ftype      =$_FILES['att']['type'];
    $fname      =$_FILES['att']['name'];
}

// Входни параметри

$HTML       = "<b>============ This is a test! Това е тест! ============</b>";  // тяло на e-mail
$from       = "aldeniz@tugab.bg";   // източник на съобщението
$to         = "aldeniz@tugab.bg";   // приемник на съобщението
$confirm    = "aldeniz@tugab.bg";   // потвърждение за прието съобщението
$replay     = "aldeniz@tugab.bg";   // отговор към ...
$subject    = "Тест на HTML email"; // заглавие на съобщението
$charset    = "windows-1251";       // кодова таблица на съобщението

function sendHTMLemail($HTML,$from,$to,$confirm,$replay,$subject,$charset)
{
global $ftype,$fname,$attach,$attachment;
// Заглавна част на съобщението
// Задаване на MIME версия  
    $headers = "MIME-Version: 1.0\r\n";
// Задаване на "from" адрес
    $headers .= "From: $from\r\n"; 

// Задаване на приоритет на съобщението
    $headers .= "X-Priority: 1\r\n";   // 1 -> high, 3 -> normal
    
// Алтернативен метод за приоритет -> X-Priority  // hight - > 1 
    $headers .= "X-MSMail-Priority: High\r\n"; 
    
// E-mail приемник на потвърждение при прието съобщение от $to  
    $headers .= "Disposition-Notification-To: $confirm\r\n"; 
    
// Задаване на идентификация на програмата която извършва изпращането
    $headers .= "X-Mailer: PHP/" . phpversion()."\r\n"; 
    
// E-mail за отговор - използва се при избор на Replay на email клиента. Може да не се зададе! 
    $headers .= "Reply-To:$replay\r\n"; 

// Създаване на уникални имена за ограничаване на областите в тялото на съобщението 
// boundary so we know where to look for the start of the data
    $boundary1 = uniqid("HTMLEMAIL"); 
    $boundary = uniqid("HTMLEMAIL"); 

if ($attach==1) {
// Деклариране на тип на съдържанието на разширена област включваща текстова част, HTML част и прикрепен файл 
    $headers .= "Content-Type: multipart/mixed; ".
                "boundary = $boundary1\r\n\r\n"; 
 } else
// Деклариране на тип на съдържанието на разширена област включваща текстова част и HTML част 
    $headers .= "Content-Type: multipart/alternative;".
                "boundary = $boundary\r\n\r\n"; 
                
// ТЯЛО НА СЪОБЩЕНИЕТО

// В случай, че е прикрепен файл към съобщението се указва <начало на област на прикрепен файл> 
if ($attach==1) 
    $body .= "--$boundary1\r\n".    

// Задаване на MIME версия на тялото
    $body .= "MIME-Version: 1.0\r\n"; 
    
// Деклариране на тип на съдържанието на разширена област с текстова и HTML версия
    $body .= "Content-Type: multipart/alternative; ".
                "boundary = $boundary\r\n\r\n"; 
                
    $body .= "This is a MIME encoded message.\r\n\r\n"; 

// Указване на начало на областта на текстовата версия
// , деклариране на тип на съдържанието, кодова таблица и кодиране 
    $body .= "--$boundary\r\n".
                "Content-Type: text/plain; charset=$charset\r\n".
                "Content-Transfer-Encoding: base64\r\n\r\n"; 
// Добавяне на текстовото съдържание на съобщението
// като с chunk_split се разбива на редове от по определен брой (76) символи
    $body .= chunk_split(base64_encode(strip_tags($HTML))); 

// Указване на начало на областта на HTML версия
// , деклариране на тип на съдържанието, кодова таблица, кодиране 
    $body .= "--$boundary\r\n".
                "Content-Type: text/html; charset=$charset\r\n".
                "Content-Transfer-Encoding: base64\r\n\r\n"; 
// Добавяне на HTML съдържанието на съобщението, 
    $body .= chunk_split(base64_encode($HTML)); 
// Указва край на областта
    $body .= "--$boundary--\r\n\r\n";

// В случай че има прикрепен файл
if ($attach==1) {
// Указване на начало на област за прикрепен файл към съобщението
    $body .="--$boundary1\r\n";
// Деклариране на тип на съдържанието на областта, кодиране 
    $body .="Content-Type: $ftype; name=\"$fname\"\r\n";
    $body .="Content-Transfer-Encoding: base64\r\n";
    $body .="Content-Disposition: attachment; filename=\"$fname\"\r\n\r\n";
// Добавяне на съдържание на прикрепеният файл
    $body .=$attachment."\r\n\r\n";
// Указва край на областта
    $body .= "--$boundary1--\r\n";
}

// Изпращане на съобщението ...
    mail($to,$subject,$body,$headers);
}

sendHTMLemail($HTML,$from,$to,$confirm,$replay,$subject,$charset);
}

?> 
<div id="body">
    <form action="" method="post" enctype="multipart/form-data">
    <input type="hidden" name="flag" value="1">
            <input name="att" type="file">
            <input name="upload" type="submit" value="Attach">
    </form>
</div>
</body>
</html>