VBA代码验证Outlook全局地址列表中找到的电子邮件地址

时间:2017-11-12 20:00:06

标签: excel vba email

问题描述

在将电子邮件发送到excel中的可用Outlook电子邮件帐户列表之前,删除在全局地址列表中找不到的非活动(不存在)电子邮件帐户

解决方案

运行sql Query以从数据库中获取用户名或用户电子邮件ID

第1步:

查询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在Compnay2)的结果集,其中甚至GAL中存在电子邮件帐户,结果无效。

请指导我解决这个问题

2 个答案:

答案 0 :(得分:3)

我通过在中间输出的条件检查中进行小的更改来解决问题。

Public Function ResolveDisplayNameToSMTP(sFromName, OLApp As Object) As String

    Dim oRecip As Object  'Outlook.Recipient

    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

End Function

此处oRecip.Resolve正在解析有效和无效电子邮件ID的电子邮件ID 同一公司和InStr(oRecipName, "@") = 0扮演关键角色,以删除无效的电子邮件ID。

非活动电子邮件oRecip.Resolve会将输出解析为有效。但输出将是

  

rajaanjha@company1.com

此处InStr(oRecipName, "@") = 0检查字符串中的@并将其标记为无效的电子邮件ID

有效电子邮件oRecip.Resolve会将输出解析为有效。但输出将是

  

用户电子邮件ID的Rajan Kumar Jha(第一个中间姓)   @不在中间字符串中且有效电子邮件ID。

但我有像

这样的电子邮件ID问题
  

rajanjha@company2.com

Active Active ID的公司未解决的用户名需要解决。

答案 1 :(得分:0)

我同意尼龙。而不是使用VBA,我是VBA的忠实粉丝,我想说使用下面的URL中描述的方法获取GAL。

https://www.extendoffice.com/documents/outlook/3590-outlook-export-gal-to-csv.html

我已经尝试过VBA下载与Outlook中所有联系人有关的所有数据,但后果可怕。如果您使用内置控件,并按照上述步骤操作,您将快速准确地获得所需的一切。如果您尝试开发自己的自定义VBA解决方案,那么您完全可以自己...