Я пытаюсь отправить сообщение на свой телефон, когда получаю почту на работе.
Макрос должен отправлять почту в службу смс, которая преобразует почту в смс и отправляет ее на мой телефон. Сообщение будет содержать адрес отправителя почты и время отправки и получения.
Я собрал два макроса, которые нашел в Интернете.
Первый код находится по этой ссылке tachytelic.net
Второй я нашел здесь stackoverflow.com
Вот часть кода, которая не работает.
'variable for select case
Dim EmailFrom As String
Dim OldMessage As Outlook.MailItem
Set OldMessage = Application.ActiveInspector.CurrentItem
'Puts sender mail address in variable both ordinary mail and Exchange emails.
Select Case OldMessage.SenderEmailType
Case "EX"
EmailFrom = OldMessage.Sender.GetExchangeUser.PrimarySmtpAddress
Case Else
EmailFrom = OldMessage.SenderEmailAddress
End Select
'Sends E-mail to sms service.
If TypeName(Item) = "MailItem" Then
With olEmail
.BodyFormat = olFormatPlain
.To = "[email protected]"
.Subject = "You got a new E-mail!"
.Body = EmailFrom & vbCrLf & "Sendt: " & Item.SentOn & vbCrLf & "Modtaget: " & Item.ReceivedTime
.Send
End With
End If
я получил
runtime error 91 - Object variable or With block variable not set.
Я пытался использовать клавишу F8, но это невозможно, не знаю почему.
Затем я взял исходный код и вставил его в модуль. Затем я могу использовать клавишу F8, чтобы просмотреть код.
Ошибка возникает, когда я дохожу до этой строки.
Set OldMessage = Application.ActiveInspector.CurrentItem
Вот весь код
Option Explicit
Private WithEvents inboxItems As Outlook.Items
Sub Application_Startup()
Dim outlookApp As Outlook.Application
Dim objectNS As Outlook.NameSpace
Set outlookApp = Outlook.Application
Set objectNS = outlookApp.GetNamespace("MAPI")
Set inboxItems = objectNS.GetDefaultFolder(olFolderInbox).Items
End Sub
Sub inboxItems_ItemAdd(ByVal Item As Object)
On Error GoTo ErrorHandler
'variable for if statments
Dim olApp As Outlook.Application
Dim olEmail As Outlook.MailItem
Set olApp = New Outlook.Application
Set olEmail = olApp.CreateItem(olMailItem)
'variable for select case
Dim EmailFrom As String
Dim OldMessage As Outlook.MailItem
'Deletes sms status mails I recieve when I mail to sms service
If InStr(Item.Subject, "SMS status") > 0 Then
Item.UnRead = False
Item.Save
Item.Delete
End
End If
'Puts sender mail address in variable both ordinary mail and Exchange emails.
Select Case OldMessage.SenderEmailType
Case "EX"
EmailFrom = OldMessage.Sender.GetExchangeUser.PrimarySmtpAddress
Case Else
EmailFrom = OldMessage.SenderEmailAddress
End Select
'Sends E-mail to sms service.
If TypeName(Item) = "MailItem" Then
With olEmail
.BodyFormat = olFormatPlain
.To = "[email protected]"
.Subject = "You got a new E-mail!"
.Body = EmailFrom & vbCrLf & "Sendt: " & Item.SentOn & vbCrLf & "Modtaget: " & Item.ReceivedTime
.Send
End With
End If
ExitNewItem:
Exit Sub
ErrorHandler:
MsgBox Err.Number & " - " & Err.Description
Resume ExitNewItem
End Sub
Тогда легче получить обзор.
Как заставить ActiveInspector просматривать полученную почту и сохранять ее в OldMessage?
Если нет никакого открытого окна элемента, ActiveInspector будет Nothing. Кроме того, исходя из предоставленного вами примера кода, переменная Item нигде не объявлена и не установлена, поэтому вы, вероятно, также получите сообщение об ошибке в этой строке:
If TypeName(Item) = "MailItem" Then
Переменная Item объявлена в «Sub inboxItems_ItemAdd (ByVal Item As Object)».
Спасибо за обновленный код. Теперь ясно, что вы удаляете электронное письмо, которое передается как параметр Item в событии ItemAdd, и вы вообще ничего не устанавливаете для переменной OldMessage. ActiveInspector бесполезен - он только для открытых элементов. Электронная почта, добавляемая в эту папку, не открывается.
Извините моя ошибка. Я случайно удалил строку кода, которая вызывает проблему. Под «Dim OldMessage As Outlook.MailItem» не должно было быть «Set OldMessage = Application.ActiveInspector.CurrentItem». Что вы имеете в виду, что я удаляю почту, которая передается как Item. Я удаляю элемент только в том случае, если он содержит «Статус SMS» в строке темы. Но как мне получить Item. Я попытался сделать «Dim olType As Outlook.MailItem» и «Set olType = Item.ActiveInspector.CurrentItem», вставленный в OldMessage. Затем я получаю эту ошибку 438 - Объект не поддерживает это свойство или метод.
У вас уже есть доступ к объекту Item — вы даже читаете его свойства. Если вы хотите привести это к переменной MailItem, просто добавьте «Set OldMessage = Item». Опять же, вы НЕ МОЖЕТЕ ИСПОЛЬЗОВАТЬ ActiveInspector — элемент НЕ открыт в своем собственном окне инспектора.
Эрик Лего Спасибо за вашу помощь и время. Теперь это работает.
Привет еще раз Эрик. Что делать, если я хочу проверять почту не только во входящих, но и во вложенных папках.
Создайте другой обработчик событий для события Items.ItemAdd для коллекции Items этой папки.
Но если я закомментирую случай выбора и переменные к нему. код отлично работает с переменной Item. Когда я получаю электронное письмо, я получаю смс, в котором говорится, что «у вас есть новое время отправки / получения почты», поэтому я добавил выбор регистра, чтобы видеть, от кого оно.