Эта тема на forum.dklab.ru


Антон Макаренко: Отправка писем с аттачментами (пример)
На ваш суд представляю работающий класс для отправки email с аттачментами по протоколу SMTP.

Свежие исходники лежат внизу топика. Эти удалены.
Дмитрий Котеров:
Есть 2 совершенно различные и непересекающиеся задачи:
1. Построение тела письма с аттачментами.
2. Отправка письма напрямую через SMTP-сервер.

В первый пункт входят такие возможности, как:
- формирования HTML-писем с возможностью ссылок на прикрепленные картинки (локальные CID, если не ошибаюсь);
- различные перекодировки;
- квотинг русских букв.

Зачем объединять задачи 1 и 2 в один класс, я лично не понимаю. Более того, я считаю, что это делать ВРЕДНО: например, захочу я отправить письмо с аттачментом через стандартную функцию mail(), и что буду иметь? Вроде бы код для этого есть, но он вынуждает пользоваться SMTP-сервером.
Антон Макаренко:
Написан этот класс был из-за безысходности. На моём хостинге в упор не хотят отправляться письма с помощью функции mail(), а админ не способен настроить сервер.
Дмитрий Котеров
Что Вы имеете в виду под пунктом "различные перекодировки"? Объясните подробнее, пожалуйста.
Дмитрий Котеров:
Ну, например, хотите Вы отправить письмо в KOI, а у Вас на сервере кодировка - win1251. Чтобы не пришлось в программе отдельно перекодировать From, To, Subject и т.д. - всем этим должна заниматься функция формирования письма.
Константин Жинько [tIT]:
На моём хостинге в упор не хотят отправляться письма с помощью функции mail()

$ su root
password:
# sendmail -bd
# exit
$

Оно?
Антон Макаренко:
Решил переделать в соответствии с вышеизложенными требованиями. Теперь задачи разделены и повышена функциональность.

В классе для работы с SMTP я добавил задержку в одну секунду после отправления команды серверу. Причиной этому послужили случаи, когда из-за проблем с сетью команды "выплёвывались" в сокет и в результате создавалась неправильная последовательность. Я думаю, что эту проблему можно решить и другим путём -- как-либо "синхронизировать" сокет, чтоли. Если у кого-то есть идеи, подскажите пожалуйста.

Затем был пересмотрен, переписан и переименован класс "SmtpMailer".
Полный список функциональных возможностей:
1) Установка типа и кодировки текста сообщения. Например, типы text/plain, text/html; кодировки iso-8859-1, utf-8 и т.д
2) Добавление заголовков в письмо
3) Перекодировка заголовков письма и текстовой части сообщения (используется php_iconv). Например, когда в скрипт данные поступили в кодировке windows-1251, а вам нужно отправить письмо в koi8-r.
4) Прикрепление файлов в виде аттачментов к письму. Достаточно указать каталог, имя файла и его mime-type. Имя файла следует указывать отдельно, поскольку это требует протокол SMTP.
5) Построение тела письма. Можно получить тело письма в виде строки, чтоб, например, отправить его с помощью mail()
6) Отправка письма через SMTP-сервер. Поддерживается аутентификация SMTP ("AUTH LOGIN"). Я лично использую эту функцию, поскольку не знаю, как отправлять через mail() с аутентификацией (один из хостингов под управлением Micro$oft Window$).

Свежие исходники лежат внизу топика. Эти удалены.

Вроде бы всё необходимое есть. Ещё бы поработать над отказоустойчивостью и можно смело использовать. Как вы считаете?
Anonymous:
Aнтон Mакáренко, простите за вопрос, а чем этот класс лучше phpmailer.sourceforge.net ? По объему кода лучше, это само по себе хорошо, а в остальном?
Антон Макаренко:
Ничем он не лучше. Писáл я его для себя, не зная о существовании phpmailer.sourceforge.net.
Кстати, в классе для работы с SMTP phpmailer.sourceforge.net проблема "синхронизации" сокета решена частично:
# sometimes the SMTP server takes a little longer to respond
# so we will give it a longer timeout for the first read
// Windows still does not have support for this timeout function
if(substr(PHP_OS, 0, 3) != "WIN")
socket_set_timeout($this->smtp_conn, $tval, 0);
// например, у меня хостинг Виндовый. Письма отправляться не будут... Что делать?

