简体   繁体   中英

Sending Emails from Excel VBA - Names Not Recognized

I am using the below code to send an email from excel using outlook:

Private Sub SendEmail()

  Set OutlookApp = CreateObject("Outlook.Application")
  Set OlObjects = OutlookApp.GetNamespace("MAPI")
  Set newmsg = OutlookApp.CreateItem(olMailItem)

  newmsg.Recipients.Add ("name@domain.com; name2@domain.com; name3@domain.com")

  newmsg.Subject = "Test Mail"

  newmsg.Body = "This is a test email."

  'newmsg.Display

  newmsg.Send

End Sub

The code works just fine, however I get the below error from Outlook when trying to send the email:

ErrorScreen http://im58.gulfup.com/GRENlB.png

The strange thing is that if I leave the new message open for two or three minutes the names automatically get resolved:

Working http://im74.gulfup.com/qmOYGQ.png

However this doesn't suit me as I don't want the message to be displayed before it's sent. I am looking to have it send as soon as I run the code.

Any suggestions or workarounds will be appreciated.

As a side note: I have tried enabling the "Allow commas as email separators" option in outlook, and then using the commas instead of the semicolons, but I am still facing the same problem.

UPDATE:

Below is the working code, as per Dmitry Streblechenko's answer:

Private Sub SendEmail()

    Dim OutApp As Object
    Dim OutMail As Object
    Dim strbody As String

    Set OutApp = CreateObject("Outlook.Application")
    Set OlObjects = OutApp.GetNamespace("MAPI")
    Set OutMail = OutApp.CreateItem(olMailItem)

On Error Resume Next
    With OutMail
        .To = ("name@domain.com; name2@domain.com; name3@domain.com")
        .Subject = "Test Mail"
        .Body = "This is a test email."
        '.Display
        .Send
    End With

End Sub

You cannot pass multiple names to Recipients.Add - you get a single recipient with the name of "name@domain.com; name2@domain.com; name3@domain.com". Either call Recipients.Add 3 times once for each recipient or set the To property - it will parse multiple names.

You should add a call to ResolveAll to explicitely resolve all recipients. Otherwise, resolution is done automatically after a short waiting period.

Example:

Sub CheckRecipients()      
 Dim MyItem As Outlook.MailItem 
 Dim myRecipients As Outlook.Recipients 
 Dim myRecipient As Outlook.Recipient 

 Set myItem = Application.CreateItem(olMailItem)      
 Set myRecipients = myItem.Recipients 

 myRecipients.Add("Aaron Con")      
 myRecipients.Add("Nate Sun")      
 myRecipients.Add("Dan Wilson") 

 If Not myRecipients.ResolveAll Then      
     For Each myRecipient In myRecipients      
        If Not myRecipient.Resolved Then      
           MsgBox myRecipient.Name      
        End If      
     Next      
 End If      
End Sub

Code copied from here .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM