Top > OOoPython > LoggedMailMerge

Logged MailMerge Edit

mailmerge.py を使ってメールを送信するときにログをとるお話。某所で書けといわれたので適当に書きました。

mailmerge.py は OOo の com.sun.star.mail モジュールの MailServiceProvider をデフォルトで実装するモジュールです。このサービスは差込印刷でメールを送信するときなどにも利用されています。また、マクロなどからメールを送信する際にも利用できます。メールの送信

マクロなどでメールを送信する場合には自分でログをとることが出来ますが、差込印刷 (MailMerge) からの場合にはログを取れません。

そこで、メールを送信するサービス付近をいじってログを取れるようにします。com.sun.star.text.MailMerge を実装しなおすのは大変そうですから。

サービスの上書き Edit

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 など)

同じサービス名に登録されたコンポーネントがいくつもある場合には…?となりますが、全てのコンポーネントにアクセスすることが出来るようになっています。

  1. 実装名でインスタンス化できる
  2. サービスマネージャから「ある」サービスとして登録されているコンポーネントの情報を取得できる
    com.sun.star.container.XContentEnumerationAccess インターフェースを使用

この上記の二つを利用すれば同じ名前のサービスにいくつものコンポーネントが登録されていても好きなものを利用できます。

たとえば、次のようにして調べることが出来ます。

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 Edit

ログをとるようにする。

一部です。

  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
from mailmerge import PyMailServiceProvider, PyMailSMTPService
 
class Logged_PyMailSMTPService(PyMailSMTPService):
    def __init__(self, ctx):
        #....
 
class Logged_PyMailServiceProvider(PyMailServiceProvider):
    def __init__(self, ctx):
        self.ctx = ctx
        PyMailServiceProvider.__init__(self, ctx)
    
    def create(self, aType):
        if aType == SMTP:
            return Logged_PyMailSMTPService(self.ctx)
        else:
            PyMailServiceProvider.create(self, aType)
 
g_ImplementationHelper = unohelper.ImplementationHelper()
g_ImplementationHelper.addImplementation( \
    Logged_PyMailServiceProvider, "org.openoffice.pyuno.LoggedMailServiceProvider",
        ("com.sun.star.mail.MailServiceProvider",),)

元の mailmerge.py で定義されている PyMailServiceProvider を継承したクラスを作成して適当な名前で登録します。メールを送信するのは PyMailSMTPService ですがそれを継承したクラスでログをメールを送信、ログをとることにします。

ただそれだけです。Python 以外の言語でも可能のはずですが Python - UNO - (OOo) - UNO - Lang のやり取りは数 msec ずつオーバヘッドがあるといわれているので。

パッケージ Edit

ライセンスはありませんが、保障もありません。製作者に文句を言わない限り好きに煮たり焼いたりしてかまいません。

  • ログは指定がない場合 user/temp/mailmerge.log に保存されます。指定するには LOGFILE に
  • ログをとる項目を編集するには LOGORDER に com.sun.star.mail.MailMessage にあるプロパティ名またはメソッド名を使って順を指定します
  • メール本文、添付ファイルの内容をログに取るには色々改変する必要があります
  • 時間のフォーマットは TIMEFORMAT を Python の time.strftime のサインにしたがって書き換えます
  • オプションページを用意してコンフィグレーションにログ取得などの設定を作ればファイルをいじらなくてすむようになるけど…。
  • 面倒 (だし使わない) なので使う人が居ない限り拡張しません

Attach file: filelog_mailmerge_0.0.1.oxt 804 download [Information]

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes