【问题标题】:Send Email From Alternate/Shared Mailbox with Webservices.ExchangeService使用 Webservices.ExchangeService 从备用/共享邮箱发送电子邮件
【发布时间】:2015-01-03 04:09:57
【问题描述】:

我搜索了很多,只能找到如何从 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()

我开始认为消息对象可能必须设置某些属性,使其看起来像是来自 email1 但实际上是从我的主帐户发送的,但这是官方/最佳方式吗?如果是这样,我应该设置哪些属性以使它看起来像是来自另一个邮箱?

我假设我会手动将邮件保存到共享邮箱的已保存文件夹中。

谢谢。

【问题讨论】:

  • 您是否考虑过使用SMTPClient
  • 只是一个疯狂的猜测:可能共享邮箱是不够的,你需要“委托访问”

标签: .net vb.net email exchangewebservices


【解决方案1】:

我只是来这里发布我的最终代码的决议。由于服务器不允许模拟,所以我使用以下代码(我找到了here)。长期以来让我感到困惑的是,该链接中的示例不仅仅使用了您要保存文档的电子邮件地址。我没想过只提供电子邮件本身,因为作者提供的示例有很多额外内容。

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

【讨论】:

    【解决方案2】:

    如果您希望将消息保存到共享帐户的已发送文件夹(在 C# 中),请尝试以下代码:

    var folderId = new FolderId(WellKnownFolderName.SentItems, new Mailbox("email2@domain.com"));
    message.SendAndSaveCopy(folderId);
    

    我没有尝试过上面的代码,但请告诉我它对你的效果。

    【讨论】:

    • 这有助于我将电子邮件信息保存在共享邮箱的已发送项目中。
    【解决方案3】:

    我找到了解决我自己问题的方法,只需将“发件人”字段设置为我希望收件人看到电子邮件的来源,并将相同的地址添加到回复列表的列表中。我还必须获得对共享文件夹的接收/发送访问权限,我最初只获得了读取访问权限,这会导致 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
    

    我仍然需要了解如何将邮件保存到已发送文件夹,但还没有找到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      • 2022-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多