C# VSTO Outlook 插件 - 如何使用 Exchange 获取外发电子邮件发件人的电子邮件地址?
C# VSTO Outlook plugin - How can I get the email address of the sender of an outgoing email using Exchange?
已经有一些关于此的问题,但我面临一个不同的问题。其他问题上发布的解决方案对我不起作用,我怀疑原因是我正在尝试获取外发电子邮件的发件人电子邮件地址,而不是从其他人发送并位于邮件文件夹中的电子邮件地址.
我想做什么
简而言之,我正在编写一个 Outlook 插件,它连接到“ItemSend”事件并运行一个函数来显示发件人在电子邮件上单击“发送”时的电子邮件 (SMTP) 地址。
问题
从 Exchange 邮箱发送电子邮件时,我无法获取 SMTP 地址。相反,mail.SenderEmailAddresss
给出一个 X400 地址,我发现的其他方法要么给出一个例外,要么根本不 return 一个电子邮件地址。
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
我目前的代码
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://docs.microsoft.com/en-us/office/client-developer/outlook/pia/how-to-get-the-smtp-address-of-the-sender-of-a-mail-item。这没有用,而是给出了 NullReferenceException。
我也退回到假设默认邮箱是发件人的电子邮件地址,但这对于拥有多个邮箱的人来说是个坏主意。
结束语
我认为唯一的解决方案(第 3 方插件除外)是遍历帐户上的每个邮箱,获取 X400 地址(如果交换邮箱)并将电子邮件地址放入一个数组中.发送电子邮件时,从外发电子邮件中获取 X400,将其与帐户的 X400 匹配,然后我将获得电子邮件地址。不确定这是否可行,甚至是一个不错的解决方案。
这对我有用,希望对您有所帮助:
Microsoft.Office.Interop.Outlook.MailItem mailItem = Item as MailItem;
string smtp = mailItem.SendUsingAccount.SmtpAddress;
我必须找到解决办法。我仍在问题中使用 GetSenderSMTPAddress
函数,但注意到 GetSenderSMTPAddress
如果它是辅助邮箱则可以正常工作,如果它是主邮箱则将为空,在这种情况下你可以使用 mailItem.SendUsingAccount.SmtpAddress
.
if (GetSenderSMTPAddress(mailItem) != null) // secondary or additional mailbox
{
sendingAddress = GetSenderSMTPAddress(mailItem);
}
else //primary mailbox
{
sendingAddress = mailItem.SendUsingAccount.SmtpAddress;
}
已经有一些关于此的问题,但我面临一个不同的问题。其他问题上发布的解决方案对我不起作用,我怀疑原因是我正在尝试获取外发电子邮件的发件人电子邮件地址,而不是从其他人发送并位于邮件文件夹中的电子邮件地址.
我想做什么
简而言之,我正在编写一个 Outlook 插件,它连接到“ItemSend”事件并运行一个函数来显示发件人在电子邮件上单击“发送”时的电子邮件 (SMTP) 地址。
问题
从 Exchange 邮箱发送电子邮件时,我无法获取 SMTP 地址。相反,mail.SenderEmailAddresss
给出一个 X400 地址,我发现的其他方法要么给出一个例外,要么根本不 return 一个电子邮件地址。
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
我目前的代码
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://docs.microsoft.com/en-us/office/client-developer/outlook/pia/how-to-get-the-smtp-address-of-the-sender-of-a-mail-item。这没有用,而是给出了 NullReferenceException。
我也退回到假设默认邮箱是发件人的电子邮件地址,但这对于拥有多个邮箱的人来说是个坏主意。
结束语
我认为唯一的解决方案(第 3 方插件除外)是遍历帐户上的每个邮箱,获取 X400 地址(如果交换邮箱)并将电子邮件地址放入一个数组中.发送电子邮件时,从外发电子邮件中获取 X400,将其与帐户的 X400 匹配,然后我将获得电子邮件地址。不确定这是否可行,甚至是一个不错的解决方案。
这对我有用,希望对您有所帮助:
Microsoft.Office.Interop.Outlook.MailItem mailItem = Item as MailItem;
string smtp = mailItem.SendUsingAccount.SmtpAddress;
我必须找到解决办法。我仍在问题中使用 GetSenderSMTPAddress
函数,但注意到 GetSenderSMTPAddress
如果它是辅助邮箱则可以正常工作,如果它是主邮箱则将为空,在这种情况下你可以使用 mailItem.SendUsingAccount.SmtpAddress
.
if (GetSenderSMTPAddress(mailItem) != null) // secondary or additional mailbox
{
sendingAddress = GetSenderSMTPAddress(mailItem);
}
else //primary mailbox
{
sendingAddress = mailItem.SendUsingAccount.SmtpAddress;
}