Отправляет email-рассылки с помощью сервиса Sendsay

Интернет обучение

  Все выпуски  

Интернет обучение ВЫПУСК №1


Информационный Канал Subscribe.Ru

Фирма InterKurs предлагает пройти обучение по следующим языкам программирования:
PHP
HTML
PERL
C++
DELPHI
PASCAL
и многим другим.
Проводим консультации, выполняем заказы на написание программ,
Помогаем найти информацию, нужные вам книги.
Форма обучения - заочная (через интернет). По вопросам обращаться по адресу:
interkurs@yandex.ru

В этом выпуске:
I Отправка почты средствами Delphi.

II Отправка почты средствами PHP:
1.      Стандартная функция mail;
2.      Отправление письма c вложением (attachment).


I Отправка почты средствами Delphi.

Отправка и прием почты реализуются при помощи Delphi довольно просто. Для отправки
почты нам понадобится компонент idSMTP со страницы Indy Clients палитры компонентов
Delphi.

Этот компонент реализует все необходимое для отправки электронной почты по протоколу
SMTP (Simple Mail Transfer Protocol - простой протокол передачи почты), использующий
25 порт, по которому посылаются команды и текст письма. Этапы отправки электронной
почты следующие:

1) соединение с SMTP сервером по 25 порту;
2) подготовка тела письма, определение отправителя и получателя письма;
3) отправка письма на SMTP сервер;

Разместив на форме компонент idSMTP, займёмся его настройкой. Настройку порта
можно произвести в инспекторе объектов, установив свойство Port в значение 25,
или в коде программы сделать то же самое:

IdSMTP1.Port:=   25;

Соединение с сервером

Для соединения с SMTP сервером, который будет осуществлять отправку нашей почты,
нужно указать его URL, для сервера mail.ru это производится следующим образом
:

IdSMTP1.Host :=   'smtp.mail.ru';

Соединение с сервером производится методом Connect:

procedure Connect(const ATimeout: Integer); override;

где ATimeout - необязательный параметр, задает максимальное время в миллисекундах
ожидания ответа с SMTP сервера, по истечении которого попытка установить соединение
прекращается.
Например,

IdSMTP1.Connect(5000);

Если при соединении с сервером требуется авторизация, то значение свойства AuthenticationType
нужно установить в atLogin, при этом в инспекторе объектов также нужно определить
свойства Username(имя пользователя. К примеру, Username почтового ящика delphi@mail.ru
- delphi) и Password(пароль на ящик), или сделать то же программно:

IdSMTP1.AuthenticationType:=   atLogin;
IdSMTP1.Username:=   'delphi';
IdSMTP1.Password:=   'something';

Если авторизация не требуется, то свойство AuthenticationType в инспекторе объектов
нужно установить в atNone, либо сделать это программно:

IdSMTP1.AuthenticationType:=   atNone;

После применения метода Connect, нужно анализировать логическое свойство Connected,
которое в случае удачного соединения устанавливается в True. После этого при
помощи метода Send можно отправлять сообщение:

if Connected = True then IdSMTP1.Send(Msg);

Структура письма

Метод Send отправляет тело сообщения, представляющего собой структуру типа TIdMessage;

Структура письма реализуется в Delphi отдельным компонентом TIdMessage, расположенным
на палитре компонентов Indy Misc и выглядит следующим образом

TidMessage Структура TIdMessage определяется следующим образом:

var
   Msg:   TIdMessage;
begin
   Msg.Subject:=   'тема сообщения';    //текст темы сообщения
   Msg.Recipients.EMailAddresses:=   'bogdanwe@mail.ru';//указываем адрес   
                                //получателя
   Msg.From.Adress:= 'delphi@mail.ru';   //указываем автора письма
   Msg.Body.Text:= 'текст сообщения';   //размещаем текст сообщения
   Msg.Date:=StrToDate('01.12.2004');   //дата отправки письма может быть любой
end;

С темой сообщения, я думаю, все понятно. Свойство

property Recipients:   TIdEmailAddressList;

определяет получателя или получателей электронного письма. Свойством EMailAddresses,
имеющего синтаксис:

property EMailAddresses:   String;

конкретно определяются названия электронных учетных записей, которым адресуется
письмо. Названия должны указываться через разделитель вида "," то есть через
запятую. Например:

Msg.Recipients.EMailAddresses:=   'bogdanwe@mail.ru,delphi7@mail.ru';

Свойство From представляет собой объект типа TIdEmailAddressItem и содержит информацию
о отправителе письма и в свою очередь включает в себя три свойства - Name, Address,
Text.

Свойство Address содержит информацию о электронном ящике отправителя:

property Address:   string;

например,

Msg.From.Address:=   'delphi@mail.ru';

Свойство Name представляет собой имя отправителя:

property Name:   string;

например,

Msg.From.Name:=   'Антон Камолов';

Свойство Text содержит информацию обоих свойств. Тело письма представляет собой
объект типа TStrings:

property Body:   TStrings;

Присоединяем к письму аттачмент

Если вам нужно отправить с письмом файл, т.е. аттачмент, то для этого нужно создать
объект класса TidAttachment. Для этого применяется следующий конструктор:

