【问题标题】:Save email as .msg in local windows folder using Excel VBA使用 Excel VBA 在本地 windows 文件夹中将电子邮件另存为 .msg
【发布时间】:2018-11-19 17:16:18
【问题描述】:

我想使用 Excel VBA 将电子邮件保存在我的本地文件夹中。

我看到了这个链接https://www.mrexcel.com/forum/excel-questions/361751-vba-saving-email-only-after-send-pushed.html,它使用类模块来保存电子邮件。它在打开电子邮件进行显示的同时存储电子邮件。保存的电子邮件是草稿电子邮件。您仍然可以编辑保存的 .msg 文件。

我将如何等到电子邮件发送完毕?大概是一旦它检测到 Outlook“已发送邮件”文件夹中的电子邮件?

Dim cls_OL As New clsOutlook
Public outMail As Outlook.MailItem
Public Emailpath As String

Sub SendEmail()
Dim objItems As Items
Dim objApp As Object
Set objApp = CreateObject("Outlook.Application")
Set cls_OL.obj_OL = GetObject(Class:="Outlook.Application")
Set OutMail = objItems.Add
Emailpath = "V:\test\emailname.msg"
With OutMail
On Error Resume Next
    .HTMLBody = "Hi All, This is test email" 
    .to = "test@test.com"
    .CC = vbnullstring
    .BCC = vbnullstring
    .Subject = "A Subject"
    .Display
End With
Set OutMail = Nothing
End Sub

.

Option Explicit
Public WithEvents obj_OL As Outlook.Application

Private Sub obj_OL_ItemSend(ByVal Item As Object, Cancel As Boolean)
  Item.SaveAs Emailpath
  Set obj_OL = Nothing
  Set outMail = Nothing
End Sub

这是正在保存的电子邮件:

这是我要保存的内容:

根据 Dmitry 的建议进行编辑

Dim cls_OL As New clsOutlook
Public outMail As Outlook.MailItem
Public Emailpath As String

Sub SendEmail()
Dim objItems As Items
Dim Emailpath as string
Dim objApp as object
Set objApp = CreateObject("Outlook.Application")
Set objItems = objApp.Session.GetDefaultFolder(olFolderSentMail).Items
Set OutMail = objItems.Add 
Emailpath = "V:\test\emailname.msg"
With OutMail

    .HTMLBody = "Hi All, This is test email" 
    .to = "test@test.com"
    .CC = vbnullstring
    .BCC = vbnullstring
    .Subject = "A Subject"
    .Display
End With
Set OutMail = Nothing
End Sub

.

Option Explicit
Public WithEvents objItems As Outlook.Application

Private Sub objItems_ItemAdd(ByVal Item As Object)
  Item.SaveAs Emailpath
  Set obj_OL = Nothing
  Set outMail = Nothing
End Sub

【问题讨论】:

    标签: excel vba email outlook


    【解决方案1】:

    您可以在“已发送邮件”文件夹中侦听Items.ItemAdd 事件(您可以使用Namespace.GetDEfaultFolder(olFolderSentMail) 检索它)。

    编辑:在我脑海中浮现:

    public WithEvents objItems As Outlook.Items
    set objItems = Application.Session.GetDefaultFolder(olFolderSentMail).Items
    ...
    Private objItems_ItemAdd(ByVal Item As Object)
      Item.SaveAs Emailpath
    End Sub
    

    【讨论】:

    • 嗨@dmitry,感谢您的回复。我真的不明白你说的听听是什么意思。我需要更改的任何代码。抱歉,我对 Class Module 有点陌生。
    • 声明一个“带有事件”的全局项目(就像你对 obj_OL 所做的那样)变量并提供 ItemAdd 事件处理程序。 Items集合来自MAPIFolder.Items,MAPIFolder取自Namespace.GetDEfaultFolder(olFolderSentMail)
    • 我真的很抱歉我没有明白你的意思。这是我的尝试。我真的很抱歉,因为我没有这方面的任何背景。 Public WithEvents obj_OL As Outlook.Application Private Sub obj_OL_ItemAdd(ByVal Item As Object, Cancel As Boolean) Item.ItemAdd Namespace.GetDefaultFolder(olFolderSentMail) Set obj_OL = Nothing Set outMail = Nothing End Sub
    • 谢谢德米特里。我试过了,设置 objItems =Application.Session.GetDefaultFolder(olFolderSentMail) 有错误。Items 说它是无效的外部程序。我应该把它放在哪里?应该在我的模块子过程中?
    • 我不知道将集合 objItems = Application.Session.GetDefaultFolder(olFolderSentMail).Items 放在哪里,因为我把它放在子过程之外。它说无效的外部程序。我应该把这条线放在哪里?
    猜你喜欢
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    • 2018-07-10
    • 2016-02-05
    相关资源
    最近更新 更多