Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Отправка писем с аттачментами (пример) (Антон Макаренко, оценка: 8)
Goto page 1, 2  Next
Author Message
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Thu Jun 30, 2005 6:16 pm (написано за 6 минут 53 секунды)
   Post subject: Отправка писем с аттачментами (пример)
Reply with quote

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

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

Last edited by Антон Макаренко on Thu Dec 27, 2007 11:15 pm; edited 3 times in total
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Sun Jul 03, 2005 1:25 pm (спустя 2 дня 19 часов 9 минут; написано за 2 минуты 40 секунд)
   Post subject:
Reply with quote

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

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

Зачем объединять задачи 1 и 2 в один класс, я лично не понимаю. Более того, я считаю, что это делать ВРЕДНО: например, захочу я отправить письмо с аттачментом через стандартную функцию mail(), и что буду иметь? Вроде бы код для этого есть, но он вынуждает пользоваться SMTP-сервером.
Back to top
View user's profile Send private message Send e-mail
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Mon Jul 04, 2005 9:46 am (спустя 20 часов 20 минут; написано за 5 минут 57 секунд)
   Post subject:
Reply with quote

Написан этот класс был из-за безысходности. На моём хостинге в упор не хотят отправляться письма с помощью функции mail(), а админ не способен настроить сервер.
Дмитрий Котеров
Что Вы имеете в виду под пунктом "различные перекодировки"? Объясните подробнее, пожалуйста.
Back to top
View user's profile Send private message Send e-mail
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 412
   поощрить/наказать


PostPosted: Mon Jul 04, 2005 2:29 pm (спустя 4 часа 43 минуты; написано за 56 секунд)
   Post subject:
Reply with quote

Ну, например, хотите Вы отправить письмо в KOI, а у Вас на сервере кодировка - win1251. Чтобы не пришлось в программе отдельно перекодировать From, To, Subject и т.д. - всем этим должна заниматься функция формирования письма.
Back to top
View user's profile Send private message Send e-mail
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 105
   поощрить/наказать

Location: Москва

PostPosted: Mon Jul 18, 2005 6:59 pm (спустя 14 дней 4 часа 29 минут; написано за 2 минуты 49 секунд)
   Post subject:
Reply with quote

Aнтон Mакаренко wrote:
На моём хостинге в упор не хотят отправляться письма с помощью функции mail()
Code (any language): скопировать код в буфер обмена
$ su root
password:
# sendmail -bd
# exit
$
Оно?
Back to top
View user's profile Send private message
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Thu Oct 27, 2005 2:42 pm (спустя 3 месяца 8 дней 19 часов 43 минуты; написано за 21 минуту 41 секунду)
   Post subject:
Reply with quote

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

В классе для работы с 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$).

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

Вроде бы всё необходимое есть. Ещё бы поработать над отказоустойчивостью и можно смело использовать. Как вы считаете?

Last edited by Антон Макаренко on Thu Oct 12, 2006 12:07 am; edited 1 time in total
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 387
   поощрить/наказать


PostPosted: Fri Nov 04, 2005 1:19 pm (спустя 7 дней 22 часа 36 минут; написано за 52 секунды)
   Post subject:
Reply with quote

Aнтон Mакáренко, простите за вопрос, а чем этот класс лучше phpmailer.sourceforge.net ? По объему кода лучше, это само по себе хорошо, а в остальном?
Back to top
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Tue Nov 08, 2005 11:38 am (спустя 3 дня 22 часа 19 минут; написано за 4 минуты 41 секунду)
   Post subject:
Reply with quote

Ничем он не лучше. Писáл я его для себя, не зная о существовании phpmailer.sourceforge.net.
Кстати, в классе для работы с SMTP phpmailer.sourceforge.net проблема "синхронизации" сокета решена частично:
Code (php): скопировать код в буфер обмена
        # 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 (www.php.net/substr)(PHP_OS, 0, 3) != "WIN")
           socket_set_timeout (www.php.net/socket_set_timeout)($this->smtp_conn, $tval, 0);
        //
 
Так что вопрос всё ещё остаётся открытым. Помогите разобраться, пожалуйста!
Back to top
View user's profile Send private message Send e-mail
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Mon Nov 21, 2005 1:37 pm (спустя 13 дней 1 час 58 минут; написано за 8 минут 22 секунды)
   Post subject:
Reply with quote

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

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

Пример использования
Code (php): скопировать код в буфер обмена
<?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 (www.php.net/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 (www.php.net/echo) 'Error: no letter has been sent!';
?>


Last edited by Антон Макаренко on Thu Oct 12, 2006 12:06 am; edited 2 times in total
Back to top
View user's profile Send private message Send e-mail
CTAPbIu_MABP
Участник форума



Joined: 20 Feb 2006
Posts: 32
Карма: -4
   поощрить/наказать


PostPosted: Mon Feb 20, 2006 6:35 pm (спустя 2 месяца 29 дней 4 часа 58 минут; написано за 1 минуту 23 секунды)
   Post subject:
Reply with quote

Code (php): скопировать код в буфер обмена
if (false!==$letter->send('smtp.host','from@domain.com','to@domain.com','login','password'))
        echo (www.php.net/echo) 'Error: no letter has been sent!';
скажите, а насколько корректно так писать? я имею ввиду что обычно пишут
Code (php): скопировать код в буфер обмена
if ($letter->send('smtp.host','from@domain.com','to@domain.com','login','password')===FALSE)
        echo (www.php.net/echo) 'Error: no letter has been sent!';
или я чегото в этой жизни не понимаю (с)
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 270
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Mon Feb 20, 2006 7:50 pm (спустя 1 час 14 минут; написано за 6 минут 37 секунд)
   Post subject:
Reply with quote

CTAPbIu_MABP
Первый вариант упомниается, имхо, в PEAR-стандарте кодирования (точнее, в статье в PHP Inside, посященной этому вопросу). Запись константы слева от "==" позволяет избежать опечатки: "=" вместо "==".
а насчет того, когда возвращать false - путсь автор отвечает. Я бы, например, предпочёл "false != .." - сюда подпадает и 0, и "", а это, кажется "Unix way"
Back to top
View user's profile Send private message
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Mon Feb 27, 2006 9:54 am (спустя 6 дней 14 часов 3 минуты; написано за 31 секунду)
   Post subject:
Reply with quote

Допустил опечатку, извините. Уже поправил.
Back to top
View user's profile Send private message Send e-mail
kost88
Заглянувший



Joined: 04 Mar 2006
Posts: 3
Карма: 0
   поощрить/наказать

Location: Kiev, Ukraine

PostPosted: Sat Mar 04, 2006 2:26 pm (спустя 5 дней 4 часа 31 минуту; написано за 52 секунды)
   Post subject:
Reply with quote

Maus
Quote:
Первый вариант упомниается, имхо, в PEAR-стандарте кодирования (точнее, в статье в PHP Inside, посященной этому вопросу). Запись константы слева от "==" позволяет избежать опечатки: "=" вместо "==".
а насчет того, когда возвращать false - путсь автор отвечает. Я бы, например, предпочёл "false != .." - сюда подпадает и 0, и "", а это, кажется "Unix way"
Если не ошибаюсь, Zend Studio выдает ворнинги на выражения типа if ($a = 1).
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 270
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Sat Mar 04, 2006 11:38 pm (спустя 9 часов 12 минут; написано за 1 минуту 42 секунды)
   Post subject:
Reply with quote

kost88
Zend Studio != PHP
Back to top
View user's profile Send private message
Guest






Карма: 387
   поощрить/наказать


PostPosted: Mon Mar 06, 2006 1:33 am (спустя 1 день 1 час 54 минуты; написано за 3 минуты 22 секунды)
   Post subject:
Reply with quote

Антон Макаренко
Вы не подскажете, где тестировали класс во время его написания. Я тоже хочу сделать у своего класса поддержку smtp, но у меня нет smtp сервера.
Back to top
Тарас Леонидович
Заглянувший



Joined: 04 Mar 2006
Posts: 2
Карма: 0
   поощрить/наказать

Location: Украина, Кременчуг

PostPosted: Mon Mar 06, 2006 11:27 pm (спустя 21 час 54 минуты; написано за 5 секунд)
   Post subject:
Reply with quote

Гость
Извините, что вмешиваюсь, а что собственно вам мешает поставить почтовый сервер на своей машине. Я пользуюсь в случае необходимости Corier mail server + Денвер (надо же где-то скрипты запускать), дистрибутив весит около 500 Кб в настройках разобраться не сложно.
Ну а если вы работаете под Linux то у вас в распоряжении sendmail, postfix или qmail.
Back to top
View user's profile Send private message Send e-mail
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Tue Mar 07, 2006 10:46 am (спустя 11 часов 18 минут; написано за 7 минут 30 секунд)
   Post subject:
Reply with quote

Гость
Класс тестировался на работающих хостингах:
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 не кодирует заголовки.
Back to top
View user's profile Send private message Send e-mail
Guest






Карма: 387
   поощрить/наказать


PostPosted: Thu Apr 27, 2006 2:07 pm (спустя 1 месяц 20 дней 3 часа 20 минут; написано за 19 секунд)
   Post subject:
Reply with quote

Антон Макаренко
Выложте, пригодиться!
Back to top
Guest






Карма: 387
   поощрить/наказать


PostPosted: Thu Jun 08, 2006 7:31 pm (спустя 1 месяц 11 дней 5 часов 24 минуты; написано за 11 секунд)
   Post subject:
Reply with quote

Как работать спамом
Back to top
Владимир23
Guest





Карма: 387
   поощрить/наказать


PostPosted: Thu Aug 24, 2006 9:23 am (спустя 2 месяца 15 дней 13 часов 52 минуты; написано за 1 минуту 4 секунды)
   Post subject:
Reply with quote

Подскажите, как в
phpmailer.sourceforge.net/
устанавливать русскую кодировку (например charset=windows-1251).
Все мои потуги вписать что-то в переменную $ContentType закончились ничем.
Back to top
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Thu Oct 12, 2006 12:04 am (спустя 1 месяц 18 дней 14 часов 40 минут; написано за 11 минут 38 секунд)
   Post subject:
Reply with quote

Весь вышепреведенный код устарел и поэтому был удален. Выкладываю код, развивающий первоначальную идею в виде продукта, претендующего на статус полезного.

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 простейшего письма
Code (php): скопировать код в буфер обмена
<?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 (www.php.net/echo) 'ok';
else
        echo (www.php.net/echo) 'Not ok';
?>
Пример отправки письма с кучей заголовков и 2 аттачами
Code (php): скопировать код в буфер обмена
<?php
//
$queue = new Mailman();

$queue->letter->add_to('address_1@abc.com');
$queue->letter->add_to('address_2@xyz.net', ' ');
//
$queue->letter->set_from('your@address.com', ' ');
$queue->letter->set_reply_to('something@foobar.com', ' - ');
//
$queue->letter->set_message('--');
/*
//
$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. примеры предназначены для беглого ознакомления. На практике рекомендую заглянуть в исходники, прежде чем пытаться отправить письмо.


mailman.zip
 Description:
Letter v1.5
Envelope v0.4
Smtp_socket v1.3
Mailman v0.7
12.10.2006

Download
 Filename:  mailman.zip
 Filesize:  9.85 KB
 Downloaded:  1192 Time(s)

Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Thu Oct 12, 2006 12:56 am (спустя 52 минуты; написано за 1 минуту 48 секунд)
   Post subject:
Reply with quote

Антон Макаренко
Пара вопросов:
1. Умеет класс автоматически создавать multipart (HTML+text) письма? Если умеет - в чьём формате?
2. В каком формате (если есть) хранятся внедрённые картинки для HTML писем?
Back to top
View user's profile Send private message
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Thu Oct 12, 2006 11:58 am (спустя 11 часов 1 минуту; написано за 12 минут 40 секунд)
   Post subject:
Reply with quote

1.
Сейчас есть возможность отправлять сообщение только в одном из форматов, mime-type которого указывается при вызове set_message().
При построении присьма если нет аттачей, тело составляется не-multipart.
Если же аттачи есть, составляется multipart-письмо, где сообщение и все кусочки кодируются в base64. В таком случае у письма получается примерно такая структура:
Code (any language): скопировать код в буфер обмена
В принципе, можно будет добавить метод, например add_alternative_message(). И при составлении письма если будут несколько кусков-сообщений, то составлялось бы multipart-письмо.


2.
До внедрения картинок пока руки не дошли. Да и про форматы внедряемых объектов я пока не читал. Подскажете, где?
Back to top
View user's profile Send private message Send e-mail
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 269
   поощрить/наказать

Location: Питер

PostPosted: Thu Oct 12, 2006 12:46 pm (спустя 48 минут; написано за 4 минуты 17 секунд)
   Post subject:
Reply with quote

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

Правда это было примерно полтора года назад, возможно что сейчас уже легче...
На всякий случай, советую настроиться серьёзно, если будете сие реализовывать 8*)
Back to top
View user's profile Send private message
bæv
Модератор «Дзена»



Joined: 27 Aug 2003
Posts: 7275
Карма: 9993
   поощрить/наказать


PostPosted: Thu Oct 12, 2006 2:05 pm (спустя 1 час 19 минут; написано за 2 минуты 2 секунды)
   Post subject:
Reply with quote

В своё время скрипт электронных открыток переделывал — чтоб отсылалась сама открытка, а не ссылка на неё.
Использовал класс 'MIME E-mail message sending' с phpclasses.org (нужна регистрация).
Back to top
View user's profile Send private message
Guest






Карма: 387
   поощрить/наказать


PostPosted: Thu Oct 19, 2006 10:38 am (спустя 6 дней 20 часов 32 минуты; написано за 12 секунд)
   Post subject:
Reply with quote

Не работает класс на php5.
Back to top
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Sun Oct 22, 2006 1:10 pm (спустя 3 дня 2 часа 32 минуты; написано за 53 секунды)
   Post subject:
Reply with quote

Гость
Какая именно функция не работает? Покажите сообщения об ошибках.

У меня на хостинге PHP 5.1.6 -- работает.
Back to top
View user's profile Send private message Send e-mail
coerbi
Заглянувший



Joined: 24 Dec 2006
Posts: 19
Карма: -2
   поощрить/наказать


PostPosted: Tue Jan 02, 2007 9:03 pm (спустя 2 месяца 11 дней 7 часов 52 минуты; написано за 3 минуты 17 секунд)
   Post subject:
Reply with quote

Ламерский вопрос, а как вообще работать с аттачментами (какую литературу, то есть почитать)?
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 196
   поощрить/наказать

Location: 007 495

PostPosted: Tue Jan 02, 2007 9:09 pm (спустя 5 минут; написано за 1 минуту 36 секунд)
   Post subject:
Reply with quote

coerbi
Удалил ненужное форматирование, почитайте пожалуйста, как надо правильно оформлять посты (forum.dklab.ru/about/todo/PravilaEtogoForuma-ProchitayteObyazatelno.html).
coerbi wrote:
как вообще работать с аттачментами (какую литературу, то есть почитать)?
Я думаю, вполне достаточно будет прочитать сообщение выше - forum.dklab.ru/viewtopic.php?p=121250#121250 , и разобраться, как это работает. Чаще всего это оказывается наиболее эффективный способ, намного эффективнее прочтения каких-либо книжек.
Back to top
View user's profile Send private message Send e-mail
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Tue Mar 20, 2007 2:31 pm (спустя 2 месяца 17 дней 17 часов 22 минуты; написано за 9 минут 34 секунды)
   Post subject:
Reply with quote

Update.

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

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

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

Простейший пример использования с новыми параметрами:
Code (php): скопировать код в буфер обмена
<?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 (www.php.net/echo) $m->get_log();
?>



mailman.zip
 Description:
2007.03.27 - исправлена автоматическая генерация ID сообщения: оказывается, на PHP4 uniqid() без параметров возвращает пустой результат.

Download
 Filename:  mailman.zip
 Filesize:  6.64 KB
 Downloaded:  1004 Time(s)



Last edited by Антон Макаренко on Tue Mar 27, 2007 10:35 am; edited 1 time in total
Back to top
View user's profile Send private message Send e-mail
SnakeMFK
Заглянувший



Joined: 21 Apr 2006
Posts: 4
Карма: 0
   поощрить/наказать


PostPosted: Sun Mar 25, 2007 6:10 pm (спустя 5 дней 3 часа 39 минут; написано за 2 минуты 12 секунд)
   Post subject:
Reply with quote

Внимательно прочитал тему и похожие на данном форуме, но никак не могу заставить работать класс... вернее заставить работать скрипт на сервере, постоянно получаю "smtp_socket::connect() Error 111: Connection refused"... причом локально на денвере скрипт с теми же настройками(smtp,login,pass) прекрасно соединяется и отсылает все, что нужно ><
Back to top
View user's profile Send private message
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Tue Mar 27, 2007 7:06 pm (спустя 2 дня 55 минут; написано за 2 минуты 27 секунд)
   Post subject:
Reply with quote

SnakeMFK
Исходники в студию. Будем разбирать.

Просьба к модераторам отделить "разборки" в новую ветку. Если в результате будет найден баг в сабже, то потом выложу новую версию сюда.
Back to top
View user's profile Send private message Send e-mail
schegloff
Заглянувший



Joined: 25 Jul 2007
Posts: 2
Карма: 0
   поощрить/наказать


PostPosted: Wed Jul 25, 2007 3:34 pm (спустя 3 месяца 28 дней 20 часов 28 минут; написано за 2 минуты 56 секунд)
   Post subject:
Reply with quote

Здравствуйте!
Не работает отправка почты. Библиотека скачана самая новая, PHP 5.2.1.
Code (php): скопировать код в буфер обмена
$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 (www.php.net/echo) '';
                                else
                                        echo (www.php.net/echo) 'Not ok!';
выводит "not ok", хотя для тех же данных версия 0.4 выполняет отправку с хостинга с php 4
Back to top
View user's profile Send private message
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Wed Jul 25, 2007 4:36 pm (спустя 1 час 1 минуту; написано за 3 минуты 51 секунду)
   Post subject:
Reply with quote

schegloff
Попробуйте посмотреть лог разговора с сервером:
Code (php): скопировать код в буфер обмена
$m=new Mailman();
$m->verbose = true;
// ...
$m->send_via_smtp(/*...*/);
echo (www.php.net/echo) $m->get_log(true);
exit (www.php.net/exit);
Если до отправки дело не доходит, значит не построилось письмо.
Чтобы проверить, построилось ли, добавьте перед отправкой:
Code (php): скопировать код в буфер обмена
var_dump (www.php.net/var_dump)($m->queue_letter());
print_r (www.php.net/print_r)($m);
exit (www.php.net/exit);
Письмо может не построиться, если что-то не так с заголовками
Back to top
View user's profile Send private message Send e-mail
Нарек
Заглянувший



Joined: 27 Jul 2007
Posts: 1
Карма: 0
   поощрить/наказать

Location: Армения

PostPosted: Fri Jul 27, 2007 3:31 pm (спустя 1 день 22 часа 54 минуты; написано за 29 секунд)
   Post subject:
Reply with quote

Люди где можно этот класс MailMan скачать?
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 270
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Fri Jul 27, 2007 3:47 pm (спустя 16 минут; написано за 17 секунд)
   Post subject:
Reply with quote

Нарек
попробуйте прочесть тему с начала
Back to top
View user's profile Send private message
Slik
Guest





Карма: 387
   поощрить/наказать


PostPosted: Sun Sep 16, 2007 6:10 pm (спустя 1 месяц 20 дней 2 часа 22 минуты; написано за 1 минуту 40 секунд)
   Post subject:
Reply with quote

чет не получается отправить через gmail (порти вродь всюда поменял, там нестандартние)
кому нить получалось ?
Back to top
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Sun Sep 16, 2007 10:30 pm (спустя 4 часа 19 минут; написано за 2 минуты 37 секунд)
   Post subject:
Reply with quote

Slik
О возможностях дебага - два поста назад: forum.dklab.ru/viewtopic.php?p=138858#138858
Воспользуйтесь ими - посмотрите лог SMTP. Если хотите, чтобы Вам помогли, выкладывайте этот лог (и другую нужную по Вашему мнению информацию).
Back to top
View user's profile Send private message Send e-mail
Антон Макаренко
Участник форума



