从X400地址得到SMTP地址

本文介绍如何将Outlook内部邮件地址(X400)转换为标准SMTP地址。提供了两种方法:使用Redemption组件及通过ADO查询Active Directory。这两种方案分别适用于不同场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

The information in this article applies to:

-         Microsoft Outlook 2000,2002,XP,2003

 

对于Outlook邮件中的收件人一栏如果收件人属于公司内部用户直接用MailItem.Recipents.Item(nRecipentIndex).Address字段得到的邮件地址是X400地址要求转换为SMTP邮件地址。

 

我经过试验,有以下两种办法做这种转换:

第一个:使用共享软件Redemption

第二个:直接用ADOActive Directory中查询。

 

对于第一种办法,需要像注册普通COM组件一样注册Redemption.DLL

这个组件可以在

http://www.dimastr.com/redemption/

下载。

但是,这个组件分为两种版本:Developer VersionDistributable Version。前者不允许从事商业行为,后者购买需要199美元。

使用它得到SMTP邮件地址的办法在

http://www.outlookcode.com/d/code/getsenderaddy.htm#redemption

说得很明白了,我下面只是给出一个类似的R_GetSenderAddress方法:

Private Function R_GetSenderAddress(ByRef oSafeMailItem, ByVal nRecipentIndex) As String

  Dim strType

  Dim objSenderAE As Redemption.AddressEntry

 

  Const PR_SENDER_ADDRTYPE = &HC1E001E

  Const PR_EMAIL = &H39FE001E

 

  Set objSenderAE = oSafeMailItem.Recipients.Item(nRecipentIndex).AddressEntry

  If Not objSenderAE Is Nothing Then

    strType = objSenderAE.Type

    If strType = "SMTP" Then

      R_GetSenderAddress = objSenderAE.Address

    ElseIf strType = "EX" Then

      R_GetSenderAddress = objSenderAE.Fields(PR_EMAIL)

    End If

   End If

 

   Set objSenderAE = Nothing

End Function

 

对于第二种办法,可能麻烦一点,其运行效率还和Active Directory有关。由于这种ADO Query AD原理非常简单,所以我就直接用代码说明了:

' 方法解释:

' 方法名:R_GetSenderAddress

' 功能:从X400的邮件地址解析出用户的SMTP邮件地址

' 由于Exchange Server User的邮件地址类型是EX,而且展现为

' /O=TOMORROW/OU=TRT/CN=RECIPIENTS/CN=Zhengyun

' 形式。

' 我们需要把这个地址转换为SMTP地址,但是由于OutlookLibrary并没有提供这一功能,

' 所以我必须自己去AD查询了

Private Function R_GetSenderAddress(ByRef strX400Address) As String

    Dim oRootDSE 'As IADs

    Dim objUser  ' As IADsUser

    '

    ' 以下注意,connection,command对象不能用createobject创建,否则查询不出来

    ' 只能new!

    Dim oConnection As New ADODB.Connection

    Dim oCommand As New ADODB.Command

    '

    Dim RS  ' As ADODB.Recordset

    Dim strQuery As String, strAlias As String

    Dim varDomainNC As Variant

       

    On Error Resume Next

    ' To do: change to the alias for the mailbox you are looking for.

    Dim arrX400

    arrX400 = Split (UCase$(strX400Address), "/CN=")

   

    ' 取到最后的用户的姓名:

    strAlias = arrX400(UBound(arrX400))

   

    If Len(strAlias) > 0 Then

        ' Get the Configuration Naming Context.

        Set oRootDSE = GetObject("LDAP://RootDSE")

        varDomainNC = oRootDSE.Get("defaultNamingContext")

        ' Open the Connection

        oConnection.Provider = "ADsDSOObject"

        oConnection.Open "ADs Provider"

       

        ' Build the query to find the user based on their alias.

        strQuery = "

       

        oCommand.ActiveConnection = oConnection

        oCommand.CommandText = strQuery

        Set RS = oCommand.Execute

       

        If RS.RecordCount = 0 Then

            R_GetSenderAddress = ""

        Else

            ' Iterate through the results.

            Do

                Set objUser = GetObject(RS.Fields("adspath"))

                ' 拿到了他的真正SMTP邮件地址:

                R_GetSenderAddress = objUser.EmailAddress

                Set objUser = Nothing

                Exit Do

            Loop While RS.EOF

          End If

    Else

        R_GetSenderAddress = ""

    End If

   

    Set oRootDSE = Nothing

    Set oCommand = Nothing

    Set oConnection = Nothing

    Set RS = Nothing

    On Error GoTo 0

