::: PHP.com.ua - учимся вместе. ::: ::: PHP.com.ua - учимся вместе. :::



 
   - Разработка CRM для туристического бизнес...
  - тестування по прив"язці до часу...
  - СРОЧНО! Требуется талантливый PHP програ...
  - Оплачу FLASH-сайт под ключ.
  - выборка одним запросом нескольких похожи...
  - функции верификации строк.
  - Помогите вытянуть скрипт отправки почты ...


Главная
Новости
Статьи
Шпаргалки
Файлы
О проекте
Форум
Футболки


FREEhost.com.ua - купил хостинг 10 у.е. на Begun в подарок.

iName.com.ua - регистрация доменных имен и хороший хостинг.

Библиотека программиста - нужный вам исходник или документация по необходимому для вас языку программирования.

Designclub - Клуб дизайнеров Украины.

Регистрация доменов
Хостинг

 HowtoForge.ORG.UA - Это первый Украинский ресурс развития open source программного обеспечения


Путь: Шпаргалки

Шпаргалки

Автор: - Yurik
Дата публикации - 29.07.2005
Просмотров: - 7230

Пособие по продвинутому использованию PEAR::Mail


Практически на каждом серьезном приложении или сайте есть надобность работать с почтой. Это и рассылка новостей, обновлений, объявлений подписчикам, это и служебная переписка с посетителями (активация регистрации, подтверждение заказа, напоминание или восстановление пароля, уведомления о ответе на форуме), это и уведомления для администраторов/модераторов.
Задача эта повсмеместная и актуальная, поэтому иметь хорошие инструменты для работы с почтой актуально (кто пересел из Outlook Express на TheBat! меня поймут ;)
Серьезных PHP тулзов есть две
- PHPMailer url=http://phpmailer.sourceforge.net/]http://phpmailer.sourceforge.net//url]
- Pear::Mail url=http://pear.php.net/manual/en/package.mail.mail.php]
http://pear.php.net/manual/en/package.mail.mail.php/url]

Второй вкупе с Pear::Mail_mime обеспечивает такую же функциональность, а поскольку мы используем и другие PEAR классы, то выбрать единый стиль будет разумно

Фунциональность которую должен поддерживать этот инструмент тоже нескудная. Во-первых работать с любыми видами почтовых агентов (MTA), предпочтительно SMTP, в т.ч. с авторизацией. Во вторых корректно работать с разными кодировками (кириллица в письме, теме, заголовках). В третьих работать с любыми MIME форматами (слать HTML письма, вставлять атачменты, а также делать вложенные картинки для HTML)

Приведем кусок базового класса который будет отвечать за подключение почтовых библиотек. Отметим что все настройки хранятся в *.ini файле, в т.ч. почтовые:
[code]
[mail]
mimenc        = base64
factory        = smtp    ;mail|sendmail|smtp
host        = rv.uar.net
port        = 25
auth        = false
user        = null
pass        = null
;sendmail_path    = "/usr/bin/sendmail"
;sendmail_args    = "-t -i"
localhost    = site.com.ua ;EHLO command
from        = "Администрация <office@example.com.ua>"
replyto        = "Администрация <office@example.com.ua>"
encoding    = w
encrfc        = "windows-1251"
mailer        = "MyPHP ;)"
[/code]

и сам класс (в нем упущена часть которая делает set_include_path(implode(PATH_SEPARATOR, $_inc)); где $_inc читает из конфига список папок в которых лежат библиотеки, в т.ч. PEAR):

[php]<?php
Class baseclass {
 var 
$configfile;
 var 
$pmail$pmime$mimeparam;

 function 
baseclass($_config='../config.ini'){
    
$this->configfile=$_config;
    
$this->ReadConfig();
 }

 function 
ReadConfig(){
    if(
file_exists($this->configfile))
     
$this->config=parse_ini_file($this->configfiletrue);
    else
     
$this->errH(1'Cannot find configuration file. Check <b>'.$this->configfile.'</b>'__LINE____FILE__);

    if (!isset(
$this->config['host'])) 
     
$this->errH(2'File <b>'.$this->configfile.'</b> has wrong format'__LINE____FILE__);
 }

 function 
ErrH($errno=0$msg='Error'$line=0$file='unknown'){
    @
ob_end_clean();
    
header("Content-Encoding: none");
    echo 
"<blockquote>".$msg."</blockquote>";
    echo 
"<blockquote>Error <font color=red>".$errno."</font> on line <b>";
    echo 
$line."</b> in <font color=green><b>".$file."</b></font></blockquote>";
    exit;    
 }


 function 
InitMail(){
    require_once(
'Mail.php'); 
    require_once(
'Mail/mime.php');
    
$_crlf="\r\n";
    
$this->pmime = &new Mail_mime($_crlf);
    switch (
$this->config['mail']['factory']) {
     case 
'smtp':
      if(
$this->config['mail']['auth'] && $this->config['mail']['auth']=='true')
        
$this->config['mail']['auth']=true;
      else
        
$this->config['mail']['auth']=false;
      
$_param=Array(
        
'host'        => $this->config['mail']['host'],
        
'port'        => $this->config['mail']['port'],
        
'auth'        => $this->config['mail']['auth'],
        
'username'    => $this->config['mail']['user'],
        
'password'    => $this->config['mail']['pass'],
        
'localhost'    => $this->config['mail']['localhost']
      );
      break;
     case 
'sendmail':
      
$_param=Array(
        
'sendmail_path'    => $this->config['mail']['sendmail_path'],
        
'sendmail_args'    => $this->config['mail']['sendmail_args']
      );
     break;
     default: 
$_param=Null;
    }
    
    
$this->mimeparam=Array(
     
'text_encoding'    => '7bit',
     
'html_encoding'    => $this->config['mail']['mimeenc'],
     
'7bit_wrap'        => 998,
     
'html_encoding'    => $this->config['mail']['encrfc'],
     
'text_charset'        => $this->config['mail']['encrfc'],
     
'head_charset'        => $this->config['mail']['encrfc']
    );
    
$this->pmail =& Mail::factory($this->config['mail']['factory'], $_param);
 }

}
?>
[

/php]

и пример вызова этого класса

[php]
<?php
require_once('../base.php');
if (!
class_exists('BaseClass')) die('BaseClass not found');
$b=&new BaseClass('config.ini');

$b->InitMail();

$text 'Добрый день уважемый'
$html '<html><body>Добрый день уважемый <img src=foto.jpg></body></html>';
$file='../prices/price.zip';
$img='../images/foto.jpg'
$b->pmime->setTXTBody($text);
$b->pmime->setHTMLBody($html);
$b->mime->addAttachment($file'application/octet-stream');
$b->mime->addHTMLImage ($img'image/jpeg');

$_rcpt=Array( // может получаться из БД например
"Кислов" => "kislov@ua.fm",
"Техотдел" => "tech@uar.net",
"Светлана Никифоровна" => "info@client.com",
)

$rcpt=Array();
foreach (
$_rcpt as $name=>$mail$rcpt[]=$name.' <'.$mail.'>';
$rcpt=implode(','$rcpt);

$hdrs = array( 
    
'From'    => $b->config['mail']['from'], 
    
'Reply-To'    => $b->config['mail']['replyto'], 
    
'X-Confirm-Reading-To'        => $b->config['mail']['replyto'], 
    
'Disposition-Notification-To'    => $b->config['mail']['replyto'], 
    
'Return-Receipt-To'    => $b->config['mail']['replyto'], 
    
'X-Mailer'    => $b->config['mail']['mailer'], 
    
'X-Priority'            => "3 (Normal)",
    
'X-MSMail-Priority'        => "Normal",
    
'Subject' => 'Уважаемый клиент...',
    
'Bcc' => $rcpt,
    );

$body=$b->pmime->get($b->mimeparam);
$hdrs=$b->pmime->headers($hdrs);

$status=$b->pmail->send('manager@example.com.ua'$hdrs$body);
if (
PEAR::isError($status)) { 
      
$b->errH(1"ERROR sending mail"__LINE____FILE__); 
}
echo 
"Done";
?>
[

/php]

Что у нас получилось:
Послали через smtp (поменять тип или включить авторизацию - в config.ini) письмо с полями From: Reply-To: с текстовым сообщением, HTML атачментом в котором вложена фотография, атачментом с прайсом. Как в полях From: To: так и в теме и теле письма применяли windows-1251 кодировку. Атачменты и кирилицу в заголовках кодировали с помощью base64 (можно поменять на quoted-printable в config.ini)
Рассылку сделали в скрытое поле Bcc: целому списку клиентов $_rcpt
Установили уведомление о доставке и о прочтении, установили нормальный приоритет письма (3) и название почтового агента. При отсылке через smtp установили свой хост через команду EHLO (вместо дефолтного localhost).



Обсудить в ФОРУМе - комментариев ()


Путь: Шпаргалки

Если вы заметили орфографическую, стилистическую или другую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Контакты Design by webFaction Ukrainian PHP Group 2004-2005