Joined: 05 Feb 2004
Posts: 374
Карма: 31
   поощрить/наказать

Location: Киев

PostPosted: Thu Dec 27, 2007 11:14 pm (спустя 3 месяца 11 дней 44 минуты; написано за 4 минуты 21 секунду)
   Post subject:
Reply with quote

Выкладываю пример работающего, проверенного скрипта (+ необходимые библиотеки) отправки письма с аттачами.
Quote:
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
Quote:
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.
Тут сам скрипт, остальное в аттаче.
Code (php): скопировать код в буфер обмена
<?php
// UTF-8
// define config variables
define (www.php.net/define)('BASE_DIR', dirname (www.php.net/dirname)(__FILE__));
define (www.php.net/define)('LIBS_DIR', BASE_DIR . '/lib');

define (www.php.net/define)('SMTP_HOST',      '');
define (www.php.net/define)('SMTP_HELO',      '');
define (www.php.net/define)('SMTP_LOGIN',     '');
define (www.php.net/define)('SMTP_PASSWORD''');

define (www.php.net/define)('SMTP_MAIL_FROM', '');
define (www.php.net/define)('DEFAULT_LETTER_TO', '');

$fields = array (www.php.net/array)(
     '1'
    ,'2'
    ,'3'
    ,'4'
    ,'5'
    ,'6'
    ,'7'
);

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

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

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

        $input['to'] = DEFAULT_LETTER_TO;

        // upload a file
        $attachment = array (www.php.net/array)();
        if ((!empty (www.php.net/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 (www.php.net/preg_replace)('/^(.*?)(.[a-z0-9]+)?$/i', 'attachment\\2', $attachment['name']);
        }

        // obtain subject and message template
        $subject = @file_get_contents (www.php.net/file_get_contents)(BASE_DIR . '/letter_subject.txt');
        if (empty (www.php.net/empty)($subject))
            throw new Exception('   .');
        $message = @file_get_contents (www.php.net/file_get_contents)(BASE_DIR . '/letter_message.txt');
        if (empty (www.php.net/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 (www.php.net/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 (www.php.net/microtime)(true) . '@' . array_pop (www.php.net/array_pop)(explode (www.php.net/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 (www.php.net/func_get_args)();
    if (!empty (www.php.net/empty)($args))
        foreach ($args as $arg)
        {
            $arg = @trim (www.php.net/trim)($arg);
            if (!empty (www.php.net/empty)($arg))
                return $arg;
        }
    return '';
}

error_reporting (www.php.net/error_reporting)(E_ALL & ~E_NOTICE);
header (www.php.net/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 (www.php.net/empty)($error_message))
{
?>
<p id="error_message"><?=$error_message?></p>
<?
}
?>

<?
if (!empty (www.php.net/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>



email_with_attachments.zip
 Description:
Отправка писем с аттачментами (пример).

Download
 Filename:  email_with_attachments.zip
 Filesize:  10.72 KB
 Downloaded:  918 Time(s)

Back to top
View user's profile Send private message Send e-mail
markers
Guest





Карма: 387
   поощрить/наказать


PostPosted: Wed Feb 13, 2008 7:19 pm (спустя 1 месяц 16 дней 20 часов 4 минуты; написано за 2 минуты 58 секунд)
   Post subject:
Reply with quote

Пользуюсь вашим замечательным скриптом, но возникла проблема, почему-то шлёт два письма (копии)...
Code (php): скопировать код в буфер обмена
$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 (www.php.net/microtime)(true) . '@' . array_pop (www.php.net/array_pop)(explode (www.php.net/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 (www.php.net/die)('   .');
  }
 else
  {
   $mailer->get_log(True);
   die (www.php.net/die)(' .');
  }
Заранее спасибо!
Back to top
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Goto page 1, 2  Next
Page 1 of 2    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML