【问题标题】:Using IMAP in VB.Net to retrieve Mails from MS Exchange Server在 VB.Net 中使用 IMAP 从 MS Exchange Server 检索邮件
【发布时间】:2017-05-09 13:44:13
【问题描述】:

我指的是过去某处的上一篇文章(参见超链接)。我无法添加任何 cmets,也没有考虑写回复,因为我的问题略有不同。如果我在错误的版块中发帖或为此主题打开新帖子,请原谅,我还是这个论坛的新手。

请让我说明以下问题:与post 类似,我想从 MS Exchange Server 访问和检索电子邮件和附件。我主要使用了上面超链接中提供的代码,但是我无法连接到邮件服务器(我使用了587端口)。在我看来有一个成功的连接,但代码在到达以下行时停止

Dim Read_Stream2 = New StreamReader(Sstream)

表示无法读取数据流。

我也有关于这个特定行的问题,因为我无法弄清楚为什么需要将 NetworkStream 转换为 SslStream 然后转换为 StreamReader 对象。有人可以解释一下这种必要性吗?

至于剩下的问题,请考虑我到目前为止的代码。如果使用 IMAP 可能太麻烦,我也欢迎有关如何使用 POP3 实现此目标的提示。 预先感谢您提供的任何帮助。

Imports System.Net.Sockets
Imports System.IO
Imports System.Text
Imports System.Net.Security

Public Class emailDownloader

Dim ServerNm As String
Dim UsrNm As String
Dim PassStr As String
Dim _IntPort As Integer
Dim ImapClient As New Net.Sockets.TcpClient
Dim NetworkS_stream As NetworkStream
Dim m_sslStream As SslStream
Dim Read_Stream As StreamReader
Dim StatResp As String
Dim m_buffer() As Byte

Function Login(ByVal Sstream As SslStream, ByVal Server_Command As String)
    ImapClient = New TcpClient(ServerNm, _IntPort)
    NetworkS_stream = ImapClient.GetStream 'Read the stream

    Sstream = New SslStream(NetworkS_stream)

    Dim Read_Stream2 = New StreamReader(Sstream)
    Server_Command = Server_Command ' + vbCrLf
    m_buffer = System.Text.Encoding.ASCII.GetBytes(Server_Command.ToCharArray())
    Sstream.Write(m_buffer, 0, m_buffer.Length)
    Dim Server_Reponse As String
    Server_Reponse = Read_Stream2.ReadLine()
    Return Server_Reponse

End Function

Private Sub btnStart_Click(sender As System.Object, e As System.EventArgs) Handles btnStart.Click
    lbMailsRetrieved.Items.Clear()
    ServerNm = tbServerName.Text
    _IntPort = tbPortName.Text
    UsrNm = tbUserName.Text
    PassStr = tbPasswort.Text
    StatResp = Login(m_sslStream, "LOGIN " + UsrNm + " " + PassStr + " ") & vbCrLf
    lbMailsRetrieved.Items.Add(StatResp)
End Sub

结束类

有一个最初用 C# 编写的解决方案,可以在 here 找到。我稍微修改了代码,它可以用于交换(仅此而已)。

Imports Microsoft.Exchange.WebServices.Data
Imports System.Collections.Generic
Imports System.ComponentModel  
Imports System.Data
Imports System.Drawing
Imports System.Linq
Imports System.Net.Sockets
Imports System.Text
Imports System.Threading.Tasks
Imports System.Windows.Forms


Namespace ReadMailFromExchangeServer

Public Class Form1
    Inherits Form
    Private exchange As ExchangeService

    Public Sub New()
        InitializeComponent()
        lstMsg.Clear()
        lstMsg.View = View.Details
        lstMsg.Columns.Add("Date", 150)
        lstMsg.Columns.Add("From", 250)
        lstMsg.Columns.Add("Subject", 400)
        lstMsg.Columns.Add("Has Attachment", 50)
        lstMsg.Columns.Add("Id", 100)

        lstMsg.FullRowSelect = True
    End Sub

    Private Sub btnRead_Click(sender As Object, e As EventArgs) Handles btnRead.Click
        ConnectToExchangeServer()
        'Dim ts As New TimeSpan(0, -1, 0, 0)
        'Dim [date] As DateTime = DateTime.Now.Add(ts)
        'Dim filter As New SearchFilter.IsGreaterThanOrEqualTo(ItemSchema.DateTimeReceived, [date])

        If exchange IsNot Nothing Then
            Dim findResults As FindItemsResults(Of Item) = exchange.FindItems(WellKnownFolderName.Inbox, New ItemView(50))
            'Original
            'Dim findResults As FindItemsResults(Of Item) = exchange.FindItems(WellKnownFolderName.Inbox, filter, New ItemView(50))
            For Each item As Item In findResults

                Dim message As EmailMessage = EmailMessage.Bind(exchange, item.Id)
                Dim listItem As New ListViewItem({message.DateTimeReceived.ToString(), _
                                         message.From.Name.ToString() + _
                                         "(" + message.From.Address.ToString() + ")", _
                                         message.Subject, (If((message.HasAttachments), "Yes", "No")), _
                                         message.Id.ToString()})
                lstMsg.Items.Add(listItem)
            Next
            If findResults.Items.Count <= 0 Then

                lstMsg.Items.Add("No Messages found!!")
            End If
        End If

    End Sub

    Public Sub ConnectToExchangeServer()

        lblMsg.Text = "Connecting to Exchange Server.."
        lblMsg.Refresh()
        Try
            exchange = New ExchangeService(ExchangeVersion.Exchange2007_SP1)
            exchange.Credentials = New WebCredentials("abc", "xyz")
            exchange.AutodiscoverUrl("efg")

            lblMsg.Text = "Connected to Exchange Server : " + exchange.Url.Host

            lblMsg.Refresh()
        Catch ex As Exception
            lblMsg.Text = "Error Connecting to Exchange Server!!" + ex.Message
            lblMsg.Refresh()
        End Try

    End Sub

    Private Sub btnLoadAttachment_Click(sender As Object, e As EventArgs) Handles btnLoadAttachment.Click
        If exchange IsNot Nothing Then
            If lstMsg.Items.Count > 0 Then
                Dim item As ListViewItem = lstMsg.SelectedItems(0)

                If item IsNot Nothing Then
                    Dim msgid As String = item.SubItems(4).Text.ToString()
                    Dim message As EmailMessage = EmailMessage.Bind(exchange, New ItemId(msgid))
                    If message.HasAttachments AndAlso TypeOf message.Attachments(0) Is FileAttachment Then
                        Dim fileAttachment As FileAttachment = TryCast(message.Attachments(0), FileAttachment)
                        'Change the below Path    
                        fileAttachment.Load("C:[my_path]" + fileAttachment.Name)
                        lblAttach.Text = "Attachment Downloaded : " + fileAttachment.Name
                    Else
                        MessageBox.Show("No Attachments found!!")
                    End If
                Else
                    MessageBox.Show("Please select a Message!!")
                End If
            Else
                MessageBox.Show("Messages not loaded!!")

            End If
        Else
            MessageBox.Show("Not Connected to Mail Server!!")
        End If
    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs)

    End Sub


    Private Sub InitializeComponent()
        Me.btnRead = New System.Windows.Forms.Button()
        Me.lstMsg = New System.Windows.Forms.ListView()
        Me.btnLoadAttachment = New System.Windows.Forms.Button()
        Me.lblMsg = New System.Windows.Forms.Label()
        Me.label1 = New System.Windows.Forms.Label()
        Me.lblAttach = New System.Windows.Forms.Label()
        Me.SuspendLayout()
        '
        'btnRead
        '
        Me.btnRead.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None
        Me.btnRead.FlatStyle = System.Windows.Forms.FlatStyle.Flat
        Me.btnRead.Location = New System.Drawing.Point(39, 284)
        Me.btnRead.Name = "btnRead"
        Me.btnRead.Size = New System.Drawing.Size(174, 23)
        Me.btnRead.TabIndex = 0
        Me.btnRead.Text = "Read Mails"
        Me.btnRead.UseVisualStyleBackColor = True
        '
        'lstMsg
        '
        Me.lstMsg.Location = New System.Drawing.Point(27, 70)
        Me.lstMsg.Name = "lstMsg"
        Me.lstMsg.Size = New System.Drawing.Size(664, 191)
        Me.lstMsg.TabIndex = 1
        Me.lstMsg.UseCompatibleStateImageBehavior = False
        '
        'btnLoadAttachment
        '
        Me.btnLoadAttachment.FlatStyle = System.Windows.Forms.FlatStyle.System
        Me.btnLoadAttachment.Location = New System.Drawing.Point(517, 284)
        Me.btnLoadAttachment.Name = "btnLoadAttachment"
        Me.btnLoadAttachment.Size = New System.Drawing.Size(174, 23)
        Me.btnLoadAttachment.TabIndex = 2
        Me.btnLoadAttachment.Text = "Load Attachments"
        Me.btnLoadAttachment.UseVisualStyleBackColor = True
        '
        'lblMsg
        '
        Me.lblMsg.AutoSize = True
        Me.lblMsg.Location = New System.Drawing.Point(36, 361)
        Me.lblMsg.Name = "lblMsg"
        Me.lblMsg.Size = New System.Drawing.Size(38, 13)
        Me.lblMsg.TabIndex = 3
        Me.lblMsg.Text = "Ready"
        '
        'label1
        '
        Me.label1.AutoSize = True
        Me.label1.Location = New System.Drawing.Point(24, 54)
        Me.label1.Name = "label1"
        Me.label1.Size = New System.Drawing.Size(82, 13)
        Me.label1.TabIndex = 4
        Me.label1.Text = "Today's Messages"
        '
        'lblAttach
        '
        Me.lblAttach.AutoSize = True
        Me.lblAttach.Location = New System.Drawing.Point(514, 361)
        Me.lblAttach.Name = "lblAttach"
        Me.lblAttach.Size = New System.Drawing.Size(148, 13)
        Me.lblAttach.TabIndex = 5
        Me.lblAttach.Text = "No attachmment downloaded"
        '
        'Form1
        '
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(812, 591)
        Me.Controls.Add(Me.lblAttach)
        Me.Controls.Add(Me.label1)
        Me.Controls.Add(Me.lblMsg)
        Me.Controls.Add(Me.btnLoadAttachment)
        Me.Controls.Add(Me.lstMsg)
        Me.Controls.Add(Me.btnRead)
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.ResumeLayout(False)
        Me.PerformLayout()

    End Sub
    Friend WithEvents btnRead As System.Windows.Forms.Button
    Friend WithEvents lstMsg As System.Windows.Forms.ListView
    Friend WithEvents btnLoadAttachment As System.Windows.Forms.Button
    Friend WithEvents lblMsg As System.Windows.Forms.Label
    Friend WithEvents label1 As System.Windows.Forms.Label
    Friend WithEvents lblAttach As System.Windows.Forms.Label
End Class

结束命名空间

【问题讨论】:

  • 忘了说上面的代码没有使用 IMAP,但是它完成了工作。

标签: vb.net email network-programming protocols exchange-server


【解决方案1】:

对于开头描述的问题,本代码提供了解决方案。因此,我想将此标记为答案并关闭此线程(我知道,通常不应该将自己的答案标记为答案)。希望这种方法没问题。

【讨论】:

    猜你喜欢
    • 2012-07-21
    • 2013-12-02
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 2012-08-08
    • 2010-09-07
    相关资源
    最近更新 更多