2017-05-09 14 views
0

私は以前の投稿を参照しています(cf.ハイパーリンク参照)。私は何かコメントを追加することはできませんでした。私が間違ったセクションに投稿した場合、またはこのトピックに関する新しいスレッドを開く場合は、私はまだこのフォーラムを初めて利用しています。VB.NetでIMAPを使用してMS Exchange Serverからメールを取得する

私は以下の問題を説明します: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 

エンドクラス

here見つけることができ、最初はC#でプログラムされたソリューションは、ありました。私はコードを少し修正し、交換のために働いています(そして、それだけです)。

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 

エンド名前空間

+0

上記のコードはIMAPを使用していないと言われていますが、仕事は終わりです。 – Sasquatch

答えて

0

冒頭に記載されている問題については、現在のコードは、ソリューションを提供します。したがって、私はこれが答えであり、このスレッドを閉じることをマークしたいと思います(私は知っています、通常、答えとして自分の答えをマークしてはいけません)。 このアプローチはうまくいきたいと考えています。 あなたのお手伝いに感謝します。

関連する問題