LoginSignup
1
2

More than 5 years have passed since last update.

メールを保存する - Outlookの続き

Last updated at Posted at 2017-06-28

メールを保存する - Outlookのの続き

実行時エラー

選択するメールが多すぎると、以下のエラーのダイアログが出る。

ダイアログのエラーメッセージを素直に読めば、サーバ側の設定によると思われる。出たのは、IMAPのとき。(ただ、自分のPCのレジストリかも?という記事もあった。。。)

実行時エラー

同時に開くことができるアイテムの数が、サーバ管理者によって制限されています。開いているメッセージを閉じるか、作成中のメッセージから添付ファイルや画像を削除してください。

ForEachでイテレートしているメールオブジェクトを参照(mail.xxxxx)したタイミングで発生するようだ。

ForEach箇所
For Each mail In ActiveExplorer.Selection

しかし、そもそも「オブジェクトを参照したいからイテレートしている」というジレンマ。

発生個所

発生箇所1
    ' ビュー一覧のうち選択したメールに対して保存処理をする
    Dim mail As Object
    For Each mail In ActiveExplorer.Selection

        ' 保存したいメールアドレスが含まれているかチェックする
        ' 送信者アドレス(SenderEmailAddress) → なかったら → 受信者アドレス(RecipientのAddress)
        ' mdirが空文字列("")だったら、TERGETではないのでスキップする
        Dim mdir As String
        Dim sndr_addr As String

        mdir = ""
        sndr_addr = mail.SenderEmailAddress

sndr_addr = mail.SenderEmailAddressの箇所で発生。
ここをどうにかしてパスすると・・・

発生箇所2
        ' 添付ファイル
        Dim f As Attachment
        Dim attach_fname As String
        For Each f In mail.Attachments
            ' 添付ファイル名
            attach_fname = fso.buildPath(folder_name, replaceNGchar(f.DisplayName, "_"))

For Each f In mail.Attachmentsの箇所で発生。

暫定対策

今のところ、「Outlookで選択するメールの数を減らす」という使い方で逃げている。
(For Each mail In ActiveExplorer.Selectionでイテレートするオブジェクトを減らす)

もしかすると?

要はmailオブジェクトの参照がどこかで解放できていない(補足[1])。
Set mail = Nothingを入れて、できるかぎり解放してたつもりだった。。。が、「Continue的な箇所」(GoTo Continue)」の箇所が解放できてないGoTo ContinueContinue: ように思う。・・・ったが解放してもダメそうだった。

原因箇所?
    Dim mail As Object
    For Each mail In ActiveExplorer.Selection
' ・・・
        If mdir = "" Then
            GoTo Continue ' Continue文がないので、GoToで代用。
        End If
' ・・・
        Set mail = Nothing
Continue:
        ' Continue文がないので、GoToで代用
    Next

ちなみに・・・

    Dim mail As Object
    For Each mail In ActiveExplorer.Selection

Dim mail As Objectの部分は、たいていのメールに対しては、

MailItem
    Dim mail As MailItem
    For Each mail In ActiveExplorer.Selection

Dim mail As MailItemで動く。ただ、MailItemでない何か(ちゃんと調べていないが、会議予定など?)が、「For Each mail In ActiveExplorer.Selectionで入れられてしまう」ので、エラーが発生する。

添付ファイルの拡張子がなくなる件

        ' 添付ファイル
        Dim f As Attachment
        Dim attach_fname As String
        For Each f In mail.Attachments
            ' 添付ファイル名
            attach_fname = fso.buildPath(folder_name, replaceNGchar(f.DisplayName, "_"))

メール(*.msg)が添付ファイルにされていると、拡張子がなくなってしまう。
たとえば、"abcの件.msg" が"abcの件"というファイルになる

暫定対策

拡張子を付けることで.msgとして開けるようになる。

原因箇所?

f.DisplayNameの動きがそうなっているから・・・と思うが、.msgだけが拡張子がなくなるのかどうかがわからないし、手作業でなんとかなる程度の量だったのでまだよく調べていない。

補足

補足[1]

オブジェクト解放は、Set objReference = Nothingしてしまえばよい。(オブジェクトの参照カウントかなんかで数えていて、いいように解放してくれる。たぶん。)

普段は、VBScriptの「ちょっとしたモノ」ばっかり書いてたので、↓の記事を

なぜそれを実行したのか - Microsoft スクリプト センター _ TechNet

オブジェクト参照を Nothing に設定する方法もよく目にします。・・・
すべてのオブジェクト参照は、スクリプトが終了するときに自動的に解放されるので、強制的に解放する必要はありません。

と見ていた。ここでは、その前提条件の

オブジェクト参照を Nothing に設定する方法もよく目にします。・・・
ここでは、新しいオブジェクトでオブジェクト参照を再利用しない場合や、スクリプトで大量のメモリを消費しない場合には、次のコードを実行する必要はないと言えば十分でしょう。

Set objReference = Nothing

に着目したほうがよさそうだ。

参考

なぜそれを実行したのか - Microsoft スクリプト センター _ TechNet
Outlook で予定表を表示する際の制限数について – Outlook Support Team Blog JAPAN

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2