2017-11-08 15 views
1

私はOutlook VBAを初めて使用しています。私は電子メールの状態を、ライフサイクルの段階とフォルダ、「下書き」、「送信トレイ」、および「送信済み」を通過するようにしたいと考えています。関連する興味の中には、送信された時間などのプロパティ情報を収集するために既存の電子メールを検索してアクセスする機能があります。私は含まれているコードブロックから始めましたが、うまく動作しません。VBAを作成してOutlookの電子メールを送信し、草案/送信/送信プロセスで追跡します。

すぐにわかるように、変数が電子メールから切断されるため、電子メールが送信された時点でDoループが失敗します。これにより、ランタイムエラー "項目が移動または削除されました"が発生します。また、奇妙な詳細があります:エラー番号(Err.Number)は毎回異なり、設計目的が何か不思議です。

ドラフト、送信トレイ、送信済みのメールを送信する際に、どのように接続しておくことができますか?変数の多くはメールアイテムから切断されていますが、オブジェクト階層に依存する解決策はなく、問題に対処するための遅延バインディングは避けてください。私はおそらく、メッセージを識別するGUIDまたはUUIDがあると思っていましたが、ドキュメントに示されているように、EntryIDなどのすべてのプロパティは、アイテムが移動され、そのようなプロパティに依存しないように変更できます。

電子メールはデータベーステーブルの単なるレコードなので、これは意味のあることです。また、テーブル間でレコードを複製/削除する場合、情報は同じか類似している可能性がありますが、レコード番号はおそらく存在しません。また、それは他の釘を打つ:同じ電子メールは複数回送信することができますまた、別のフォルダに、さらには別のアカウントにコピー/貼り付けすることができます。今何がユニークかどうか? scifiクローンが言うように、誰が本物ですか、誰がコピーですか?

したがって、電子メールに「接続」していることを除けば、どのプロパティまたはテクニックを使ってIDを割り当てることができますか?上記のようにメールアイテムを識別する適切な方法がない場合、私が考えることができる唯一のことは、OCXコントロールの "Tag"プロパティのような既存のカスタムフィールドを使用してUUIDを挿入することです。一部の企業では、件名にコール/注文/サポート番号を入れて追跡しやすくする技術を使用しています。

Dim outlobj As Outlook.Application 
Dim mailobj As Outlook.MailItem 
Set outlobj = Outlook.Application 
Set mailobj = outlobj.CreateItem(olMailItem) 
With mailobj 
    .Recipients.Add "[email protected]" 
    .Subject = "Invisible Jet Scheduled Maintenance Reminder" 
    .Body = "Your invisible jet need to be polished." 
    .Attachments.Add zipFilename 
    .Display 
    .Send 
End With 

Do 
    'next line fails due to email moving through Drafts, Outbox, & Sent 
    'notably, the VBA runtime Err.Num is different each time 
    'how do i keep the variable connected to a moving target? 
    If mailobj.Sent = False Then 
     Sleep 100 
    Else 
     MsgBox "The email has been sent." 
     'other code 
     Exit Do 
    End If 
Loop 
+0

クラスを作成し、そのクラスのイベント対応プロパティとして 'MailItem'を追加します。オープン/ライト/センド/セーブなどのイベントを処理して、電子メールのライフサイクルをカスタムコントロールします。 'EntryID'は各メール項目の一意のプロパティです。 – cyboashu

答えて

2

クラスを作成し、そのクラスのイベント対応プロパティとしてMailItemを追加します。オープン/ライト/センド/セーブなどのイベントを処理して、電子メールのライフサイクルをカスタムコントロールします。 EntryIDは各メールアイテムの一意のプロパティです。


は、ユーザーが手動 フォルダ間でアイテムを移動し、暗黙的にするときエントリIDのみアイテムの保存最初と変更後に生成されるという事実に注意してください。


あなたが始めるために一例を以下に示します。

Class1

このような
Option Explicit 

Public WithEvents mItem As MailItem 
Public id    As String 

Private Sub mItem_Open(Cancel As Boolean) 
    MsgBox "Mail item will be displayed." 
    id = mItem.EntryID 
End Sub 

クラスを追加し、次のコードでモジュールを追加します。

Option Explicit 

Sub test() 

    Dim cls As New Class1 
    Dim id As String 

    Dim outlobj As Outlook.Application 
    Dim mailobj As Outlook.MailItem 
    Set outlobj = Outlook.Application 
    Set mailobj = outlobj.CreateItem(olMailItem) 

    Set cls.mItem = mailobj 

    With mailobj 
    .Recipients.Add "[email protected]" 
    .Subject = "Test" 
    .Body = "Test Content of the e-mail." 
    .Save 
    .Display 
    id = cls.id '/ Store ID for later use. 
    Debug.Print id 
    End With 


    '/ Search that e-mail and display its body contents 
    Call Retrieve(id) 


End Sub 


Sub Retrieve(sEntryId As String) 
    Dim mailobj As Outlook.MailItem 
    Dim ns As NameSpace 

    Set ns = GetNamespace("MAPI") 
    Set mailobj = ns.GetItemFromID(sEntryId) 
    MsgBox mailobj.Body 

End Sub 

sを実行するub test

+0

'Outlook.ApplicationとしてDim Outlobjを使用する必要はありません。単に' Mailobj = Application.CreateItem(olMailItem) 'を使用してください。 – 0m3r

+1

怠け者です。 :)貼り付けられたOPのコードをコピーします。 – cyboashu

+0

'Outloj as Outlook.Application'はOutlookを起動しようとする理由で、" 462:Remote server unavailable "のようなエラーをスローします。 Outlookがすばやく起動しない場合は..?私は、Outlookを起動せずにメールを作成/送信する方法があると仮定していましたが、まだ調査していませんでした。 – spinjector

関連する問題