Perl для системного администрирования

       

Использование 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. Они берут на себя часть работы, но относительно неэффективны. К этим методам нужно прибегать в последнюю очередь.



Содержание раздела