constructor Create(Collection: TIdMessageParts; const AFileName: TFileName =
'');  reintroduce;

где Collection - объект класса TIdMessageParts, представляющее собой коллекцию
приложений к электронному письму.
контстанта AFileName типа TFileName - представляет собой обычную текстовую строку
с указанием правильного пути к файлу, например "C:\file.zip", по умолчанию имеет
значение ''.
Таким образом, продолжая наш пример, строкой вида

TIdAttachment.Create(Msg.MessageParts,'c:\file.zip');

мы заполняем свойство MessageParts объекта Msg информацией о аттачменте.

Теперь наша структура письма содержит информацию о аттачменте. После отправки
сообщения нужно разорвать соединение с сервером, чтобы оно не "висело". Это производится
методом Disconnect:

IdSMTP1.Disconnect;


II Отправка почты средствами PHP.

1.      Стандартная функция mail.

Самый простой способ отправить письмо при помощи PHP - воспользоваться стандартной
функцией mail. Она имеет следующий синтаксис: 

bool mail ( string to, string subject, string message [, string additional_headers
[, string additional_parameters]]) 

Обязательные параметры: 
E-mail получателя 
Заголовок письма 
Текст письма 

Необязательные параметры: 
Дополнительные заголовки письма 
Дополнительные параметры командной строки 

Возвращаемое значение:: 
true, если письмо было принято к доставке 
false, в противном случае. 

Простейший пример ее использования выглядит так: 

joecool@example.com", "My Subject", "Line 1\nLine 2\nLine 3"); 
?> 

Если у Вас на экране появилась ошибка "Fatal error: Call to undefined function:
mail()", это значит, что либо PHP собран без поддержки функции mail, либо она
запрещена настройками сервера. Такая практика в последнее время широко распространена
на бесплатных хостинговых серверах. Если Вы столкнулись с такой проблемой, воспользуйтесь
возможностью отправки писем при помощи сокетов (sockets), детально описанной
в разделе "альтернативные способы отправки писем". В случае, если Вы администратор
системы, обратитесь
к разделу "Как настроить сервер" и попробуйте устранить эту проблему как таковую.


Дополнительные заголовки письма (additional headers) могут использоваться для
указания кодировки письма, адреса отправителя, обратного адреса и множества других
опций. Они должны быть разделены переводом строк: комбинацией "\r\n". Например,
так: 

nobody@example.com", "the subject", $message, 
"From: webmaster@ example.com \r\n" 
 ."X-Mailer: PHP/" . phpversion()); 
?> 


Перейдем к более сложному примеру. Предыдущие скрипты работали с форматом text/plain,
теперь же попробуем отправить почту в формате HTML нескольким адресатам с указанием
кодировки: 

mary@example.com>, " ; 
$to .= "Kelly <kelly@example.com>"; 

$subject = "Birthday Reminders for August"; 

$message = ' 
 
 
 

Here are the birthdays upcoming in August!

