Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在没有邮箱的情况下使用带有windows身份验证和标识的EWS发送和保存电子邮件?_C#_Exchangewebservices - Fatal编程技术网

C# 如何在没有邮箱的情况下使用带有windows身份验证和标识的EWS发送和保存电子邮件?

C# 如何在没有邮箱的情况下使用带有windows身份验证和标识的EWS发送和保存电子邮件?,c#,exchangewebservices,C#,Exchangewebservices,我的设想是: 我使用服务帐户和windows身份验证连接到Exchange Web服务(EWS) 我不使用模仿 服务帐户没有邮箱 我连接到邮箱“MyMailbox”以阅读和发送电子邮件。每当我发送电子邮件时,我都使用sendandcopy(),指定要保存的MyMailbox的SentItems文件夹。不指定文件夹sendandcopy()会失败,这是可以理解的,因为没有邮箱链接到我的服务帐户来保存电子邮件 有时我想以另一个用户的身份发送或代表另一个用户发送,因此我将From属性设置为该用户的主

我的设想是:

  • 我使用服务帐户和windows身份验证连接到Exchange Web服务(EWS)
  • 我不使用模仿
  • 服务帐户没有邮箱
  • 我连接到邮箱“MyMailbox”以阅读和发送电子邮件。每当我发送电子邮件时,我都使用
    sendandcopy()
    ,指定要保存的MyMailbox的SentItems文件夹。不指定文件夹
    sendandcopy()
    会失败,这是可以理解的,因为没有邮箱链接到我的服务帐户来保存电子邮件
  • 有时我想以另一个用户的身份发送或代表另一个用户发送,因此我将
    From
    属性设置为该用户的主SMTP地址
在这种情况下,在我发送带有附件的电子邮件之前,一切正常。在这种情况下,当作为没有邮箱的帐户发出请求时,它会失败,原因是
ResponseCode=ErrorMissingEmailAddress
MessageText=必须为任何可分辨的文件夹ID指定邮箱主SMTP地址。

查看从my
SendAndSaveCopy()
发送的SOAP消息,我可以看到当我有一个附件时,它是完全不同的-注意
MessageDisposition=“SaveOnly”


我的测试邮件主题
....
而在不带附件发送时,它具有
。EWS先保存电子邮件,然后再发送,这似乎是合理的。事实上,政府说

如果邮件包含未保存的附件,则此方法不起作用。在这种情况下,必须先保存消息,然后再发送

尽管当我以具有邮箱的身份连接时,
SendAndSaveCopy()
似乎工作正常,并且显示调用
SendAndSaveCopy()
,而无需任何临时步骤。该示例特别指出,
sendandcopy()
导致对EWS的三个调用:CreateItem、CreateAttachment和SendItem

我的主要问题是:当我有附件时,我应该如何调用EWS来实现与
SendAndSaveCopy()相同的功能

第二个问题:这是一个bug吗?
SendAndSaveCopy()
在给定文件夹ID时,不应该将该文件夹用于CreateItem调用吗

我正在使用EWS 15.0.0.0并指定Exchange2010_SP2 api版本

更新:

进一步检查后,我发现EWS管理的API在有附件且我使用用户名和密码身份验证时,也会对
SendAndSaveCopy()
发出多个EWS调用。我看到两条新闻消息:

  • 第一个有
    ,特别是没有
    SavedItemFolderId
    。那么它保存在哪里呢!?我猜它已保存到当前用户邮箱的默认位置,但在我的windows身份验证方案中失败,因为没有当前用户邮箱
  • 来自此的响应为保存的邮件及其保存的附件提供ItemId
  • 第二个EWS调用具有
    ,并且还设置了
    SavedItemFolderId
我仍然觉得这是
sendandcopy()
中的一个bug或缺少的功能:它应该使用指定的文件夹位置来保存临时消息。但在任何情况下,我应该使用什么EWS管理的API调用来获得所需的效果

第一个具有并且明显没有SavedItemFolderId。那么它保存在哪里呢!?我猜它已保存到当前用户邮箱的默认位置,但在我的windows身份验证方案中失败,因为没有当前用户邮箱

默认保存位置是您正在使用的安全主体邮箱的草稿文件夹。EWS是一个客户端API,因此您看到的行为是围绕您希望普通电子邮件客户端执行的操作而设计的

如果您希望发送带有附件的消息而不使用中间步骤,则可以对要使用附件发送的消息进行MIME编码,然后通过一次呼叫发送消息,例如

EmailMessage test2 = new EmailMessage(service);
String bodyContent = "<html><head><meta http-equiv=\"Content-type\" content=\"text/html;charset=UTF-8\">Hello World</head><body></body></html> ";

CDO.Message msMessage = new CDO.Message();
msMessage.BodyPart.Charset = "UTF-8";
msMessage.HTMLBody = bodyContent;
msMessage.HTMLBodyPart.Charset = "UTF-8";
msMessage.AddAttachment("c:\\temp\\Document.docx");
ADODB.Stream asMessageStream = msMessage.GetStream();
asMessageStream.Type = ADODB.StreamTypeEnum.adTypeBinary;
byte[] bdBinaryData1 = new byte[asMessageStream.Size];
bdBinaryData1 = (byte[])asMessageStream.Read(asMessageStream.Size);
service.TraceEnabled = true;
test2.MimeContent = new MimeContent("UTF-8", bdBinaryData1);
test2.ToRecipients.Add("user@domain.com");
test2.Subject = "test";
test2.SendAndSaveCopy();
emailmessagetest2=新的EmailMessage(服务);
字符串bodyContent=“Hello World”;
CDO.Message msMessage=new CDO.Message();
msMessage.BodyPart.Charset=“UTF-8”;
msMessage.HTMLBody=bodyContent;
msMessage.HTMLBodyPart.Charset=“UTF-8”;
msMessage.AddAttachment(“c:\\temp\\Document.docx”);
ADODB.Stream asMessageStream=msMessage.GetStream();
asMessageStream.Type=ADODB.StreamTypeEnum.adTypeBinary;
byte[]bdBinaryData1=新字节[asMessageStream.Size];
bdBinaryData1=(字节[])asMessageStream.Read(asMessageStream.Size);
service.TraceEnabled=true;
test2.MimeContent=新的MimeContent(“UTF-8”,bdBinaryData1);
test2.ToRecipients.Add(“user@domain.com");
test2.Subject=“test”;
test2.SendAndSaveCopy();
干杯
格伦

太好了,谢谢@GlenScales。所以,如果我想模拟默认行为,我会使用CreateItem并保存到邮箱的草稿文件夹,然后调用SendItem并保存到SentItems文件夹?(即,不要使用上面的代码一次性发送,这不是一个特殊的要求)确保只要使用的帐户有权使用适用的文件夹,就可以正常工作
EmailMessage test2 = new EmailMessage(service);
String bodyContent = "<html><head><meta http-equiv=\"Content-type\" content=\"text/html;charset=UTF-8\">Hello World</head><body></body></html> ";

CDO.Message msMessage = new CDO.Message();
msMessage.BodyPart.Charset = "UTF-8";
msMessage.HTMLBody = bodyContent;
msMessage.HTMLBodyPart.Charset = "UTF-8";
msMessage.AddAttachment("c:\\temp\\Document.docx");
ADODB.Stream asMessageStream = msMessage.GetStream();
asMessageStream.Type = ADODB.StreamTypeEnum.adTypeBinary;
byte[] bdBinaryData1 = new byte[asMessageStream.Size];
bdBinaryData1 = (byte[])asMessageStream.Read(asMessageStream.Size);
service.TraceEnabled = true;
test2.MimeContent = new MimeContent("UTF-8", bdBinaryData1);
test2.ToRecipients.Add("user@domain.com");
test2.Subject = "test";
test2.SendAndSaveCopy();