|
 |
Путь: Шпаргалки
Шпаргалки
Автор: - 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->configfile, true);
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.
|
|