【发布时间】:2020-05-20 19:53:29
【问题描述】:
问题描述
在将电子邮件发送到 Excel 中可用 Outlook 电子邮件帐户列表之前,删除全局地址列表中未找到的非活动(非现有)电子邮件帐户
解决方案
运行 sql 查询以从数据库中获取用户名或用户电子邮件 ID
第一步:
查询 1:
strSQL = "select distinct [User Email ID] from dbo.vw_EmailRecipients_AT where Report_Catalog_ID in (" & rptid & ")"
或
查询 2:
strSQL = "select distinct [User Name] from dbo.vw_EmailRecipients_AT where Report_Catalog_ID in (" & rptid & ")"
第 2 步:
调用模块将检索结果集复制到 Excel 工作表
Sub Testemail()
Dim rEmails As Range
Dim rEmail As Range
Dim oOL As Object
Set oOL = CreateObject("Outlook.Application")
Set rEmails = ThisWorkbook.Sheets("Report_Users").Range("A2:A" & Range("A65000").End(xlUp).Row)
For Each rEmail In rEmails
rEmail.Offset(, 1) = ResolveDisplayNameToSMTP(rEmail.Value, oOL)
Next rEmail
End Sub
第 3 步:
解析显示名称
Public Function ResolveDisplayNameToSMTP(sFromName, OLApp As Object) As String
Dim oRecip As Object 'Outlook.Recipient
Dim oEU As Object 'Outlook.ExchangeUser
Dim oEDL As Object 'Outlook.ExchangeDistributionList
Set oRecip = OLApp.Session.CreateRecipient(sFromName)
oRecip.Resolve
If oRecip.Resolved Then
ResolveDisplayNameToSMTP = "Valid"
Else
ResolveDisplayNameToSMTP = "Not Valid"
End If
End Function
错误 1:如果我使用查询 1:结果集将是 abcdef@company.com,其中所有电子邮件 ID 都是有效的 - WRONG_RESULT。
错误 2:如果我使用查询 2:结果集将是 UserName 的组合 像 Rajan jha(rjhan) 和合同员工将是 Rajan jha (rjhan - Compnay1 在 Compnay2)
在这个结果中,带有 Rajanjha(rjahan) 的输出,如果在 GAL 中找到电子邮件帐户,它将是有效的,如果没有找到,它将是无效的电子邮件。对于像 Rajan jha (rjhan - Compnay1 is at Compnay2) 这样的结果集,甚至电子邮件帐户存在于 GAL 中,导致无效。
请指导我解决这个问题
【问题讨论】:
-
在没有完全理解他的问题的情况下,我相信根本问题是在某些情况下 VBA 无法检索 GAL 数据。 VBA 答案可能涉及循环整个 GAL。请参阅此处,建议通过 Redemption
RDOSession.AddressBook.GAL.ResolveName提供替代解决方案。 stackoverflow.com/questions/13825214/… -
感谢 niton,当我在链接解决方案中检查时,可用的是需要很长时间才能运行。关于RDOSession。我需要下载软件。我被禁止用于商业目的。是否有任何其他选择来解决问题。我并不是专门在 GAL 中查找电子邮件帐户。如果在本地地址中没有找到它。
-
如果您已放弃 GAL,则此处描述了一种从联系人中检索的方法How to get Email address from outlook contacts for the names listed in a column?
-
感谢 Niton,正如我看到评论中提供的链接帮助我识别“本地联系人未更新地址”,所以我只能使用
o.Session.AddressLists("Global Address List")。但是检查全局地址条目名称中每个名称的条件是否需要花费很多时间。但我不能使用RDOSession。但是为什么Receipient.Resolve无法准确解析所有电子邮件帐户。是否有任何其他财产可以强制解决收件人。 -
感谢 @niton 的支持并帮助保持一致性以解决此问题。但我已经解决了相同公司名称的电子邮件 ID 的问题。 ` Set oRecip = OLApp.Session.CreateRecipient(sFromName) oRecip.Resolve oRecipName = oRecip.Name If oRecip.Resolved And InStr(oRecipName, "@") = 0 Then ResolveDisplayNameToSMTP = "Valid" Else ResolveDisplayNameToSMTP = "Not Valid" End If `