【问题标题】:Send an email with a blank subject发送带有空白主题的电子邮件
【发布时间】:2020-11-06 14:14:10
【问题描述】:

我是一名教授,与不回复电子邮件但回复短信的学生互动。因此,我正在编写一个 Outlook 用户表单来生成由 Outlook 发送到学生手机的短信,例如,通过使用针对学生手机短信服务的电子邮件地址,如下所示:5405551212@mms.att.net

我遇到的问题是我不想为这些短信设置主题,因为主题被添加为发送给学生的每个文本的第一行,并且令人困惑并且看起来很奇怪,但是,当主题为空时,VBA 代码 olMail.Send 将引发此错误:“运行时错误 '-2147467259 (80004005)':Outlook 无法识别一个或多个名称。” olMail.To 和 olMail.CC 的名称很好,当我添加非空白主题时错误消失。

有没有办法以编程方式强制 Outlook 发送带有空白主题的电子邮件?除了将主题设为“”(空格)之外,我还没有找到在线搜索的解决方案——但这不是一个理想的解决方案,因为它仍然在每条短信的顶部添加了一个“空白”行,因为空间。

我可以使用 olMail.Display 然后使用 SendKeys 发送电子邮件并在被问及是否要发送没有主题的电子邮件时回答“是”,但这很笨重。

如何使用 VBA 跳过错误并发送没有主题的电子邮件?

编辑: 这是我用来向邮件项添加收件人的代码:

    Dim olApp As Outlook.Application
    Dim olMail As MailItem
    olMail.To = Me.tbxEmailAddress  'this would be something like 5405551212@mms.att.net
    olMail.CC = "someemail@notmail.com"  'this would be my own email address
    olMail.Subject = ""   'blank subject
    olMail.Body = Replace(Me.tbxTexts, vbCrLf, "")  'remove extra hard returns
    olMail.Send   'this would throw the error mentioned above,
                  'but if I changed olMail.Subject = "" to
                  'olMail.Subject = "This is the subject" then no error would occur

使用下面@Eugene Astafiev 的信息,我拼凑出这样一个可行的解决方案:

    Dim myRecipients As Outlook.Recipients
    Dim myRecipient As Outlook.Recipient
    Dim olApp As Outlook.Application
    Dim olMail As MailItem

    Set olApp = Outlook.Application
    olMail.Subject = ""   'blank subject
    olMail.Body = Replace(Me.tbxTexts, vbCrLf, "")  'remove extra hard returns
    Set myRecipient = olMail.Recipients.Add(tbxEmailAddress)
    myRecipient.Type = olTo  'Type is:  olBCC, olCC, olOriginator, or olTo
    Set myRecipient = olMail.Recipients.Add("someemail@notmail.com")
    myRecipient.Type = olBCC

    Set myRecipients = olMail.Recipients
    If Not myRecipients.ResolveAll Then
     For Each myRecipient In myRecipients
       If Not myRecipient.Resolved Then
         MsgBox "Could not resolve: " & myRecipient.Name
       End If
     Next
    End If
    olMail.Send   'no error now!

有趣的是,使用 myRecipients 集合的电子邮件地址从未报告过无法解析。但是,当我尝试使用 myRecipient.Resolve 解析单个 myRecipient 对象/项目时,短信电子邮件地址(例如 5405551212@mms.att.net)将无法解析,但我自己的电子邮件地址可以正常解析。

也许这与 5405551212@mms.att.net 不是我的地址簿或联系人中的地址有关?

无论如何,它现在确实发送了。 (注意:在使用 myRecipients.ResolveAll 之前,我确实通过使用 olMail.Display 和 olMail.Send,然后使用 SendKeys“%s”两次——第一次“点击" 发送按钮,当 Outlook 抱怨没有主题时第二次"单击" "仍然发送" 按钮。但是,显然 VBA 代码方法要优越得多。)

感谢大家的帮助!

【问题讨论】:

  • On Error Resume Next ?确保你理解那行代码,可能有更好的解决方案 - 我们可以看看你的代码吗?
  • 该错误与主题无关 - 这意味着一个或多个收件人无效。添加收件人并发送消息的代码是什么?
  • @0m3r 我尝试了 Resume Next 并忽略了错误,但随后消息发送失败。
  • @Dmitry Streblechenko 如前所述,收件人有效的,因为当我使用相同的收件人并添加主题时,电子邮件可以正常发送而不会出现错误。
  • @Dmitry Streblechenko 我使用的是 Outlook 2016。我同意错误是引用收件人,但使用相同的代码和收件人但添加一个主题代码可以很好地发送电子邮件。我确实设法让它与 ResolveAll 一起为收件人工作,但我仍然不明白为什么当主题不为空时我不必 ResolveAll。

标签: vba outlook


【解决方案1】:

Outlook 不需要在提交项目之前设置主题行。使用Recipients.ResolveAll 方法尝试根据通讯簿解析收件人集合中的所有收件人对象。

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("Eugene Astafiev") 
 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

您可能会发现以下文章对您有所帮助:

【讨论】:

  • 谢谢你,@Eugene Astafiev。使用 Recipients 集合是必要的。在使用您的方法解决问题的编辑帖子中查看我上面的代码。