【发布时间】: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。