Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Рассылка писем с вложениями
 
 автор: mozhunt   (12.09.2008 в 12:18)   письмо автору
 
 

Народ, есть скрипт и класс для рассылки писем , который берет емайлы из текстового файла (где они просто в столбик записаны)
Но, почему-то, не отображается тело письма, если есть аттачмент. Но, когда аттачмента нет, то тело письма отображается...
В чем дело ?

Скрипт :

<?php
set_time_limit(0);
//Не забываем менять данные!
$from = "aec-pc@km.ru";
$frnm = "Валечка Носохлюпова";
$subj = "Мальчик-клаустрафоб заcтрелился шлангом (видео)";
$text = "Увеличиваем пенисы! Недорого! <a href='ya.ru'>Пыщь-пыщь!!!1111один</a>";
$path = "mailbase.txt";
$file = "computers.doc";
$ltns = 0; //задержка в секундах

require 'class.mailer.php';

//Дальше менять ничего не надо
$base = file_get_contents($path);
$base = str_replace("\r","",$base);
$arr = explode("\n", $base);

foreach ($arr as $to){
sleep($ltns);
$Message = new Mailer();
$Message->from = "$frnm <$from>";
$Message->to = $to;
$Message->subject = $subj;
$Message->text = 'Привет Вася';
$Message->Attach($file,'application/msword');
$Message->Send();
}

?>


Класс :

<?php
// Класс для отправки почтовых сообщений
class Mailer
{
var $subject; // (string) Тема
var $text; // (string) Текст сообщения (txt-вариант)
var $html; // (string) Текст сообщения (html-вариант)
var $from; // (string) От кого
var $to; // (string) Кому
var $charset; // (string) Кодировка (по умолчанию Windows-1251)

var $sHeaders; // (string)
var $sBody; // (string)
var $sContentType; // (string)
var $sHtmlTemplate; // (string)
var $sBoundary; // (string)
var $aAttaches; // (array)

// Конструктор класса
function Mailer()
{
$this->charset = 'Windows-1251';
$this->aAttaches = array();
$this->sBoundary = '----'.substr(md5(uniqid(rand(),true)),0,16);
$this->sHtmlTemplate = '<html><head><title>{title}</title></head><body>{body}</body></html>';
}

// Добавить заголовок
function DoHeader($sHeader)
{
$this->sHeaders .= $sHeader."\r\n";
}

// Прикрепить файл
function Attach($sPath,$mimeType)
{
if (file_exists($sPath))
{
$sName=basename($sPath);
$sAttach ="Content-Type: $mimeType; name=\"$sName\"\r\n";
$sAttach.="Content-Disposition: attachment; filename=\"$sName\"\r\n";
$sAttach.="Content-Transfer-Encoding: base64\r\n";
$sAttach.="\r\n";
$sAttach.=base64_encode(file_get_contents($sPath))."\r\n";
$this->aAttaches[] = $sAttach;
}
}

// Добавить HTML
function AddHtml($sHtml)
{
$this->html.=$sHtml."\r\n";
}

// Установить шаблон
function SetTemplate($sPath)
{
if (file_exists($sPath)) $this->sHtmlTemplate = file_get_contents($sPath);
}
// Отправить
function Send()
{
$iCountAtt=count($this->aAttaches);
$this->sHeaders ="From: {$this->from}\r\n";
$this->sHeaders.="MIME-Version: 1.0\r\n";
if (!$this->html && !$iCountAtt)
{
$this->sHeaders.='Content-Type: text/plain; charset='.$this->charset."\r\n";
$this->sBody = $this->text;
}
elseif ($this->html && !$iCountAtt)
{
$this->sHeaders.='Content-Type: text/html; charset='.$this->charset."\r\n";
$aFields=array();
$aFields['{title}'] = $this->subject;
$aFields['{body}'] = $this->html;
$this->sBody = strtr($this->sHtmlTemplate,$aFields);
}
elseif (!$this->html && $iCountAtt)
{
$this->sHeaders.="Content-Type: multipart/mixed; boundary=\"{$this->sBoundary}\"\r\n";
foreach ($this->aAttaches as $sAttach)
{
$this->sBody .= "--{$this->sBoundary}\r\n";
$this->sBody .= $sAttach;
}
$this->sBody .= "--{$this->sBoundary}--\r\n";
}
elseif ($this->html && $iCountAtt)
{
$this->sHeaders.="Content-Type: multipart/mixed; boundary=\"{$this->sBoundary}\"\r\n";
$this->sBody .= "--{$this->sBoundary}\r\n";
$this->sBody .= "Content-Type: text/html; charset={$this->charset}\r\n";
$this->sBody .= "Content-Transfer-Encoding: 8bit\r\n";
$this->sBody .= "\r\n";
$aFields=array();
$aFields['{title}'] = $this->subject;
$aFields['{body}'] = $this->html;
$this->sBody .= strtr($this->sHtmlTemplate,$aFields);
foreach ($this->aAttaches as $sAttach)
{
$this->sBody .= "--{$this->sBoundary}\r\n";
$this->sBody .= $sAttach;
}
$this->sBody .= "--{$this->sBoundary}--\r\n";
}
@mail($this->to, $this->subject, $this->sBody, $this->sHeaders);
}
}
?>

  Ответить  
 
 автор: sim5   (12.09.2008 в 12:24)   письмо автору
 
   для: mozhunt   (12.09.2008 в 12:18)
 

Закрывать область вложения после каждого прикрепленного файла, вот так: "--{$this->sBoundary}--\r\n";, это уже не правильно. Письмо с вложением, это иерархия, и ее нужно соблюдать. Кстати, Outlook может при некоторых сбоях отобразить что либо из этого прикрепления, а вот другие почтовые серверы нет.

  Ответить  
 
 автор: mozhunt   (12.09.2008 в 12:49)   письмо автору
 
   для: sim5   (12.09.2008 в 12:24)
 

а как тогда делать ? подскажи, плз. может у тебя есть на примете готовый скриптик ?

  Ответить  
 
 автор: sim5   (12.09.2008 в 13:06)   письмо автору
 
   для: mozhunt   (12.09.2008 в 12:49)
 

Я пользуюсь своим скриптом. Но скрипт не для прикрепленных файлов, а вложенных - для изображений с url по cid. Собственно разницы никакой нет в этом. Как правильно оформлять почтовые сообщения можете почитать в этой теме http://softtime.ru/forum/read.php?id_forum=1&id_theme=57222, в прикреплении. Там есть примеры сформированных почтовых сообщений для различных ситуаций. Достаточно их скопировать и дать расширение eml, и можете проверять отправления. Там и об остальных важных моментах оформления почтовых сообщений сказано.

  Ответить  
 
 автор: mozhunt   (12.09.2008 в 14:28)   письмо автору
 
   для: sim5   (12.09.2008 в 13:06)
 

всем спасибо, скрипт написан.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования