Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Exchange插件--如何使用C#获取发送电子邮件的发件人的电子邮件地址?

Exchange插件--如何使用C#获取发送电子邮件的发件人的电子邮件地址?
EN

Stack Overflow用户
提问于 2020-11-25 06:10:52
回答 2查看 995关注 0票数 6

在这方面已经有几个问题,但我面临的是另一个问题。在其他问题上发布的解决方案对我无效,我怀疑原因是我试图获取发送者的电子邮件地址,而不是从其他人发送的电子邮件地址,并且位于邮件文件夹中。

我想做的是

简单地说,我正在编写一个Outlook插件,它连接到"ItemSend“事件,并运行一个函数来显示发送者的电子邮件(SMTP)地址,当他们单击电子邮件上的”发送“。

问题

当从Exchange邮箱发送电子邮件时,我无法获得SMTP地址。相反,mail.SenderEmailAddresss提供一个X400地址,我发现的其他方法要么给出异常,要么根本不返回电子邮件地址。

GetSenderSMTPAddress(mail)提供空白输出

mail.SenderEmailAddresss的结果是:/o=Company Organisation/ou=Exchange Administrative Group (ABC123T)/cn=Recipients/cn=abc123-

mail.Sender.Address导致Exception thrown: 'System.NullReferenceException' in OutlookTesting.dll

我现在的密码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
namespace OutlookTesting
{
    public partial class ThisAddIn
    {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            this.Application.ItemSend += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_ItemSendEventHandler(Application_ItemSend);
        }

        void Application_ItemSend(object Item, ref bool Cancel)
        {
            if (Item is Outlook.MailItem)
            {
                Outlook.MailItem mail = (Outlook.MailItem)Item;
                Debug.WriteLine("Using GetSenderSMTPAddress function: " + GetSenderSMTPAddress(mail));
                Debug.WriteLine("Using mail.SenderEmailAddresss: " + mail.SenderEmailAddress);
                Debug.WriteLine("Using mail.Sender.Address: " + mail.Sender.Address);
            }
        }

        private string GetSenderSMTPAddress(Outlook.MailItem mail)
        {
            string PR_SMTP_ADDRESS =
                @"http://schemas.microsoft.com/mapi/proptag/0x39FE001E";
            if (mail == null)
            {
                throw new ArgumentNullException();
            }
            if (mail.SenderEmailType == "EX")
            {
                Outlook.AddressEntry sender = mail.Sender;
                if (sender != null)
                {
                    //Now we have an AddressEntry representing the Sender
                    if (sender.AddressEntryUserType ==
                        Outlook.OlAddressEntryUserType.
                        olExchangeUserAddressEntry
                        || sender.AddressEntryUserType ==
                        Outlook.OlAddressEntryUserType.
                        olExchangeRemoteUserAddressEntry)
                    {
                        //Use the ExchangeUser object PrimarySMTPAddress
                        Outlook.ExchangeUser exchUser =
                            sender.GetExchangeUser();
                        if (exchUser != null)
                        {
                            return exchUser.PrimarySmtpAddress;
                        }
                        else
                        {
                            return null;
                        }
                    }
                    else
                    {
                        return sender.PropertyAccessor.GetProperty(
                            PR_SMTP_ADDRESS) as string;
                    }
                }
                else
                {
                    return null;
                }
            }
            else
            {
                return mail.SenderEmailAddress;
            }
        }
        #region VSTO generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InternalStartup()
        {
            this.Startup += new System.EventHandler(ThisAddIn_Startup);
        }

        #endregion
    }
}

其他我试过的事情

我在这里尝试了解决方案:https://learn.microsoft.com/en-us/office/client-developer/outlook/pia/how-to-get-the-smtp-address-of-the-sender-of-a-mail-item。这不起作用,反而给出了一个NullReferenceException。

我也回到了假设默认邮箱是发送者电子邮件地址的假设,但是对于那些有多个邮箱的人来说,这是个坏主意。

闭幕式思想

我认为唯一的解决方案(第三方插件除外)将是循环遍历帐户上的每个邮箱,获取X400地址(如果交换邮箱)并放入一个带有电子邮件地址的数组。当一封电子邮件被发送时,从发送出去的电子邮件中获取X400,将其与帐户的X400匹配,然后我将有电子邮件地址。不过,目前还不确定这是否可能,甚至是一个像样的解决方案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-09 06:19:49

我得在附近找份工作。我仍然在问题中使用GetSenderSMTPAddress函数,但注意到如果它是次要邮箱,GetSenderSMTPAddress会正常工作,如果它是主邮箱,则为null,在这种情况下,您可以使用mailItem.SendUsingAccount.SmtpAddress

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (GetSenderSMTPAddress(mailItem) != null) // secondary or additional mailbox
{
    sendingAddress = GetSenderSMTPAddress(mailItem);
}
else //primary mailbox
{
    sendingAddress = mailItem.SendUsingAccount.SmtpAddress;
}
票数 1
EN

Stack Overflow用户

发布于 2020-12-07 15:34:09

这对我有用,希望它能帮上忙:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Microsoft.Office.Interop.Outlook.MailItem mailItem = Item as MailItem;
string smtp = mailItem.SendUsingAccount.SmtpAddress;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65006384

