0

이전에 이전 게시물 (참조 : 하이퍼 링크)을 참조하고 있습니다. 나는 어떤 의견을 더할 수 없었고, 내 문제가 약간 다르기 때문에 답장을 쓰는 것도 고려하지 않았다. 잘못된 섹션에 게시하거나이 주제에 대한 새 스레드를 여는 경우,이 포럼에 아직 미흡합니다.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

, 본 코드는 솔루션을 제공한다. 따라서이 답변을 표시 하고이 스레드를 닫으려면 (나는 보통, 하나는 답변으로 자신의 답변을 표시하지 않아야 알고) 싶습니다. 희망이 접근 방식은 좋습니다. 도와 주셔서 감사합니다.

관련 문제