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