Так что вопрос всё ещё остаётся открытым. Помогите разобраться, пожалуйста!
Антон Макаренко:
- Решена проблема "выплёвывания" команд в сокет. Программа успешно протестирована на тормознутом соединении. Теперь скорость отправки письма зависит только от быстродействия сети
- Метод send() слушает и анализирует ответы сервера. Возвращает false при ошибке или результат disconnect() при успешном выполнении всех команд
Спасибо Дмитрию Котерову -- подсказал, где поискать как считывать ответ сервера

Свежие исходники лежат внизу топика. Эти удалены.

Пример использования
<?php
require('smtp.class.php');
$letter=new Mailman('Hello, World!','text/plain','windows-1251');
// or:
// $letter=new Mailman('<h1>Hello, World!</h1>','text/html','windows-1251');

$letter->addHeader('Subject: A test message');
$letter->changeEncoding('ISO-8859-1');

// You may want to attach some files:
// $letter->attach('file1.gif');
// $letter->attach('file2.zip');

// You may want to fetch the letter body. For example, to send it via mail() function:
echo $letter->fetchLetterBody();

// Or to send it via SMTP-server:
if (false===$letter->send('smtp.host','from@domain.com','to@domain.com','login','password'))
echo 'Error: no letter has been sent!';
?>
CTAPbIu_MABP:

if (false!==$letter->send('smtp.host','from@domain.com','to@domain.com','login','password'))
echo 'Error: no letter has been sent!';


скажите, а насколько корректно так писать? я имею ввиду что обычно пишут


if ($letter->send('smtp.host','from@domain.com','to@domain.com','login','password')===FALSE)
echo 'Error: no letter has been sent!';


или я чегото в этой жизни не понимаю (с)
Maus:
CTAPbIu_MABP
Первый вариант упомниается, имхо, в PEAR-стандарте кодирования (точнее, в статье в PHP Inside, посященной этому вопросу). Запись константы слева от "==" позволяет избежать опечатки: "=" вместо "==".
а насчет того, когда возвращать false - путсь автор отвечает. Я бы, например, предпочёл "false != .." - сюда подпадает и 0, и "", а это, кажется "Unix way"
Антон Макаренко:
Допустил опечатку, извините. Уже поправил.
kost88:
Maus

Первый вариант упомниается, имхо, в PEAR-стандарте кодирования (точнее, в статье в PHP Inside, посященной этому вопросу). Запись константы слева от "==" позволяет избежать опечатки: "=" вместо "==".
а насчет того, когда возвращать false - путсь автор отвечает. Я бы, например, предпочёл "false != .." - сюда подпадает и 0, и "", а это, кажется "Unix way"


Если не ошибаюсь, Zend Studio выдает ворнинги на выражения типа if ($a = 1).
Maus:
kost88
Zend Studio != PHP
Anonymous:
Антон Макаренко
Вы не подскажете, где тестировали класс во время его написания. Я тоже хочу сделать у своего класса поддержку smtp, но у меня нет smtp сервера.
Тарас Леонидович:
Гость
Извините, что вмешиваюсь, а что собственно вам мешает поставить почтовый сервер на своей машине. Я пользуюсь в случае необходимости Corier mail server + Денвер (надо же где-то скрипты запускать), дистрибутив весит около 500 Кб в настройках разобраться не сложно.
Ну а если вы работаете под Linux то у вас в распоряжении sendmail, postfix или qmail.
Антон Макаренко:
Гость
Класс тестировался на работающих хостингах:
FreeBSD + Apache 1.3 + php 4.3.x module + SMTP (не sendmail)
Win2003 + Apache 1.3 + php 4.4.x CGI, SMTP-сервер удалённо (очень даже удалённо, с большими тормозами)

Если Вы действительно хотите использовать, отпишитесь. Выложу апдейт, который будет кодировать некоторые заголовки в base64.
Кодирование заголовков (subject, from, to и тому подобных) нужно для корректного отображения символов из наборов не latin1 (вечная проблема форумов phpbb и самопальных систем рассылки). AFAIK, PhpMailer не кодирует заголовки.
Anonymous:
Антон Макаренко
Выложте, пригодиться!
Anonymous:
Как работать спамом
Владимир23:
Подскажите, как в
http://phpmailer.sourceforge.net/
устанавливать русскую кодировку (например charset=windows-1251).
Все мои потуги вписать что-то в переменную $ContentType закончились ничем.
Антон Макаренко:
Весь вышепреведенный код устарел и поэтому был удален. Выкладываю код, развивающий первоначальную идею в виде продукта, претендующего на статус полезного.

Mailman
Библиотека предназначена для удобного составления и организации надежной отправки писем с аттачами или без.
В отличие от PHPMailer-а, умеет:
1) правильно кодировать заголовки (поддерживаются плейсхолдеры при их составлении)
2) отправлять письма по SMTP с использованием AUTH CRAM-MD5

Класс Letter
Составляет письмо с заголовками, сообщением и аттачами.
Лепит из всех этих составляющих тело письма.

Envelope (наследует Letter)
API к наиболее часто используемым заголовкам: from, to, subject, reply-to, cc, bcc
Самостоятельно определяет всех получателей, интеллектуально составляет тело письма на основании родительских методов.
Есть инструмент для создания закодированных заголовков. Поддерживает плейсхолдеры.

SMTP_Socket
Инструмент для коннекта к SMTP-серверу и выполнения на нем команд.
Анализирует коды ответа сервера в каждой команде и сопоставляет с указанным набором.
Может сохранять лог протокола

Mailman
"Фабрика"
Утилита для составления писем, построения их в очередь и отправки указанным способом.
Постоянно держит наготове объект-письмо-конверт, куда можно пихать сообщения, заголовки, аттачи.
Можно текущее письмо поместить в очередь и при этом создать новое.
Можно всю очередь писем отправить в 1 соединение с SMTP-сервером. Это происходит так:
1) создает соединение, пытается пройти аутентификацию, если указаны логин+пароль
1.1) аутентификация происходит в порядке "AUTH CRAM-MD5", "AUTH LOGIN"
2) пытается отправить каждое письмо из очереди. При этом отправленные удаляются из очереди
3) возвращает количество отправленных писем (очередь неотправленных при этом остается)

Пример отправки 1 простейшего письма

<?php
$m=new Mailman();
$m->letter->add_to('addr@domain.com');
$m->letter->set_from('addr2@domain2.com');
$m->letter->set_subject('Превед');
$m->letter->set_message('Идет Медвед по лесу...');
if ($m->send_via_smtp('smtp.mail.ru', 'preved', 'medved'))
echo 'ok';
else
echo 'Not ok';
?>


Пример отправки письма с кучей заголовков и 2 аттачами

<?php
// создается очередь и 1 письмо в кодировке UTF-8
$queue = new Mailman();

$queue->letter->add_to('address_1@abc.com');
$queue->letter->add_to('address_2@xyz.net', 'Имя получателя');
// так же работают методы add_cc, add_bcc
$queue->letter->set_from('your@address.com', 'Ваше имя');
$queue->letter->set_reply_to('something@foobar.com', 'Еще какое-нить имя');
// простое текстовое сообщение
$queue->letter->set_message('бу-бу-бу');
/* // а можно и HTML-код
$html_code='...';
$queue->letter->set_message($html_code, text/html, 'windows-1251');
*/
// можно приаттачить файл, можно содержимое
$queue->letter->attach($path_to_file);
$queue->letter->attach($file_contents, 'application/rtf', '1.rtf');
// или добавить какой-нибудь заголовок
$queue->letter->add_header($queue->letter->base64_placeholders(
'X-Mailer: #?#', 'Типа почтовый клиент.'));
// можно просто сформировать и получить тело письма
$ltr=$queue->letter->fetch();

