Использование IPC специфичных для операционной системы
Использование IPC, специфичных для операционной системы
В MacOS или Windows NT можно управлять почтовым клиентом, используя IPC (Interprocess Communication, межпроцессные взаимодействия).
Я не знаю о существовании версий sendmail для MacOS, но в нем для управления почтовым клиентом можно применять AppleScript:
$to="someone\@example.com"; $from="me\@example.com"; $subject="Hi there"; $body="message body\n";
MacPerl: :DoAppleScnpt(«EOC); tell application "Eudora"
make message at end of mailbox "out"
-- 0 is the current message
set field \"from\" of message 0 to \"$frorn\"
set field \"to\" of message 0 to \"$to\"
set field \"subject\" of message 0 to \"$subject\"
set body of message 0 to \"$body\"
queue message 0
connect with sending without checking
quit
end tell EOC В этом примере запускается очень простая программа AppleScript, которая общается с почтовым клиентом Eudora. Сценарий создает новое сообщение, помещает его в очередь для отправки, а затем отдает инструкции почтовому клиенту об отправке сообщения из очереди перед выходом.
Еще один, более эффективный способ написать подобный сценарий состоит в том, чтобы использовать модуль Мае: : G1 ие, уже рассмотренный в главе 2 «Файловые системы».
use Mac::Glue ':glue ;
$e=new Mac::Glue 'Eudora';
$to="someone\@example.com"; $f rom="me\(<}>exainple. com";
$subject="Hi there"; $body="<riessage body";
$e->make(
new => 'message',
at => location(end => $e->obj(mailbox => 'Out')) );
$e->set($e->obj(field => from => message => 0), to =4 $froin):
$e->set($e->obj(field => to => message => 0), to => $to);
$e->set($e->ob](field => subject => message => 0), to => Ssubject);
$e->set($e->prop(body => message => 0), to => $body);
$e->queue($e->obj(message => 0)); $е->соппесц sending => 1, checking => 0);
$e->quit;
В NT можно обратиться к библиотеке Collaborative Data Objects Library (раньше она называлась Active Messaging), простой в использовании надстройке на архитектуре MAPI (интерфейс прикладного программирования систем передачи сообщений). Вызвать эту библиотеку для управления таким почтовым клиентом, как Outlook можно, применив модуль Win32: :OLE следующим образом:
$to="me\(Sexample.com"; $subject="Hi there";
$body="message body\n";
use Win32::OLE;
# инициализируем OLE и COINIT_OLEINITIALIZE,
необходимые при и использовании объектов MAPI.Session
Win32: :OLE->Initialize(Win32: :OLE: :COINIT__OLEINITIALI7E): die Win32: :OLE->LastEr'-or(), "\n"
if Win32: :OLE->LastErrc-( V
создаем объект сессии, который вызовет logoff при уничтожени
my Ssession = Win32::OLE->new('MAPI.Session','Logoff);
die Win32::OLE->LastError();"\n" if Win32::OLE->LastError();
№ регистрируемся в этой сессии, используя OL98 Internet Profile по
$session->Logon('Microsoft Outlook Internet Settings').
die Win32: :OLE->LastError(),"\n" if Win32::OLE->LastError();
создаем обьект message
my Smessage = $session->Outbox->Messages->Add:
die Win32:'OLE->LastError(),"\n" if Win32::OLE->LastError():
Я создаем обьект recipient
my Srecipient = $message->Recipients->Add;
die Win32::OLE->LastError(),"\n" if Win32::OLE->LastError();
заполняем данными объект recipient
$recipient->{Name} = $to;
$recipient->{Type} = 1; n 1 = "To:", 2 = "Cc:", 3 = "Вес:"
все адреса должны быть расшифрованы по справочнику
# (в этом случае, скорее всего, по вашей адресной книге)
Полные адреса расшифровываются сами в себя, так что эта
строка в большинстве случаев не изменит обьект recipient
$ recipient->Resolve();
die Win32: :OLE->LastError(). "\r> if Win32: :OLE->LastError();
tt заполняем строку Subject: и тело сообщения
$message->{Subject} = Ssubject; $message->{Text} = Sbody;
tt помещаем сообщение в очередь для отправки
1-й аргумент = сохранить копию сообщения
2-й аргумент = позволить пользователю изменить сообщение
tt перед отправкой в диалоговом окне
№ 3-й аргумент = родительское окно диалога, если 2-й аргумент True
$message->Send(0, О, О):
die Win32::OLE->LastError(),"\n" if Win32::OLE->LastError();
tt явно уничтожить объект Ssession, вызвав
$session->Logoff undef Ssession,
В отличие от предыдущего примера, программа всего лишь помещает письмо в очередь. Это уже дело почтового клиента (такого как Outlook) или транспортного агента (например Exchange) периодически инициировать отправку почты. Существует CDO/AM 1.1 - метод для объекта Session под названием DeiiverNow(), обращающийся к MAPI с заданием очистить все очереди входящих и исходящих сообщений. К сожалению, в некоторых ситуациях он недоступен или не работает, поэтому его нет и в предыдущем примере. В упомянутом примере управление MAPI производится «вручную» при помощи вызовов OLE. Если вы хотите использовать MAPI, «не пачкая рук», можно применить модуль Win32: :МАР1, который берет на себя все функции (модуль находится на http://www.generation.net/ -aminer/Perl/ ).
Программы, полагающиеся на AppleScript/Apple Events или MAPI, так же непереносимы, как и вызов программы sendmall. Они берут на себя часть работы, но относительно неэффективны. К этим методам нужно прибегать в последнюю очередь.