复制
相关文章
Vue 实现前进刷新,后退不刷新的效果
假设列表页为 list.vue,详情页为 detail.vue,这两个都是子组件。
谭光志
2020/09/28
3K0
RDP你的凭据不工作/RDP密码不刷新
如果你不属于上述的情况,请查看:https://learn.microsoft.com/zh-cn/windows-server/remote/remote-desktop-services/troubleshoot/rdp-error-general-troubleshooting#check-whether-a-group-policy-object-gpo-is-blocking-rdp-on-a-local-computer
阿龙w
2022/12/02
12.7K0
RDP你的凭据不工作/RDP密码不刷新
CDN刷新目录不生效?
选择 “刷新变更资源” 模式,当用户访问匹配目录下资源时,会回源获取资源的 Last-Modify 信息,若与当前缓存资源一致,则直接返回已缓存资源,若不一致,回源拉取资源并重新缓存;
任雯霄
2020/12/30
6.1K1
layui打开iframe窗口不刷新的问题
这个问题可能是我工作以来,最死磕不算bug的一个了,晚上熬夜到三点钟,终于找到了解决的办法。
王小婷
2019/04/29
4K0
layui打开iframe窗口不刷新的问题
vue 参数变化页面不刷新
查询参数变化,不刷新 http://localhost:8081/#/detail?id=1 http://localhost:8081/#/detail?id=2 参数变化,不刷新 http://
onety码生
2018/11/21
2.5K0
js – form表单提交不刷新
大家已经发现了, 当我们点击submit提交form表单的时候, 他会刷新一次, 如果不想它刷新的话有下面两种方法:
全栈程序员站长
2022/08/01
14.6K0
WPF 的 VisualBrush 只刷新显示的视觉效果,不刷新布局范围
WPF 的 VisualBrush 可以帮助我们在一个控件中显示另一个控件的外观。这是非常妙的功能。
walterlv
2023/10/22
4450
WPF 的 VisualBrush 只刷新显示的视觉效果,不刷新布局范围
MVC3和MVC4中CRUD操作
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/116252.html原文链接:https://javaforall.cn
全栈程序员站长
2022/01/24
5070
控制器操作
一.控制器操作 我们首先复习一下基本的控制器定义和方法执行方式。 第一步:控制器默认创建在当前模块下的 Controller 目录下; 第二步:按照指定的命名规则:控制器名(首字母大写)+Controller.class.php; 第三步:控制器里的方法必须是 public 公共的; //控制器 class UserController extends Controller { public function index() { //index()方法在URL访问时可以忽略 } } URL 访问:http://localhost/demo39/User/index/
PM吃瓜
2019/08/13
6470
Vue 改变数据,页面不刷新的问题
最近在用 element-ui 开发一个网站,使用 table 组件时,发现修改完数据,有时候会延迟一两秒,页面才会发生变化。
谭光志
2020/09/28
3.4K0
vue强制刷新页面方法_vue页面回退不刷新
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/17
5K0
控制器操作【2】
三.跳转和重定向 ThinkPHP 在操作数据库时,需要跳转和重定向页面。ThinkPHP 提供了一组方法来解决了这个问题。 //成功和失败的跳转 class UserController extends Controller { public function index() { $flag = true; if ($flag) { //会跳转到:http://localhost/demo39/User/all $this->success('新增成功!', '../User/all'); } else { //会跳转到本页的上一页 $this->error('新增失败!'); } } } PS:success()方法和 error()方法,第一个参数是提示信息、第二个跳转的地址、第三个跳转时间。默认情况下 success()方法是 1 秒,error()方法是 3 秒。
PM吃瓜
2019/08/13
5730
控制器操作【3】
五.请求类型 ThinkPHP 提供了一组常量来判断当前请求是否是 GET、POST 等。通过判断请求处理不同的业务逻辑。 常量 含义 IS_GET 判断是否 GET 提交请求 IS_POST 判断是否 POST 提交请求 IS_PUT 判断是否 PUT 提交请求 IS_DELTE 判断是否 DELETE 提交请求 IS_AJAX 判断是否 AJAX 提交请求 //判断是否GET请求 if (IS_GET) { echo '是GET请求'; } else { echo '不是GET请求'; }
PM吃瓜
2019/08/13
5680
MVC3教程之新手入门
你还可以通过Web Platform Installer将这些软件一起安装到本地。
拓荒者IT
2019/09/26
1.5K0
MVC3教程之新手入门
git版本控制器的相关操作
git status 查看仓库状态 git diff <filename> 查看为提交的修改 git log 查看提交的日志 git log --pretty=oneline 单行显示
java攻城狮
2020/10/10
5490
git版本控制器的相关操作
学会这个小技巧,SSH 会话连接永远不超时!
通过指定时间间隔在客户端和服务器之间发送空数据包,可以避免 SSH 超时。 防止 SSH 客户端超时
iMike
2019/10/10
5.2K0
SDRAM控制器操作时序
IDLE 状态到WRITE 状态: ​ 1) 在IDLE 状态需要先给ACT 命令激活某一行,此时处于Row Active 状态; ​ 2) 在Row Active 状态之后,给Write 命令则会进入WRITE 状态; ​ 3) 在WRITE 状态后,再给一次Write 命令,就可以继续写入数据。 WRITE 状态到IDLE 状态: ​ 1) 在WRITE 状态给PRE 命令,则SDRAM 将跳出WRITE 状态进入Precharge状态; ​ 2) 在Precharge 状态后,就会自动进入IDLE 状态了。
全栈程序员站长
2022/09/16
7110
SDRAM控制器操作时序
已成功刷新dns解析缓存后怎么操作_刷新dns缓存的命令
步骤一、首先按住键盘win+R组合键,打开了一个运行窗口,之后在运行窗口上输入“CMD”命令,执行该命令即可打开命令提示符窗口了。
全栈程序员站长
2022/11/15
22K0
MVC 3.0 的新特性 摘要
MVC经过其1.0和2.0版本的发展,现在已经到了3.0的领军时代,随着技术的不断改进,MVC也越来越成熟。使开发也变得简洁人性化艺术化。
Isaac Zhang
2019/09/10
2.6K0
MVC 3.0 的新特性

            摘要
点击加载更多

相似问题

用于检查按下的键的函数的setTimeout (javascript)

10

函数键按下javascript

13

按下Javascript多个键

32

使用javascript按下"Delete“键?

413

扩展javascript键按下函数

35
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文