End Function

 

 

Writen by zhengyun.NoJunk(at)gmail.dot.com

Disclaimers

Programmer’s Blog List

博客堂

小气的神

ASPCOOLBlog

博客园

Don Box's Blog

Eric.Weblog()

The .NET Guy

Blogs@asp.net

 

本文档仅供参考。本文档所包含的信息代表了在发布之日,zhengyun对所讨论问题的当前看法,zhengyun不保证所给信息在发布之日以后的准确性。

用户应清楚本文档的准确性及其使用可能带来的全部风险。可以复制和传播本文档,但须遵守以下条款:

  1. 复制时不得修改原文,复制内容须包含所有页
  2. 所有副本均须含有 zhengyun的版权声明以及所提供的其它声明
  3. 不得以赢利为目的对本文档进行传播

 



Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=36393


### 如何通过串口查询网口地址 要通过串口查询网口地址,需理解两者的工作机制以及它们之间可能存在的交互逻辑。以下是关于此主题的具体说明: #### 1. 基础概念 - **串口通信**是指一种逐位传输数据的方式,适用于低速率、短距离的数据交换[^1]。 - **网口通信**则是基于网络协议(如TCP/IP),能够实现更高速率和更大范围的通信。 当需要通过串口查询网口地址时,实际上是在利用串口作为媒介来获取与网口相关的配置信息或状态。 --- #### 2. 实现方法概述 为了完成这一目标,通常会借助特定硬件模块或者软件程序的支持。例如,某些嵌入式设备内置了串口转网口的功能模块,这些模块允许用户通过串口命令访问并修改其内部IP地址或其他网络参数[^2]。 具体来说,可以通过以下几种途径实现: - 使用专门设计好的固件指令集; - 编程开发自定义的应用层解决方案; --- #### 3. 技术细节分析 假设存在一个支持串口转网口功能的中间设备,则可通过向该设备发送预定义格式的消息请求当前所使用的网口地址。下面展示了一种典型场景下的操作流程及其对应的伪代码示例。 ##### (a) 发送AT Command 或者其他定制化命令序列至目标装置 这类命令往往被用来调试无线路由器、调制解调器或者其他联网终端产品。如果我们的串口转网口芯片也提供了类似的接口服务的话,那么就可以尝试采用这种方式来进行探测工作。 ```cpp // C++ Example Code Snippet for Sending AT Commands via Serial Port #include <windows.h> #include <iostream> void SendCommand(HANDLE hSerial, const char* command){ DWORD bytesWritten; WriteFile(hSerial,command,strlen(command),&bytesWritten,NULL); } int main(){ HANDLE hSerial = CreateFile("COM1",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(hSerial==INVALID_HANDLE_VALUE){ std::cerr << "Error opening serial port."<<std::endl; return -1; } DCB dcb={sizeof(DCB)}; GetCommState(hSerial,&dcb); dcb.BaudRate=9600; // Set baud rate to match device settings. SetCommState(hSerial,&dcb); SendCommand(hSerial,"AT+CIFSR\r\n"); // Hypothetical example of an IP address query command. CloseHandle(hSerial); } ``` 上述例子展示了如何构建简单的Windows应用程序以执行基本的任务——打开指定名称的端口(COMX),调整波特率等初始化选项之后再发出一条字符串形式的标准询问语句(AT+CIFSR代表查找自己的公网IPv4地址)[^3]. 请注意实际应用中的语法可能会有所不同取决于具体的制造商文档指南。 ##### (b) 解析返回的结果包 一旦成功触发远程实体响应后,下一步就是解析反馈过来的信息流以便提取有用的字段比如MAC Address或者是IPAddress等等属性值。 --- #### 4. 软件框架推荐 对于更加复杂的项目需求而言,可以直接参考开源社区分享出来的成熟作品学习借鉴经验教训。像之前提到过的那篇论文就描述过一套完整的架构体系结构图包括图形界面部分的设计思路[^4]: ![MultiPort_SerialToNet](https://via.placeholder.com/800x400?text=Diagram+of+Multiport+Serial+to+Network) 这种类型的系统不仅限于单一方向上的映射关系处理而是双向同步更新机制保障实时性效果最佳用户体验感受良好稳定可靠程度高值得深入研究探讨价值非凡意义重大影响深远前景广阔潜力无限未来可期! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值