Разработка сайтов и программного обеспечения, системное администрирование, обучение программированию и работе с СУБД MySQL

in english

Отправка писем с вложенными картинками на PHP

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

Пример простой php-функции для отправки писем с картинками внутри.


<?php
/**
 * отправка письма с вложениями
 *
 * @param string $from от кого
 * @param string $to кому

 * @param string $subject тема
 * @param string $text собственно текст (html)
 * @param string $cc копия
 * @return unknown
 */
function multipart_mail($from$to$subject$text,$cc=null) {

       global $domain; //Не забудьте проинициализировать 
       $headers ="From: $from\n";
       //$headers.="To: $to\n";
       if (!is_null($cc))      {

         $headers.="Cc: $cc\n";
       }
       //$headers.="Subject: $subject\n";
       $headers.="Date: ".date("r")."\n";

       $headers.="Return-Path: $from\n";
       $headers.="X-Mailer: zm php script\n";
       $headers.="MIME-Version: 1.0\n";

       $headers.="Content-Type: multipart/alternative;\n";
       $baseboundary="------------".strtoupper(md5(uniqid(rand(), true)));

       $headers.="  boundary=\"$baseboundary\"\n";
       $headers.="This is a multi-part message in MIME format.\n";
       $message="--$baseboundary\n";

       $message.="Content-Type: text/plain; charset=utf-8\n";
       $message.="Content-Transfer-Encoding: 7bit\n\n";
       $text_plain=str_replace('<p>',"\n",$text);

       $text_plain=str_replace('<b>',"",$text_plain);
       $text_plain=str_replace('</b>',"",$text_plain);

       $text_plain=str_replace('<br>',"\n",$text_plain);
       $text_plainpreg_replace('/<a(\s+)href="([^"]+)"([^>]+)>([^<]+)/i',"

\$4\n\$2",$text_plain);
       $message.=strip_tags($text_plain);
       //
       $message.="\n\nIts simple text. Switch to HTML view!\n\n";

       $message.="--$baseboundary\n";
       $newboundary="------------".strtoupper(md5(uniqid(rand(), true)));

       $message.="Content-Type: multipart/related;\n";
       $message.="  boundary=\"$newboundary\"\n\n\n";
       $message.="--$newboundary\n";
       $message.="Content-Type: text/html; charset=utf-8\n";

       $message.="Content-Transfer-Encoding: 7bit\n\n";
       $message.=($text)."\n\n";
       preg_match_all('/img(\s+)src="([^"]+)"/i',$text,$m);

       if (isset($m[2])) {
               $img_f=$m[2];
               if (is_array($img_f)) {

                       foreach ($img_f as $k => $v) {
                               $img_f[$k]=str_ireplace($domain.'/','',$v);

                       }
               }
       }
       $attachment_files=$img_f;
  if (is_array($attachment_files)) {
     foreach($attachment_files as $filename)  {

               $file_content file_get_contents($filename,true);
       $mime_type='image/png';
       if(function_exists("mime_content_type"))  {

               $mime_type=mime_content_type($filename);
       }
       else {
               switch (file_ext($filename))    {
                       case 'jpg'$mime_type='image/jpeg';break;

                       case 'gif'$mime_type='image/gif';break;
                       case 'png'$mime_type='image/png';break;
                       default:;
               }
       }

                               $message=str_replace($domain.'/'.$filename,'cid:'.basename($filename),$message);

                               $filename=basename($filename);
                               $message.="--$newboundary\n";
                               $message.="Content-Type: $mime_type;\n";
                               $message.=" name=\"$filename\"\n";

                               $message.="Content-Transfer-Encoding: base64\n";
                               $message.="Content-ID: <$filename>\n";
                               $message.="Content-Disposition: inline;\n";
                               $message.=" filename=\"$filename\"\n\n";

                               $message.=chunk_split(base64_encode($file_content));
       }
       }
       $message.="--$newboundary--\n\n";
       $message.="--$baseboundary--\n";

       return mail($to$subject$message $headers);
}
?>
Не забудьте проинициализировать глобальную переменную $domain.

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

Второй вариант функции, поддерживающий отправку файлов.


<?php


/**
 * отправка письма с вложениями
 *
 * @param string $from
 * @param string $to

 * @param string $subject
 * @param string $text
 * @param string $cc
 * @param string $arr массив ассоциативных массивов с прикладываемыми файлами

 *     $arr[] = array( 
            type = тип mime,
            name = имя файла (лучше английское),
            content = содержимое файла закодированное  base64_encode() 

        )
 
 * @return unknown
 */
function multipart_mail($from$to$subject$text,$cc=null,$arr=null) {

    global $domain;
    if($domain==''$domain='http://'.$_SERVER['HTTP_HOST'];
    $headers ="From: $from\r\n";

    $headers.="To: $to\r\n";
    if (!is_null($cc))     {
      $headers.="Cc: $cc\r\n";

    }
    $headers.="Subject: $subject\r\n";
    $headers.="Date: ".date("r")."\r\n";

    $headers.="X-Mailer: zm php script\r\n";
    $headers.="MIME-Version: 1.0\r\n";
    $headers.="Content-Type: multipart/alternative;\r\n";

    $baseboundary="------------".strtoupper(md5(uniqid(rand(), true)));
    $headers.="  boundary=\"$baseboundary\"\r\n";

    $headers.="This is a multi-part message in MIME format.\r\n";
    $message="--$baseboundary\r\n";
    $message.="Content-Type: text/plain; charset=windows-1251\r\n";

    $text_plain=str_replace('<p>',"\r\n",$text);
    $text_plain=str_replace('<b>',"",$text_plain);

    $text_plain=str_replace('</b>',"",$text_plain);
    $text_plain=str_replace('<br>',"\r\n",$text_plain);

    $text_plainpreg_replace('/<a(\s+)href="([^"]+)"([^>]+)>([^<]+)/i'," \$4\n\$2",$text_plain);
    $message.=strip_tags($text_plain);

    //$message.="Content-Transfer-Encoding: 7bit\r\n\r\n";
    $message.="\r\n\r\nIts simple text. Switch to HTML view!\r\n\r\n";
    $message.="--$baseboundary\r\n";
    $newboundary="------------".strtoupper(md5(uniqid(rand(), true)));

    $message.="Content-Type: multipart/related;\r\n";
    $message.="  boundary=\"$newboundary\"\r\n\r\n\r\n";
    $message.="--$newboundary\r\n";
    $message.="Content-Type: text/html; charset=windows-1251\r\n";

    $message.="Content-Transfer-Encoding: 7bit\r\n\r\n";
    $message.=($text)."\r\n\r\n";
    preg_match_all('/img(\s+)src="([^"]+)"/i',$text,$m);

    if (isset($m[2])) {
        $img_f=$m[2];
        if (is_array($img_f)) {

            foreach ($img_f as $k => $v) {
                $img_f[$k]=str_ireplace($domain,$_SERVER['DOCUMENT_ROOT'],$v);

            }
        }
    }
    $attachment_files=$img_f;
    
   if (is_array($attachment_files)) {
      foreach($attachment_files as $filename)  {

             $file_content file_get_contents($filename,true);
        $mime_type='image/png';
        if(function_exists("mime_content_type"))  {

            $mime_type=mime_content_type($filename);    
        }
        else {
             switch (file_ext($filename))    {

                 case 'jpg'$mime_type='image/jpeg';break;
                 case 'gif'$mime_type='image/gif';break;
                 case 'png'$mime_type='image/png';break;

                 default:;
             }
        }
                $message=str_replace($domain.'/'.$filename,'cid:'.basename($filename),$message);

                $filename=basename($filename);
                $message.="--$newboundary\r\n";
                $message.="Content-Type: $mime_type;\r\n";
                $message.=" name=\"$filename\"\r\n";

                $message.="Content-Transfer-Encoding: base64\r\n";
                $message.="Content-ID: <$filename>\r\n";
                $message.="Content-Disposition: inline;\r\n";
                $message.=" filename=\"$filename\"\r\n\r\n";

                $message.=chunk_split(base64_encode($file_content));
         }
     if(!is_null($arr)){
         foreach ($arr as $v) {

             $mime_type=$v['type'];
             $filename=$v['name'];
                $message.="--$newboundary\r\n";
                $message.="Content-Type: $mime_type;\r\n";

                $message.=" name=\"$filename\"\r\n";
                $message.="Content-Transfer-Encoding: base64\r\n";
                $message.="Content-ID: <$filename>\r\n";
                $message.="Content-Disposition: inline;\r\n";

                $message.=" filename=\"$filename\"\r\n\r\n";
                $message.=chunk_split($v['content']);
             
         }
     }    

    }
    $message.="--$newboundary--\r\n\r\n";
    $message.="--$baseboundary--\r\n";
    return mail($to$subject$message $headers);

}


?>

Используйте разумно и в меру!

Автор в Google+

Реклама:

Метки: php, mail, multipart.

Комментарии:

123456789:
не хватает примера ))
zoonman@gmail.com:
будет время - напишу вам пример...
Alex Ander:
This is page Very good
Михаил:
У меня ругается на function multipart_mail($from, $to, $subject, $text,$cc=null) {


syntax error, unexpected T_VARIABLE
имя:

e-mail (не публикуется):

комментарий:

© Ткачев Филипп, 2005—2017
Программист, веб-разработка и прикладное ПО.
Все права защищены.