2015-12-09 6 views
0

Следующий код создает и отправляет простое электронное письмо. После отправки сообщения он заменяет строку в элементе электронной почты.Заменить строку в отправленном письме

Мой код работает, когда я использую одношаговую функцию отладчика для выполнения кода. Он также работает, когда я добавляю инструкцию MsgBox с кнопкой «нажмите, чтобы продолжить» после команды objMsg.Send. Это не работает, когда я выполняю макрос без перерыва, но сообщает мне, что Outlook не может сохранить письмо в папку при запуске макроса.

Sub CreateNewMessage() 

    objMsg As MailItem 

    Set objMsg = Application.CreateItem(olMailItem) 

    With objMsg 
     .To = "[email protected]" 
     .subject = "This is the subject" 
     .BodyFormat = olFormatHTML 
     .Body = "How are you doing?" 
    End With 
    objMsg.Send 

    ' The following code replaces in the email body the string "you" with "they" 

    ' Because I could not find how to open the "last sent" email, 
    ' I used the "Sent Items" folder email count as as the pointer 
    ' to the last email. 

    Dim myNameSpace As Outlook.NameSpace 
    Dim myFolder As Outlook.Folder 
    Dim myItem As Object 

    Set myNameSpace = Application.GetNamespace("MAPI") 
    Set myFolder = _ 
     myNameSpace.GetDefaultFolder(olFolderSentMail) 

    Dim EmailCount As Integer 

    EmailCount = myFolder.Items.Count 
    Set myItem = myFolder.Items(EmailCount) 
    myItem.HTMLBody = replace(myItem.HTMLBody, "you", "they") 
    myItem.Save 

End Sub 

ответ

2

Отложенные действия, которые вы принимаете, достаточны для отправки. Без задержки сообщение еще не находится в папке «Отправленные».

Вы можете вместо этого использовать ItemAdd с соответствующими условиями в коде, чтобы обрабатывать соответствующие сообщения.

Это обработает элемент, который недавно был добавлен в папку «Отправленные».

Код для ThisOutlookSession

Option Explicit 

Private WithEvents sItems As Items 

Private Sub Application_Startup() 
    Dim objNS As NameSpace 
    Set objNS = GetNamespace("MAPI") 
    ' default local Sent Items folder 
    Set sItems = objNS.GetDefaultFolder(olFolderSentMail).Items 
End Sub 

Private Sub sItems_ItemAdd(ByVal item As Object) 

    If TypeName(item) = "MailItem" Then   
      ' ****************** 
      ' do something here with item 
      ' ****************** 
      Debug.Print item.subject 
    End If 

End Sub 

Источник в случае, если это непроверенный код имеет опечаток. How do I trigger a macro to run after a new mail is received in Outlook?

+0

Вы также не должны предполагать, что MAPIFolder.Items.Item (Items.Count) предоставит вам последнее сообщение. Заказ не определен, если вы явно не сортируете коллекцию Items. –

+0

Спасибо, Дмитрий. Когда я добавил задержки, это не помогло. В моем приложении я не могу добавить MSgBOX или другие ручные задержки. Он должен работать автоматически. Можете ли вы объяснить мне или предложить код, как я могу обнаружить, что сообщение было сохранено в папке «Отправленные». Не так ясно, как ItemAdd выполнит эту работу. Мне кажется, что если макрос не будет завершен или остановлен, система никогда не сохранит отправленное сообщение в папке «Отправленные». Еще раз спасибо за вашу помощь. – Menachem

+0

Обратите внимание, что мне нужно искать и заменять строку для каждого отправляемого сообщения. – Menachem

0

После комментариев, которые я получил, я отправляю окончательный код, который я тестировал и работает. Он заменяет строку в последнем отправленном сообщении (после отправки и сохранения).

Sub Replace_LSM_String() 

Set Folder = Application.Session.GetDefaultFolder(olFolderSentMail) 
Set Items = Folder.Items 
Items.sort "[ReceivedTime]", False 
Set oldestMessage = Items.GetLast 
oldestMessage.HTMLBody = Replace(Items.GetLast.HTMLBody, "old string",_ 
"new string") 
Items.GetLast.Save 

End Sub 
Смежные вопросы