Logged MailMerge
mailmerge.py を使ってメールを送信するときにログをとるお話。某所で書けといわれたので適当に書きました。 mailmerge.py は OOo の com.sun.star.mail モジュールの MailServiceProvider をデフォルトで実装するモジュールです。このサービスは差込印刷でメールを送信するときなどにも利用されています。また、マクロなどからメールを送信する際にも利用できます。メールの送信 マクロなどでメールを送信する場合には自分でログをとることが出来ますが、差込印刷 (MailMerge) からの場合にはログを取れません。 そこで、メールを送信するサービス付近をいじってログを取れるようにします。com.sun.star.text.MailMerge を実装しなおすのは大変そうですから。 サービスの上書き
UNO コンポーネントは特定のサービス名に関連付けてレジストリデータベースに登録されます。ここでのレジストリデータベースというのはサービスなどの情報を登録してあるファイルのことで、OOo の programs/services.rdb や types.rdb がそれに相当します。ここでの場合は services.rdb です。拡張機能などで UNO コンポーネントをインストールする場合には拡張機能用の uno_pakcages ディレクトリ以下にある user/uno_packages/cache/registry/com.sun.star.comp.deployment.component.PackageRegistryBackend/common.rdb に登録されます。 rdb ファイルの内容を見るには SDK 付属の regview を使用します。 登録されるのは実装名とそのコンポーネントを登録するサービス名指定です。たとえば、デフォルトのcom.sun.star.mail.MailServiceProvider サービスを実装する mailmerge.py モジュールに定義されている PyMailServiceProvider クラスは実装名 org.openoffice.pyuno.MailServiceProvider で登録されています。 (そのほか、実装しているファイル URI など) 同じサービス名に登録されたコンポーネントがいくつもある場合には…?となりますが、全てのコンポーネントにアクセスすることが出来るようになっています。
この上記の二つを利用すれば同じ名前のサービスにいくつものコンポーネントが登録されていても好きなものを利用できます。 たとえば、次のようにして調べることが出来ます。 Sub services_1 smgr = GetProcessServiceManager() enume = smgr.createContentEnumeration("com.sun.star.mail.MailServiceProvider") While enume.hasMoreElements() element = enume.nextElement() msgbox element.getImplementationName() WEnd End Sub 普通は com.sun.star.mail.MailServiceProvider サービスに登録されたコンポーネントは上記のひとつですが、下記の拡張機能をインストールすると二つに増えます。 この仕組みは OOo 内で非常によく利用されています。DispatchProvider や Toolbar などのコントローラ、chart2 のテンプレートなど。 というわけで、サービスを上書きするというよりも同じサービス名で登録するということになります。サービス名でサービスをインスタンス化しようとすると後から登録されたものが使用されます。そのため、特に実装名で指定されていない場合には上書きしたような形でサービスを利用することになります。(前のものも上記の様にして探し出してインスタンス化できます。) 上書きしているように見えますが前のものも利用できるので上書きではありません。 LoggedMailMerge
ログをとるようにする。 一部です。
元の mailmerge.py で定義されている PyMailServiceProvider を継承したクラスを作成して適当な名前で登録します。メールを送信するのは PyMailSMTPService ですがそれを継承したクラスでログをメールを送信、ログをとることにします。 ただそれだけです。Python 以外の言語でも可能のはずですが Python - UNO - (OOo) - UNO - Lang のやり取りは数 msec ずつオーバヘッドがあるといわれているので。 パッケージ
ライセンスはありませんが、保障もありません。製作者に文句を言わない限り好きに煮たり焼いたりしてかまいません。
|