我有一个收件箱设置作为交换, hello@mycompany.com
此外,还有一个别名news@mycompany.com
,因此所有发送到该news
地址的电子邮件最终都会出现在hello
收件箱中.
理想情况下,我希望能够使用EWS告知发送电子邮件的别名.
当我向news@mycompany.com
Microsoft Outlook 发送电子邮件并检查邮件的Internet标头时,To:
标题会读取To: Hello <news@mycompany.com>
我想要查看的内容.
但是,使用EWS时,当我查看邮件的ToRecipients属性时,报告的电子邮件地址始终是主SMTP地址的电子邮件地址.此外,Webservices.Data.Item 的InternetMessageHeaders属性不包含该To:
属性.我似乎也看不到使用EWSEditor检查消息的所有属性的正确地址.
这个论坛帖子的答案似乎表明,
...有关邮件发送到的实际电子邮件地址的信息存储在收件人集合中,您无法在EWS中访问(在exportmessage之外)...
我将如何以编程方式执行此操作,以便找到正确的To:
地址?
exchange-server exchange-server-2007 exchangewebservices ews-managed-api
我试着在Exchange开发论坛上发布这个并没有得到任何回复,所以我会在这里试试.链接到论坛
我有一个Windows服务,每十五分钟触发一次,看看是否有任何需要创建或更新的订阅.我正在使用托管API v1.1对Exchange 2007 SP1.我有一个表存储所有希望监视邮箱的用户.因此,当通知进入"倾听服务"时,我能够查找用户并访问消息以将其记录到我们正在构建的应用程序中.在表中,我有以下列存储订阅信息:
我的服务调用一个函数来查询所需的数据(基于它正在做的功能).如果用户尚未订阅,则该服务将创建一个.我正在使用模拟来访问邮箱.这是我的"ActiveSubscription"方法,当用户需要创建或更新订阅时会触发该方法.
private void ActivateSubscription(User user)
{
if (user.ADGUID.HasValue)
{
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, Settings.ActiveDirectoryServerName, Settings.ActiveDirectoryRootContainer);
using (UserPrincipal up = UserPrincipal.FindByIdentity(ctx, IdentityType.Guid, user.ADGUID.Value.ToString()))
{
ewService.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SID, up.Sid.Value);
}
}
else
{
ewService.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, user.EmailAddress);
}
PushSubscription pushSubscription = ewService.SubscribeToPushNotifications(
new FolderId[] { WellKnownFolderName.Inbox, WellKnownFolderName.SentItems },
Settings.ListenerService, 30, user.Watermark,
EventType.NewMail, EventType.Created);
user.Watermark = pushSubscription.Watermark;
user.SubscriptionID = pushSubscription.Id;
user.SubscriptionStatusDateTime = DateTime.Now.ToLocalTime();
_users.Update(user);
} …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Exchange 2007 API查询特定用户的日历可用性.我的示例代码产生以下异常:
为FreeBusyViewOptions.TimeWindow指定的持续时间无效.
这是示例代码:
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
service.AutodiscoverUrl("email@domain.com");
DateTime startTime = new DateTime(2012, 1, 6, 7, 0, 0);
TimeWindow tw = new TimeWindow(startTime, startTime.AddHours(8));
GetUserAvailabilityResults result = service.GetUserAvailability(new List<AttendeeInfo> { new AttendeeInfo("email@domain.com") }, tw, AvailabilityData.FreeBusyAndSuggestions);
Run Code Online (Sandbox Code Playgroud)
奇怪的是,如果我用以下内容替换我的startTime赋值它可以工作:
DateTime startTime = DateTime.Now;
Run Code Online (Sandbox Code Playgroud)
我创建的DateTime对象与DateTime.Now生成的对象之间有什么区别.我在调试时仔细检查了它们,但找不到区别.
有任何想法吗?
我试图通过我们的内部 Exchange 2007 服务器(使用 SMTP)从 C# 控制台应用程序将自动电子邮件从计算机发送到同一域中的所有客户端,但我遇到了只允许经过身份验证的发件人的通讯组列表的障碍。基本上,我发送的邮件被 Exchange 拒绝:
#550 5.7.1 RESOLVER.RST.AuthRequired; authentication required ##rfc822;AuthTESTGroup@example.com
我正在使用System.Net.Mail.SmtpClient
Credentials 属性并将其设置为System.Net.CredentialCache.DefaultNetworkCredentials
,但在某个地方,运行此程序的帐户的凭据(我,具有有效邮箱的有效域用户)没有正确传递到 Exchange。
我使用它是System.Net.CredentialCache.DefaultNetworkCredentials
因为我不想对用户名或密码进行硬编码(无论是在代码本身还是在任何类型的配置文件中);我希望该进程使用 Windows 身份验证通过我们的 SMTP 服务器进行身份验证。
这是我用来重现问题的测试程序(域名已被匿名化):
using System;
using System.Net.Mail;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
var smtpClient = new SmtpClient
{
Host = "MAIL",
Port = 25,
DeliveryMethod = SmtpDeliveryMethod.Network,
Credentials = System.Net.CredentialCache.DefaultNetworkCredentials
};
var mailMessage = new MailMessage
{
Body = "Testing",
From = new MailAddress(Environment.UserName + "@example.com"),
Subject = …
Run Code Online (Sandbox Code Playgroud) 在使用 EWS Managed API 2.0 和 Exchange Server 2007 SP3 时,我遇到了一个奇怪的问题。
当我创建一个约会并保存它时,我使用以下代码获取它的 ID:
appointment.Save(SendInvitationsMode.SendToAllAndSaveCopy);
appointment.Id.UniqueId;
Run Code Online (Sandbox Code Playgroud)
我将它存储在我的本地数据库中,以便我以后可以使用它来更新会议或取消会议。
稍后当我想检索冲突的会议时,我使用以下代码:
CalendarView view = new CalendarView(Start, End);
view.PropertySet = new PropertySet();
Folder rootfolder = Folder.Bind(service, WellKnownFolderName.Calendar);
//view.PropertySet.Add(AppointmentSchema.Resources);
view.PropertySet.Add(ItemSchema.Id);
view.PropertySet.Add(AppointmentSchema.Subject);
view.PropertySet.Add(AppointmentSchema.Start);
view.PropertySet.Add(AppointmentSchema.Duration);
view.PropertySet.Add(AppointmentSchema.End);
view.PropertySet.Add(AppointmentSchema.Organizer);
view.PropertySet.Add(AppointmentSchema.Id);
Mailbox mailbox = new Mailbox(Email);
FolderId id = new FolderId(WellKnownFolderName.Calendar, mailbox);
CalendarFolder folder = CalendarFolder.Bind(service, id);
FindItemsResults<Appointment> findResults = folder.FindAppointments(view);
//Iterating through the conflicting meetings returned by folder.FindAppointments
foreach (Appointment app in findResults.Items)
{
appts.Rows.Add(app.Subject, app.Start, app.End, app.Duration, app.Id.UniqueId);
} …
Run Code Online (Sandbox Code Playgroud) 我们的C#Windows应用程序使用EWS Managed API 2.0在用户的日历中创建约会.每个约会都有一个具有独特价值的扩展属性.它稍后使用FindItems
和找到约会ItemView
.
用户在第一次执行此搜索时会遇到严重延迟.后续响应时间完全可以接受.
("第一次"在这里有点模糊,因为用户可能会在当天晚些时候再次遇到延迟)
// locate ID of appointment where extended property value equals 1234:
var filter = new Ews.SearchFilter.IsEqualTo(extendedPropertyDefinition, 1234);
var view = new ItemView(1, 0);
view.PropertySet = BasePropertySet.IdOnly;
var folder = new FolderId(WellKnownFolderName.Calendar, new Mailbox("..."));
var result = service.FindItems(folder, filter, view);
Run Code Online (Sandbox Code Playgroud)
远程服务器是Exchange Server 2007 SP1.
MSDN将一些评论与搜索文件夹和受限制的视图联系在一起,但我不确定这些是否适用于我们的情况.
的行为将着眼于一个文件夹中存储将创建搜索文件夹.创建搜索文件夹时,会将其缓存以供以后使用.如果用户尝试创建已存在的搜索文件夹,则使用缓存的搜索文件夹.这使得未来的观看速度相当快.默认情况下,Exchange不会无限期地缓存所有搜索文件夹.
特别是关于EWS:
同样重要的是要注意这样一个事实,即第一次发布Exchange存储搜索查询时,它将非常缓慢地运行并且可能超时,而在将来的运行中它将毫无问题地响应.这是由执行存储搜索时Exchange服务器上发生的后端进程引起的.
他们建议为非变化的非动态查询创建搜索文件夹,这在我们的案例中似乎不合适,因为每个约会的查询都不同.
如果应用程序需要具有一组固定不变参数的特定查询,则可以使用搜索文件夹.[...]搜索文件夹仅对不变的非动态查询有用.
我们需要的是在本质上创建一个"索引" - 在数据库中 - 在属性上,确保所有对这个特定属性的搜索都是快速的,无论时间或频率.
是否有可能"索引"这个属性?是否可以在客户端或服务器端配置任何内容以消除此初始延迟?
c# extended-properties exchange-server-2007 exchangewebservices
我试图在C#中运行EMC命令.我从我的个人电脑上运行它,它上面安装了交换管理工具.
我们的交换服务器已在2007上运行.
问题是,当我运行Powershell或EMC时,我需要以具有Exchange Server 2007权限的其他用户身份运行,因为我的个人配置文件没有这些权限.
话虽这么说,这是我在个人电脑上运行的代码:
RunspaceConfiguration config = RunspaceConfiguration.Create();
PSSnapInException snapEx = null;
PSSnapInInfo info = config.AddPSSnapIn("Microsoft.Exchange.Management.Powershell.Admin", out snapEx);
Runspace runspace = RunspaceFactory.CreateRunspace(config);
runspace.Open();
Command createCMD = new Command("Get-Mailbox ID");
Pipeline pipe = runspace.CreatePipeline();
pipe.Commands.Add(createCMD);
Collection<PSObject> results = pipe.Invoke();
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
Microsoft.Exchange.Management.Powershell.Admin
此计算机上未安装Windows PowerShell管理单元.
当我尝试添加Microsoft.Exchange.Management.Powershell.Admin
snapIn 时,我得到它.
我觉得这与我个人资料中的权限有关,但我不完全确定.如果是真的,我该如何解决这个问题.
编辑
我说它听起来像权限的原因是因为我能够打开PowerShell并添加snapin.但是,当我运行一个命令,如get-mailboxstatistics myUserId
它会抛出一个错误说不MyServer\MyStorageGroup
存在.但是,当我shift-rightCLick并以不同的用户身份运行并使用我的Exchange管理员帐户的凭据时,我可以运行这些命令.
我正在访问EWS日历中的约会与会者.我试过了:
cView.PropertySet = new PropertySet(AppointmentSchema.Subject,
AppointmentSchema.Start,
AppointmentSchema.End);
但是我的appointments
列表条目每个都返回null必需/可选参加者字段,即使多个用户已接受测试约会.我的假设是PropertySet需要包含更多ApplicationSchema
属性,如下所示:
cView.PropertySet = new PropertySet(AppointmentSchema.Subject,
AppointmentSchema.Start,
AppointmentSchema.End,
AppointmentSchema.RequiredAttendees,
AppointmentSchema.OptionalAttendees);
Run Code Online (Sandbox Code Playgroud)
但是,这会在calendar.FindAppointments(cView)上引发以下ServiceValidationException错误:
Microsoft.Exchange.WebServices.Data.ServiceValidationException: 无法在FindItem请求中使用属性RequiredAttendees.
如何修复此问题以appointments
包括必需/可选的与会者?
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
service.Credentials = new WebCredentials(emailAddress, emailPassword);
// Initialize values for the start and end times, and the number of appointments to retrieve.
DateTime startDate = DateTime.Now;
DateTime endDate = startDate.AddYears(1);
const int NUM_APPTS = 4;
// Initialize the calendar folder object with only the folder ID.
CalendarFolder calendar = CalendarFolder.Bind(service, …
Run Code Online (Sandbox Code Playgroud) 只要from和to地址都在我的域中,我就可以使用Exchange 2007中的典型C#SMTP代码发送电子邮件.
一旦我尝试在域外发送电子邮件,我就会得到:
异常详细信息:System.Net.Mail.SmtpFailedRecipientException:邮箱不可用.服务器响应为:5.7.1无法中继
我怎样才能让交换机接受我的电子邮件并将其发送到互联网?
我获得了一个传输代理的来源,该代理解析符合特定标准的传入电子邮件。我需要进行一些修改,但我需要跟踪变量并且我的调试尝试没有成功。
我构建了 dll,以交换方式安装它,设置了一个断点,然后附加到相关进程,但似乎没有发生任何事情。我对这种调试方法没有经验,我很确定我错过了一个步骤,但是我能找到的所有文档基本上都将过程列为这几个步骤。任何帮助?