субота, 25 вересня 2010 р.

PHP Альтернативные способы отправки писем

На сегодняшний день распространены следующие способы отправки писем из php-скриптов:

  • Посредством вызова функции mail
  • Непосредственно вызовом sendmail-а
  • При помощи сокетов
  • Используя COM-объект

Первые три способа реализованы в классе PEAR::Mail, о котором было рассказано ранее. Экземпляр этого класса должен создаваться посредством статического вызова метода factory (так называемый "паттерн фабрика"). Первый параметр метода определяет способ отправки письма, он может принимать одно из следующих значений: mail, sendmail, smtp. Второй параметр - массив, содержание которого зависит от значения первого параметра:

  • Значение 'mail' - отправка при помощи вызова стандартной функции, дополнительные параметры отсутствуют
  • Значение 'sendmail' - отправка непосредственно вызовом sendmail-а. Доступные дополнительные параметры:
    • sendmail_path - путь к программе на сервере;
    • sendmail_args - дополнительные параметры для командной строки.
  • Значение 'smtp' - отправка почты при помощи сокетов. Доступные дополнительные параметры:
    • host - IP адрес или доменное имя сервера, на котором запущен почтовый транспортый агент, готовый принимать почту, например localhost (для локального сервера) или mxs.mail.ru (для публичного сервера);
    • port - порт на котором он запущен, как правило 25-тый;
    • auth - логическое значение, которое указывает на необходимость SMTP авторизации, значение по умолчанию - false;
    • username - используется только при наличии SMTP авторизации, логин на сервере;
    • password - используется только при наличии SMTP авторизации, пароль на сервере.

Пример использования класса PEAR::Mail

<?php
  $mail =& Mail::factory('smtp', array('host' => 'localhost', 'port' => 25)); 
  $mail->send('postmaster@localhost', $hdrs, $body); 
?>

В приложении к данной статье приведены примеры исходных кодов, реализовывающие все перечисленные способы отправки почты без применения класса PEAR::Mail.

Примеры исходных кодов

1 Отправка писем с вложениями

<?php
function XMail( $from, $to, $subj, $text, $filename) { 
    $f         = fopen($filename,"rb"); 
    $un        = strtoupper(uniqid(time())); 
    $head      = "From: $from\n"; 
    $head     .= "To: $to\n"; 
    $head     .= "Subject: $subj\n"; 
    $head     .= "X-Mailer: PHPMail Tool\n"; 
    $head     .= "Reply-To: $from\n"; 
    $head     .= "Mime-Version: 1.0\n"; 
    $head     .= "Content-Type:multipart/mixed;"; 
    $head     .= "boundary=\"----------".$un."\"\n\n"; 
    $zag       = "------------".$un."\nContent-Type:text/html;\n"; 
    $zag      .= "Content-Transfer-Encoding: 8bit\n\n$text\n\n"; 
    $zag      .= "------------".$un."\n"; 
    $zag      .= "Content-Type: application/octet-stream;"; 
    $zag      .= "name=\"".basename($filename)."\"\n"; 
    $zag      .= "Content-Transfer-Encoding:base64\n"; 
    $zag      .= "Content-Disposition:attachment;"; 
    $zag      .= "filename=\"".basename($filename)."\"\n\n"; 
    $zag      .= chunk_split(base64_encode(fread($f,filesize($filename))))."\n"; 
     
    return @mail("$to", "$subj", $zag, $head); 
} 
?>

Приведем ссылки на некоторые более "продвинутые" классы:


2 Использование сокетов

<?php
function socketmail($server, $to, $from, $subject, $message) { 
    $connect = fsockopen ($server, 25, $errno, $errstr, 30); 
    fputs($connect, "HELO localhost\r\n"); 
    fputs($connect, "MAIL FROM: $from\n"); 
    fputs($connect, "RCPT TO: $to\n"); 
    fputs($connect, "DATA\r\n"); 
    fputs($connect, "Content-Type: text/plain; charset=iso-8859-1\n"); 
    fputs($connect, "To: $to\n"); 
    fputs($connect, "Subject: $subject\n"); 
    fputs($connect, "\n\n"); 
    fputs($connect, stripslashes($message)." \r\n"); 
    fputs($connect, ".\r\n"); 
    fputs($connect, "RSET\r\n"); 
} 
?>

3 Использование sendmail

<?php
$sendmail = "/usr/sbin/sendmail -t -f $sender -C /etc/sendmail.orig.cf"; 
$fd = popen($sendmail, "w"); 
fputs($fd, "To: recipient@example.com\r\n"); 
fputs($fd, "From: \"Sender Name\" <$sender>\r\n"); 
fputs($fd, "Subject: Finally\r\n"); 
fputs($fd, "X-Mailer: Mailer Name\r\n\r\n"); 
fputs($fd, $body); 
pclose($fd); 
?>

3 Использование ActiveX

<?php
@$CDONTS = new COM("CDONTS.NewMail"); 

@$CDONTS->From = "from_user@domain.com"; 
@$CDONTS->To = "to_user@domain.com"; 
@$CDONTS->CC = "cc_user@domain.com"; 
@$CDONTS->BCC = "bcc_user@domain.com"; 

@$CDONTS->BodyFormat = 0; 
@$CDONTS->MailFormat = 0; 

/@$CDONTS->AttachFile("c:\file.txt"); 

@$CDONTS->Subject = "Using CDONTS with PHP4 and IIS"; 
@$CDONTS->Body = "Blah blah blah blah, bleh..."; 

@$CDONTS->Send(); 
@$CDONTS->Close(); 
?>

Либо даже так

<?php
$objApp = new COM("Outlook.Application"); 
$myItem = $objApp->CreateItem(olMailItem); 
$a=$myItem->Recipients->Add("admin@purplerain.org"); 
$myItem->Subject="Subject"; 
$myItem->Body="This is a Body Section now.....!"; 
$myItem->Display(); 
$myItem->Send(); 
?>

Немає коментарів:

Дописати коментар

HyperComments for Blogger

comments powered by HyperComments