'; $headers = "Content-type: text/html; charset=windows-1251 \r\n"; $headers .= "From: Birthday Reminder <birthday@example.com>\r\n"; $headers .= "Bcc: birthday-archive@example.com\r\n"; mail($to, $subject, $message, $headers); ?> Комментарии к примеру: вначале мы определяем, кому адресовано письмо. Если получателей несколько, их адреса указываются в одной строке и разделяются запятыми. При задании заголовка и тела письма следите, чтобы кодировка, в которой они действительно написаны, совпадала с заявленной в заголовке charset. В нашем примере переменная $headers состоит из четырех строк: в первых двух мы указываем тип отправляемого письма - HTML - и его кодировку. В следующих двух строках мы указываем адрес отправителя и адрес, по которому следует отправить скрытую копию письма. Одна из часто возникающих проблем при отправке почты в koi8 - это формирование заголовка письма. Для ее решения необходимо воспользоваться следующим кодом, который переводит строку в кодировке win-1251 в понятный большинству почтовых клиентов koi8 заголовок. К примеру, заголовок "Почтовое уведомление" будет выглядеть как =?koi8-r?B?8M/e1M/Xz8Ug1dfFxM/NzMXOycU=?= Если Вы все сделали правильно, а получатель письмо не получает (помните, что временные издержки на доставку письма зависят от многих факторов и могут колебаться от нескольких минут до нескольких часов), убедитесь в том, что оно действительно отправилось. Это необходимо сделать в 2 этапа. Вначале попробуйте выполнить код: nobody@example.com", "the subject", "Example message", "From: webmaster@example.com \r\n")) { echo "messege acepted for delivery"; } else { echo "some error happen"; } ?> В случае если уже на этом шаге Вы получили ошибку, это может означать, что у Вас либо не запущен sendmail (или другой транспортный агент), либо он неправильно настроен, либо существуют ошибки в php.ini. К примеру, в последнее время распространено правило не принимать письма, в которых не указан правильный заголовок Mail-from. В случае, если сообщение было принято к отправке, попробуйте посмотреть файл /var/log/mail или попросить об этом Вашего администратора, так как для этого требуются права суперюзера (root). Это можно сделать при помощи команды tail /var/log/mail. В случае успешной отправки письма в log-файле должны появится строки нижеприведенного типа либо сообщение об ошибке: Oct 2 00:21:02 l72 sendmail[131]: h91LL1DG000131: to=root, ctladdr=root (0/0), delay=00:00:01, xdelay=00:00:01, mailer=relay, pri=30225, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (h91LL1g1000134 Message accepted for delivery) Oct 2 00:21:18 l72 sendmail[137]: h91LL1g1000134: to=, ctladdr= (0/0), delay=00:00:17, xdelay=00:00:16, mailer=local, pri=30774, dsn=2.0.0, stat=Sent 2. Отправление письма c вложением (attachment). С такой задачей сталкивалось огромнейшее количество разработчиков и, как следствие, существует огромнейшее количество готовых решений. Большинство из них содержит различного рода ошибки, реализовывает не всю функциональность или сложны в применении. Но самый весомый минус - подавляющая масса разработчиков после написания класса, отвечающего его личным потребностям сегодняшнего дня, никогда более не возвращаются к поддержке и доработке исходных кодов. В связи с этим дальнейшие примеры кода будут базироваться на готовом решении, взятом из PEAR (репозиторий приложений и модулей PHP). Пакет, который будет использован в примерах, называется Mail_Mime. Скачать последнюю версию пакета и получить исчерпывающую документацию можно по адресу http://pear.php.net/package/Mail_Mime. Рассмотрим пример его использования: HTML version of email'; $file = '/home/richard/example.php'; $crlf = "\r\n"; $hdrs = array( 'From' => 'you@yourdomain.com', 'Subject' => 'Test mime message' ); $mime = new Mail_mime($crlf); $mime->setTXTBody($text); $mime->setHTMLBody($html); $mime->addAttachment($file, 'text/plain'); $body = $mime->get(); $hdrs = $mime->headers($hdrs); $mail =& Mail::factory('mail'); $mail->send('postmaster@localhost', $hdrs, $body); ?> Приведенный код довольно понятен, но все же несколько слов о нем. Переменная $mime является экземпляром класса Mail_mime. В его конструктор мы передали необязательный параметр, определяющий, какой именно перевод строки будет использован: "\n" или "\r\n". Данный класс предназначен для формирования тела и заголовков отправляемого письма. При помощи метода setTXTBody мы определяем текстовую часть письма. В качестве параметра метод принимает строку или имя файла, который будет использован. Аналогично при помощи метода setHTMLBody мы задаем содержимое HTML-версии письма. Рассмотрим метод addAttachment подробнее. Принимаемые параметры: string $data Полный путь к прикрепляемому файлу на сервере либо его содержимое. Обязательный параметр. string $c_type Значение заголовка Сontent-type, который будет отправлен. Необязательный параметр, значение по умолчанию - application/octet-stream. string $name Имя прикрепляемого файла. Будет использован только в случае, если первый параметр ($data) является содержимым файла. boolean $isfile Определяет, является ли первый параметр путем к файлу. Необязательный параметр, значение по умолчанию - true. string $encoding Значение заголовка Content-Transfer-Encoding, определяющего формат, в котором будет отправлено приложение. Необязательный параметр. Допустимые значения: base64 (используется для двоичных файлов), quoted-printable(используется для текстовых файлов). Значение по умолчанию: base64. Таким образом, есть два способа применения данного метода. указывая путь к файлу на сервере: $mime->addAttachment('/home/user/report.txt', 'text/plain'); указывая содержимое файла (в таком случае третий и четвертый параметры необходимо указывать принудительно): $mime->addAttachment($contentFile, 'text/plain', 'report.txt', false); Переходим к формированию заголовка и тела письма. Это все еще обязанности экземпляра класса Mail_mime. Для формирования тела письма применяется метод get, который в качестве необязательного параметра принимает ассоциативный массив. Ключами могут выступать следующие значения: text_encoding, html_encoding, 7bit_wrap, text_charset, html_charset. Для формирования заголовков используется метод headers. В качестве необязательного параметра принимает хеш-массив. Для более детального ознакомления с допустимыми значениями данного параметра обратитесь к RFC-822. Вызов метода get() должен осуществиться до того, как будет вызван метод headers(). Убедитесь, что в Вашем коде это условие соблюдено. Сам процесс отправки уже сформированного письма возложен на класс Mail. Вначале необходимо при помощи статического вызова метода factory создать экземпляр данного класса. В нашем примере он принимает единственный параметр - строку 'mail'. Более детально принимаемые параметры и их значения описаны ниже в статье, где описываются альтернативные способы отправки почты. Процесс отправки почты завершается вызовом метода send, принимающего в качестве входящего параметра список адресатов, заголовки письма и его тело. Проверку на ошибки, во время отправки письма, можно реализовать используя следующий код: send('user@your.domain.com', $headers, 'your message'); if (PEAR::isError($status)) { print("*ERROR"); } ?>

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.inkur
Архив рассылки
Отписаться
Вспомнить пароль

В избранное