// а так письма можно попытаться отправить в любой момент
// последнее письмо не нужно отправлять в очередь
$queue->send_via_smtp('an.smtp.host');
?>

p.s. примеры предназначены для беглого ознакомления. На практике рекомендую заглянуть в исходники, прежде чем пытаться отправить письмо.
WingedFox:
Антон Макаренко
Пара вопросов:
1. Умеет класс автоматически создавать multipart (HTML+text) письма? Если умеет - в чьём формате?
2. В каком формате (если есть) хранятся внедрённые картинки для HTML писем?
Антон Макаренко:
1.
Сейчас есть возможность отправлять сообщение только в одном из форматов, mime-type которого указывается при вызове set_message().
При построении присьма если нет аттачей, тело составляется не-multipart.
Если же аттачи есть, составляется multipart-письмо, где сообщение и все кусочки кодируются в base64. В таком случае у письма получается примерно такая структура:

MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="blablabla"

--blablabla
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: base64

<сообщение, закодированное в base64>

--blablabla
Content-Type: image/jpeg; name="attachment.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="attachment.jpg"

<приаттаченный файл, закодированный в base64>
--blablabla--

В принципе, можно будет добавить метод, например add_alternative_message(). И при составлении письма если будут несколько кусков-сообщений, то составлялось бы multipart-письмо.


2.
До внедрения картинок пока руки не дошли. Да и про форматы внедряемых объектов я пока не читал. Подскажете, где?
WingedFox:
Антон Макаренко
Сейчас не подскажу, надо поднять архивы. Вообще, надо читать соотв. RFC =)
Но дело в том, что есть, как минимум 2 варианта составления multipart сообщений: стандартный и аутлуковский.
С картинками - ещё хуже, я когда писал надстройку над PEAR::Mail_mime, нашел 4 разных формата: Outlook, Eudora, GoldMine, стандартный.

Правда это было примерно полтора года назад, возможно что сейчас уже легче...
На всякий случай, советую настроиться серьёзно, если будете сие реализовывать 8*)
bæv:
В своё время скрипт электронных открыток переделывал — чтоб отсылалась сама открытка, а не ссылка на неё.
Использовал класс 'MIME E-mail message sending' с phpclasses.org (нужна регистрация).
Anonymous:
Не работает класс на php5.
Антон Макаренко:
Гость
Какая именно функция не работает? Покажите сообщения об ошибках.

У меня на хостинге PHP 5.1.6 -- работает.
coerbi:
Ламерский вопрос, а как вообще работать с аттачментами (какую литературу, то есть почитать)?
Юрий Насретдинов:
coerbi
Удалил ненужное форматирование, почитайте пожалуйста, как надо правильно оформлять посты (http://forum.dklab.ru/about/todo/PravilaEtogoForuma-ProchitayteObyazatelno.html).
как вообще работать с аттачментами (какую литературу, то есть почитать)?
Я думаю, вполне достаточно будет прочитать сообщение выше - http://forum.dklab.ru/viewtopic.php?p=121250#121250 , и разобраться, как это работает. Чаще всего это оказывается наиболее эффективный способ, намного эффективнее прочтения каких-либо книжек.
Антон Макаренко:
Update.

Класс Envelope
- в письмо автоматически дописываются заголовки Date, Message-Id, если их не установили раньше соответствующими методами
- добавлены методы set_date(), set_message_id()

Класс Mailman
- из конструктора удален необязательный последний параметр $helo
- в метод send_via_smtp() необязятельным четвертым параметром добавлен $helo ($port и $timeout стали пятым и 6м соответственно)
- если $helo не указан, скрипт пытается установить приемлемый HELO автоматически

Эти улучшения помогут соблюдать формат письма согласно RFC 2822 - некоторые (а может и многие, не знаю) SMTP-сервера отклоняют письма, нарушающие стандарт.
Что такое HELO и каким он должен быть, жаждущим расскажет гугл.

Простейший пример использования с новыми параметрами:
<?php
require('mail/letter.class.php');
require('mail/envelope.class.php');
require('mail/smtp_socket.class.php');
require('mail/mailman.class.php');

$m = new Mailman();
$m->verbose = true;
$m->letter->set_from('from@example.com', 'From name');
$m->letter->add_to('to@example.com', 'To name');
$m->letter->set_subject('Test subject');
$m->letter->set_message("Test message");
$m->queue_letter();
$m->send_via_smtp('smtp.example.com', 'smtp_login', 'smtp_password', 'machine_hostname_or_ip');
echo $m->get_log();
?>
SnakeMFK:
Внимательно прочитал тему и похожие на данном форуме, но никак не могу заставить работать класс... вернее заставить работать скрипт на сервере, постоянно получаю "smtp_socket::connect() Error 111: Connection refused"... причом локально на денвере скрипт с теми же настройками(smtp,login,pass) прекрасно соединяется и отсылает все, что нужно ><
Антон Макаренко:
SnakeMFK
Исходники в студию. Будем разбирать.

Просьба к модераторам отделить "разборки" в новую ветку. Если в результате будет найден баг в сабже, то потом выложу новую версию сюда.
schegloff:
Здравствуйте!
Не работает отправка почты. Библиотека скачана самая новая, PHP 5.2.1.


$text="Здравствуйте!";
$headers1="Content-type: text/html; charset=Windows-1251 \n";
$headers3="Subject: ".stripslashes("Регистрация")." \n";
$m=new Mailman();
$m->letter->add_to($mail);
$m->letter->set_from('*******');
$m->letter->set_message($text, 'text/html', 'Windows-1251');
$m->letter->add_header($headers1);
$m->letter->add_header($headers3);
if ($m->send_via_smtp('*****', '*****', '*****'))
echo '';
else
echo 'Not ok!';

выводит "not ok", хотя для тех же данных версия 0.4 выполняет отправку с хостинга с php 4
Антон Макаренко:
schegloff
Попробуйте посмотреть лог разговора с сервером:

$m=new Mailman();
$m->verbose = true;
// ...
$m->send_via_smtp(/*...*/);
echo $m->get_log(true);
exit;


Если до отправки дело не доходит, значит не построилось письмо.
Чтобы проверить, построилось ли, добавьте перед отправкой:

var_dump($m->queue_letter());
print_r($m);
exit;

Письмо может не построиться, если что-то не так с заголовками
Нарек:
Люди где можно этот класс MailMan скачать?
Maus:
Нарек
попробуйте прочесть тему с начала
Slik:
чет не получается отправить через gmail (порти вродь всюда поменял, там нестандартние)
кому нить получалось ?
Антон Макаренко:
Slik
О возможностях дебага - два поста назад: http://forum.dklab.ru/viewtopic.php?p=138858#138858
Воспользуйтесь ими - посмотрите лог SMTP. Если хотите, чтобы Вам помогли, выкладывайте этот лог (и другую нужную по Вашему мнению информацию).
Антон Макаренко:
Выкладываю пример работающего, проверенного скрипта (+ необходимые библиотеки) отправки письма с аттачами.

send_me.php - там в начале конфигурация константами. Надо все заполнить.
В SMTP_HELO надо написать PTR или хотя бы IP-адрес компьютера, с которого отправляешь.

letter_subject.txt - тема письма

letter_message.txt - сообщение. Там поддерживаются переменные {field_0}, {field_1} и так далее.

Везде кодировка UTF-8.

Требования: PHP5, short_tags=On
Поддерживается аутентификация только CRAM-MD5 и LOGIN

PTR определяется так:

tracert 72.14.207.99

В ответ видим:
Tracing route to eh-in-f99.google.com [72.14.207.99] over a maximum of 30 hops:

"eh-in-f99.google.com" - это PTR.


Тут сам скрипт, остальное в аттаче.
<?php
// UTF-8
// define config variables
define('BASE_DIR', dirname(__FILE__));
define('LIBS_DIR', BASE_DIR . '/lib');

define('SMTP_HOST', '');
define('SMTP_HELO', '');
define('SMTP_LOGIN', '');
define('SMTP_PASSWORD', '');

define('SMTP_MAIL_FROM', '');
define('DEFAULT_LETTER_TO', '');

$fields = array(
'Поле1'
,'Поле2'
,'Поле3'
,'Поле4'
,'Поле5'
,'Поле6'
,'Поле7'
);

// initialize autoload funcs
function __autoload($class_name)
{
require_once LIBS_DIR . '/' . strtolower($class_name) . '.class.php';
}

$error_message = '';
$result_message = '';

// process input
if (isset($_POST['send']))
{
try
{
$input = array();
foreach (array_keys($fields) as $k)
$input['field_' . $k] = @trim($_POST['field_' . $k]);

$input['to'] = DEFAULT_LETTER_TO;

// upload a file
$attachment = array();
if ((!empty($_FILES['attachment'])) && (UPLOAD_ERR_NO_FILE !== $_FILES['attachment']['error']))
{
if (UPLOAD_ERR_OK !== $_FILES['attachment']['error'])
throw new Exception('Ошибка загрузки файла.');
foreach ($_FILES['attachment'] as $k => $value)
$attachment[$k] = $value;
$attachment['name'] = preg_replace('/^(.*?)(.[a-z0-9]+)?$/i', 'attachment\\2', $attachment['name']);
}

// obtain subject and message template
$subject = @file_get_contents(BASE_DIR . '/letter_subject.txt');
if (empty($subject))
throw new Exception('Тема письма не загружена.');
$message = @file_get_contents(BASE_DIR . '/letter_message.txt');
if (empty($message))
throw new Exception('Не загружен шаблон письма.');

// parse message template
$txtemplate = new Txt_Template();
$txtemplate->assign($input);
$message = $txtemplate->parse_template($message);

// try to send the letter
$m = new Mailman();
$m->verbose = true;
$m->letter->set_from(SMTP_MAIL_FROM);
$m->letter->add_to(empty($input['to']) ? DEFAULT_LETTER_TO : $input['to']);
$m->letter->set_subject($subject);
$m->letter->set_message($message, 'text/plain');
$m->letter->set_message_id(microtime(true) . '@' . array_pop(explode('@', SMTP_MAIL_FROM, 2)));
if ($attachment)
$m->letter->attach_file($attachment['tmp_name'], $attachment['type'], $attachment['name']);
if (!$m->send_via_smtp(SMTP_HOST, SMTP_LOGIN, SMTP_PASSWORD, SMTP_HOST))
throw new Exception('Не удалось отправить письмо.');

$result_message = 'Письмо отправлено.';
}
catch (Exception $e)
{
$error_message = $e->getMessage();
}
}

// prepare template
function _esc($value)
{
return htmlspecialchars($value, ENT_QUOTES);
}

function _default()
{
$args = func_get_args();
if (!empty($args))
foreach ($args as $arg)
{
$arg = @trim($arg);
if (!empty($arg))
return $arg;
}
return '';
}

error_reporting(E_ALL & ~E_NOTICE);
header('Content-type: text/html; charset=UTF-8');

// template
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<title>Conforming XHTML 1.0 Transitional Template</title>
<style type="text/css">
* {
font-size:100.1%;
font-family:sans-serif;
padding:0;
margin:0;
}
body {
color:black;
background:white;
font-size:84%;
padding:1em;
}
p {
margin:0.5em 0;
}
td {
text-align:right;
vertical-align:top;
}
#error_message {
color:red;
font-size:2em;
}
#result_message {
color:#0c0;
font-size:2em;
}
</style>
</head>

<body>

<?
if (!empty($error_message))
{
?>
<p id="error_message"><?=$error_message?></p>
<?
}
?>

<?
if (!empty($result_message))
{
?>
<p id="result_message"><?=$result_message?></p>
<?
}
?>

<form method="post" action="" enctype="multipart/form-data">
<table>
<?
foreach ($fields as $k => $f)
{
?>
<tr>
<td><?=$f?>:</td>
<td><input type="text" name="field_<?=$k?>" size="75" value="<?=_esc($_POST['field_' . $k])?>" /></td>
</tr>
<?
}
?>
</table>
<p><input type="file" name="attachment" size="75" /></p>
<p><input type="submit" name="send" value="Отправить" /></p>
</form>

</body>

</html>

markers:
Пользуюсь вашим замечательным скриптом, но возникла проблема, почему-то шлёт два письма (копии)...
$mailer = new Mailman("windows-1251");
$mailer->verbose = true;
$mailer->letter->set_from("php@xxx.ru", "скрипт");
$mailer->letter->add_to("markers@xxx.ru", "ffff");
$mailer->letter->set_reply_to("markers@xxx.ru", "-");
$mailer->letter->set_subject("Привет!");
$message = mail_head_page("");
$message.= "<center>Здраствуй\n";
$message.= mail_head_page("");
$mailer->letter->set_message($message, 'text/html');
$mailer->letter->set_message_id(microtime(true) . '@' . array_pop(explode('@', "robot@xxx.ru", 2)));
// if ($attachment)
// $m->letter->attach_file($attachment['tmp_name'], $attachment['type'], $attachment['name']);
if (!$mailer->send_via_smtp("ххх", "ххх", "ххх"))
{
$mailer->get_log(True);
die('Не удалось отправить письмо.');
}
else
{
$mailer->get_log(True);
die('Письмо отправлено.');
}

Заранее спасибо!
markers:
По поводу предедущего поста, похоже косяки не скрипта.... по крайней мере по логам.
Ещё, пришлось немного усовершенствовать скрипт, чтобы была возможность использовать аттачмент в HTML, например картинки
Правки в файле: letter.class.php

/**
* Attach a file by local path or URL
*
* To load attachment by URL, the php.ini "allow_url_fopen" should be enabled
*
* @param string $filename_or_url
* @param string $mime_type
* @param string $attached_filename
* @return bool
*/
function attach_file($filename_or_url, $mime_type='application/octet-stream', $attached_filename=null, ->$ShowInHtml=False)
{
$contents=@file_get_contents($filename_or_url);
if (empty($contents))
return false;
if (empty($attached_filename))
$attached_filename=basename($filename_or_url);
return $this->attach_contents($contents, $mime_type, $attached_filename, ->$ShowInHtml);
}

/**
* Attach contents to the letter
*
* @param string $contents
* @param string $mime_type
* @param string $attached_filename
* @return bool
*/
function attach_contents($contents, $mime_type, $attached_filename, ->$ShowInHtml=False)
{
$contents=@(string)$contents;
if (empty($contents))
return false;
$attached_filename=@trim($attached_filename);
if (empty($attached_filename))
return false;
$attach=
"Content-Type: $mime_type; name=\"$attached_filename\"\r\n".
->($ShowInHtml ? "Content-ID: <$attached_filename>\r\n" : "").
"Content-Transfer-Encoding: base64\r\n".
"Content-Disposition: attachment; filename =\"$attached_filename\"\r\n\r\n".
chunk_split(base64_encode($contents));
// repeating attachments filenames will be replaced
$this->attachments[$attached_filename]=$attach;
return true;
}

Использование:
Вложение:
$mailer->letter->attach_file("img.gif", "image/gif","img.gif", True);
В теле сообщения:
<img src="cid:img.gif">
Если нужно вложить простое вложение (без использования его в HTML)
$mailer->letter->attach_file("1.txt", "text/plain","1.txt", False);
Антон Макаренко:
По секрету скажу, что сам пользуюсь куда более развитой версией библиотеки (она написана уже только для php5). Пока еще не решаюсь ее выложить, потестировать хочу.

В теле сообщения
В таком случае content-disposition надо указывать "inline".
markers:
Антон Макаренко
Вообще да, но как показала практина и без неё пашет :)
Недоученый:
Не долетают письма до директории \tmp\!sendmail что не так в скрипте???
<html>
<body BACKGROUND=fon.jpg>
<div align=center>
<?php
if ((empty($_GET['surnameuser'])) || (empty($_GET['nameuser'])) || (empty($_GET['otchestvo'])) || (empty($_GET['city'])) || (empty($_GET['street']))|| (empty($_GET['home'])) || (empty($_GET['room']))) /*здесь должна была быть реализована проверка на заполненность всех полей, но почему то получается бред. Возможно ошибки в "И" или в "ИЛИ".*/{
echo('<font color=gray><h1>Заполните заявку на заказ:</font></h1>');
}else{
$subject = "Заказ от ".$_GET['surnameuser']." ".$_GET['nameuser']." ".$_GET['otchestvo'];
$msg .= $_GET['surnameuser']."\n";#слепляем сообщение из переменных переданных с помощью метода POST
$msg .= $_GET['nameuser']."\n";#$_GET['имя поля в хтмл которое задается параметром name'];
$msg .= $_GET['otchestvo']."\n";#точка после переменной в присваивании делает слепление данных переменной и простого текста
$msg .= $_GET['city']."\n";
$msg .= $_GET['street']."\n";
$msg .= $_GET['home']."\n";
$msg .= $_GET['room']."\n";
$msg .= $_GET['additional']."\n";
echo ("<font color=gray>Your message is:<br>".$msg);
echo ("<font color=gray><h2><p><p>Спасибо! Ваш заказ будет рассмотрен<br> в близжайшее время нашими операторам!</font></h2>");
exit(1);
mail("tj1@yandex.ru", $subject, $msg, join("\r\n", array("From: tj1@yandex.ru","Reply-to:tj1@yandex.ru","Content-type: text/plain;charset=windows-1251","X-Mailer: PHP/".phpversion())));#собственной персоной - функция mail() с доп параметрами
}
?>
<br><font color=gray>
<FORM action="mailer.php" method="get" name="second">
<li>Фамилия<INPUT type= "text" name="surnameuser" maxlength="40" size="20" value=""><p>
<li>Имя<INPUT type= "text" name="nameuser" maxlength="40" size="20" value=""><p>
<li>Отчество<INPUT type= "text" name="otchestvo" maxlength="40" size="20" value=""><p>
<li>Город<INPUT type= "text" name="city" maxlength="40" size="20" value=""><p>
<li>Улица<INPUT type= "text" name="street" maxlength="40" size="20" value=""><p>
<li>Дом<INPUT type= "text" name="home" maxlength="40" size="20" value=""><p>
<li>Квартира<INPUT type= "text" name="room" maxlength="40" size="20" value=""><p>
Номера заказываемых CD(введите через запятую):<BR>
<TEXTAREA name="additional" cols="40" rows="5">
</TEXTAREA><p>
<INPUT type="submit" value=">>Отправить<<">
</FORM>
</body>
</html>
Maus:
exit(1);
?

и будьте любезны оформлять код - тут есть все средства для этого
Недоученый:
Ой спасибо вам большое!
bæv:
Ветка выделена в отдельную тему «кросспостинг»,
расположенную в форуме Мусоропровод (01 Июля 2009, 19:34).
bæv:
Ветка выделена в отдельную тему «мусор»,
расположенную в форуме Мусоропровод (02 Июля 2009, 06:20).
Samin2345:
https://betawardss.com
https://betawardss.com

Эта тема на forum.dklab.ru