我搜索了很多,只能找到如何从Exchange中的共享/备用电子邮件帐户/邮箱获取收件箱邮件,但找不到如何从共享邮箱发送邮件。
基本需求是,在电子邮件的收件人看来,电子邮件来自"email2@domain.com'(这是我可以访问的共享邮箱),而不是我登录的主帐户('email1@domain.com’)。此外,已发送的电子邮件应保存在共享邮箱的已发送文件夹中。
exchange的工作方式是,您登录到您的主帐户,然后可以从该主帐户中打开其他共享邮箱(前提是您拥有访问权限)。如果我使用下面的代码,它仍然从我的email1@domain.com.
service = New ExchangeService(ExchangeVersion.Exchange2013)
service.Credentials = New NetworkCredential(username, _pw)
service.TraceEnabled = True
service.TraceFlags = TraceFlags.All
service.AutodiscoverUrl("email2@domain.com", AddressOf ValidateRedirectionUrlCallback)
Dim message As New EmailMessage(service)
message.Subject = subject
message.Body = body
For Each Item In _to
message.ToRecipients.Add(Item)
Next
For Each Item In AttachmentPaths
message.Attachments.AddFileAttachment(Item)
Next
message.SendAndSaveCopy()
我开始认为,也许消息对象必须具有某些属性,才能看起来像来自电子邮件1,但实际上是从我的主帐户发送的,但这是官方/最佳方式吗?如果是,我应该设置哪些属性以使其看起来来自另一个邮箱?
我想我会手动将邮件保存到共享邮箱的已保存文件夹中。
谢谢。
如果您想将消息保存到共享帐户的已发送文件夹(在C#中),请尝试以下代码:
var folderId = new FolderId(WellKnownFolderName.SentItems, new Mailbox("email2@domain.com"));
message.SendAndSaveCopy(folderId);
我还没有尝试过上面的代码,但请告诉我它是如何为您工作的。
我已经找到了解决我自己问题的方法,只需将"发件人"字段设置为我希望收件人看到电子邮件的发件人,并将相同的地址添加到回复列表中。我还必须获得对共享文件夹的接收/发送访问权限,我最初只获得读取访问权限,这导致saveandsendcopy
方法出现异常。
下面的代码。
Public Function Create(ByRef emailaddress As String, ByRef username As String, ByRef _domain As String, ByRef _pw As String) As Boolean
Try
service = New ExchangeService(ExchangeVersion.Exchange2013)
service.Credentials = New NetworkCredential(username, _pw)
service.TraceEnabled = True
service.TraceFlags = TraceFlags.All
service.AutodiscoverUrl(emailaddress, AddressOf ValidateRedirectionUrlCallback)
Return True
Catch ex As Exception
Return False
End Try
End Function
Public Function Send(ByRef subject As String, ByRef body As String, ByRef _to As List(Of String), ByRef AttachmentPaths As List(Of String), ByRef from As String) As Boolean
Try
Dim message As New EmailMessage(service)
message.From = New EmailAddress(from)
message.ReplyTo.Add(from)
message.Subject = subject
message.Body = body
For Each Item In _to
message.ToRecipients.Add(Item)
Next
For Each Item In AttachmentPaths
' Add a file attachment by using a stream.
Dim theStream As New FileStream(Item, FileMode.OpenOrCreate)
Dim pathparts As String() = Item.Split("")
' The streamed file attachment is named FourthAttachment.txt.
message.Attachments.AddFileAttachment(pathparts(pathparts.Count - 1), theStream)
Next
message.SendAndSaveCopy()
Return True
Catch ex As Exception
Return False
End Try
End Function
我仍然需要了解如何将邮件保存到已发送的文件夹中,但还没有找到。
我来这里只是为了发布我的解决方案和最终代码。由于服务器不允许模拟,我使用以下代码(我在这里找到的)。让我困惑了这么长时间的是,该链接中的示例使用的不仅仅是你想保存文档的电子邮件。我不想只提供电子邮件本身,因为作者给出的例子中有很多额外的内容
Public Function Send(ByRef subject As String, ByRef body As String, ByRef _to As List(Of String), ByRef AttachmentPaths As List(Of String), ByRef from As String) As Boolean
Try
Dim message As New EmailMessage(service)
message.From = New EmailAddress(from)
message.ReplyTo.Add(from)
message.Subject = subject
message.Body = body
For Each Item In _to
message.ToRecipients.Add(Item)
Next
For Each Item In AttachmentPaths
' Add a file attachment by using a stream.
Dim theStream As New FileStream(Item, FileMode.OpenOrCreate)
Dim pathparts As String() = Item.Split("")
' The streamed file attachment is named FourthAttachment.txt.
message.Attachments.AddFileAttachment(pathparts(pathparts.Count - 1), theStream)
Next
message.Save(New FolderId(WellKnownFolderName.Drafts, New Mailbox(from)))
message.SendAndSaveCopy(New FolderId(WellKnownFolderName.SentItems, New Mailbox(from)))
Return True
Catch ex As Exception
Return False
End Try
End Function