Announcement

Collapse
No announcement yet.

Message-Id beim Versenden einer Mail

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Message-Id beim Versenden einer Mail

    Hallo,
    beim Versenden einer Mail mittels Net.Mail muss ich die Message-Id wissen. Der Server liefert in den Antworten diese Id zurück und ich muss diese Antworten den gesendeten Mails zuordnen. Die Rückmeldungen erfolgen zeitversetzt, d.h. es können mehrere Minuten vergehen, bevor die Antwort kommt. In dieser Zeit könnte aber schon eine weitere Mail abgegangen sein. So weiss ich dann nicht, welche Antwort zu welcher gesendeten Mail gehört. Hab stundenlang gegoogelt, aber keine Lösung gefunden.
    Der Code sieht wie folgt aus:
    Code:
            Dim [to] As New MailAddress(MailAddrTo)
            Dim [from] As New MailAddress(MailAddrFrom)
            Dim client As New SmtpClient(Server, iSnmpPort)
            Dim message As New MailMessage([from], [to])
    
            Try
                client.DeliveryMethod = SmtpDeliveryMethod.Network
                client.Credentials = New NetworkCredential(MailUserName, MailUserPsw)
                message.Subject = strSubject
                message.Body = strMessage
    
                For Each f As String In Directory.GetFiles("OneClickAttach")
                    message.Attachments.Add(New Attachment(f))
                Next
    
                client.Send(message)
                TextBox1.AppendText("Erfolgreich versendet" & Environment.NewLine & Environment.NewLine)
            Catch ex As Exception
                TextBox1.AppendText(Environment.NewLine & "Beim Versenden ist folgender Fehler aufgetreten:" & Environment.NewLine)
                TextBox1.AppendText(ex.Message & Environment.NewLine)
                fehler = True
            Finally
                message.Attachments.Dispose()
                client.Dispose()
            End Try
    Lässt sich die Id der gesendeten Mail irgendwie feststellen ohne dass ich eine per Hand neu anlege?

    Grüße Norbert

  • #2
    Wo liefert der Server in deinem Code die Antworten?

    M.E. wird die ID beim versenden hinzugefügt, als Headerfeld. Wüsste jetzt nicht, wo du die Abfragen könntest
    Christian

    Comment


    • #3
      Mann bist Du wieder schnell!
      Der Antwort-Teil (Auszug siehe unten) funktioniert gut. In jeder Antwort steht im Header die ID der vom Server entgegen genommenen Mail. Ich muss Mails und Antworten zusammen gehörend in einer DB abspeichern.
      Code:
      If InlineAssignHelper(strErr, SendText(tcpClient, "STAT" & Environment.NewLine)).Length > 0 Then
                      Return Nothing
                  Else
                      InlineAssignHelper(strErr, WaitforAnswer(tcpClient, strRet))
                      If Not strRet.StartsWith("+OK") Then
                          TextBox1.AppendText("keine Serverantwort auf STAT" & Environment.NewLine)
                          Return Nothing
                      End If
                  End If
      
                  Dim strSplit() As String = strRet.Substring(3).Trim.Split(New Char() {" "c}, StringSplitOptions.RemoveEmptyEntries)
                  If Not Integer.TryParse(strSplit(0), 0) OrElse strSplit(0) = "0" Then
                      TextBox1.AppendText("es sind keine Daten vorhanden" & Environment.NewLine)
                      Return Nothing
                  End If
      
                  Dim anzahl As Integer = CInt(strSplit(0))
                  TextBox1.AppendText("es sind " & anzahl & " Mailnachrichten vorhanden" & Environment.NewLine)
                  If InlineAssignHelper(strErr, SendText(tcpClient, "LIST" & Environment.NewLine)).Length > 0 Then
                      Return Nothing
                  Else
                      InlineAssignHelper(strErr, WaitforAnswer(tcpClient, strRet))
                      If Not strRet.StartsWith("+OK") Then
                          TextBox1.AppendText("Fehler beim Auflisten der Mails" & Environment.NewLine)
                          Return Nothing
                      End If
                  End If
      
                  strSplit = strRet.Split(New String() {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries)
                  Dim number As String
                  For Each s As String In strSplit
                      number = s.Split(New Char() {" "c}, StringSplitOptions.RemoveEmptyEntries)(0)
                      If Not Integer.TryParse(number, 0) Then Continue For
      
                      If InlineAssignHelper(strErr, SendText(tcpClient, "RETR " & number & Environment.NewLine)).Length > 0 Then
                          Continue For
                      Else                                                                                    'Daten sind in einer Mail
                          InlineAssignHelper(strErr, WaitforAnswer(tcpClient, strRet))
      Zuletzt editiert von strzata; 18.01.2017, 18:19. Reason: Habs DANKE vergessen!

      Comment


      • #4
        Weiß jetzt nicht, was du da ausliest, sieht mir nach FTP aus.

        Dann setze in jede eMail noch ein eigenes Headerfeld, bsp. mit https://social.msdn.microsoft.com/Fo...orum=vbgeneral

        Dann kannst du in deinen eMails nach diesem Wert suchen und die ID zuordnen
        Christian

        Comment


        • #5
          Weiß jetzt nicht, was du da ausliest, sieht mir nach FTP aus.
          Eher POP würde auch mehr zu Mails passen. Das zu erwartende IMAP sähe anders aus.

          Lässt sich die Id der gesendeten Mail irgendwie feststellen ohne dass ich eine per Hand neu anlege?
          Denke nein. Wenn du die Message-ID deiner gesendeten Mail vor dem Senden wissen mußt mußt du die selbst würfeln und mitgeben.
          Je nachdem was du da tust wäre es vielleicht besser das beim Senden zu ignorieren und auch die gesendeten Mails über die MailBox zu identifizieren.
          Also die Mails in der Outbox mit der in der Inbox über Message-ID und In-Reply-To im Header zu korrelieren. Da geht aber eher weniger gut (bis gar nicht) mit POP sondern da sollte man schon IMAP mit dem MailServer sprechen.

          Comment


          • #6
            Nein kein POP
            POP erwartet ein HELO/EHLO zur Begrüßung
            Wahrscheinlich direkt das Directory in dem der Server die versandten Mail speichert
            Christian

            Comment


            • #7
              Danke für die Hilfe (einen Beitrag hab ich zu spät gelesen). Ihr Experten sprecht immer eine Sprache, die mir schwer fällt, zu verstehen.
              Vorweg: Senden SNMP Port 25, Empfang POP Port 110, Client zum Ver-/Entschlüsseln dazwischen
              Wo ist bei meinem Vorgehen die "Outbox"? Die Mails fliegen doch ohne Zwischenspeicherung raus
              Wenn ich den Header der gesendeten Mails in die Hände bekäme, wäre es einfach.

              Ich werde wohl selbst eine ID würfeln müssen. Dazu habe ich gefunden:
              Code:
              // Message-ID is generated by SmtpMail automatically, 
              // if you want to use your customized Message-ID in the message, 
              // please use the following code.
              SmtpMail oMail = new SmtpMail("TryIt");
              oMail.Headers.Insert(0, new HeaderItem("Message-ID", "mymessageid"));
              Muss ich vorher die automatisch vergebene ID removen? Hoffe mal, dass der Server die ID akzeptiert. Die bislang automatisch generierten und vom Server akzeptierten IDs sehen so aus:
              Original-Message-ID: <893533449.0.1484569240447.JavaMail.Nutzer@SZ2>
              Original-Message-ID: <2047584371.0.1484752625761.JavaMail.Nutzer@SZ2>

              Sehe ich in der Serverantwort im In-Reply-To
              Bin schon auf der Suche nach einem "Würfel". Könnt ihr mir einen empfehlen, der das so macht? Probiere gerade mit dem Link von Christian ...
              Zuletzt editiert von strzata; 18.01.2017, 19:44.

              Comment


              • #8
                Wo ist bei meinem Vorgehen die "Outbox"? Die Mails fliegen doch ohne Zwischenspeicherung raus
                Stimmt. Da habe ich was durcheinander gebracht.

                Muss ich vorher die automatisch vergebene ID removen? Hoffe mal, dass der Server die ID akzeptiert. Die bislang automatisch generierten und vom Server akzeptierten IDs sehen so aus:
                Original-Message-ID: <893533449.0.1484569240447.JavaMail.Nutzer@SZ2>
                Original-Message-ID: <2047584371.0.1484752625761.JavaMail.Nutzer@SZ2>
                Kommt auf das konkrete Verhalten von SmtpMail an, das kenne ich aber nicht. Die Klasse ist schon lange obsolet.
                Sollte durch die Kombination von SmtpClient und MailMessage ersetzt werden. Dort kann man per MailMessage.Header.Add die Message-id setzen.

                Egal welche Klasse du nutzt ich denke aber nicht das du da was removen mußt. Die Message-id kommt erst auf dem Smtp Server dazu. Problem könnte eher sein das je nach Smtp Server dem egal ist das du schon eine Message-id gesetzt hast und die wieder überschreibt. Das wäre auszuprobieren.

                Bin schon auf der Suche nach einem "Würfel".
                "gewü[email protected]" sollte ok sein. Den Domänenteil solltest du nicht vergessen sonst bewegst du dich je nach Mailfilter schnell in der Spam Ecke.

                Comment


                • #9
                  Danke! Ich glaube jetzt hab ich es.
                  Nur nochmal zu meiner Sicherheit:
                  Kommt auf das konkrete Verhalten von SmtpMail an, das kenne ich aber nicht. Die Klasse ist schon lange obsolet.
                  Schaust Du bitte nochmal auf mein erstes Posting. Mein MailClient ist doch ein SMTP-Client und die Message ist eine MailMessage. Oder bringe ich da wieder was durcheinander? Das Ersetzen der ID funktioniert jedenfalls und der Server gibt die ID auch im In-Reply-To in der Antwort zurück.

                  Ihr habt mir sehr geholfen und ich bin von diesem Forum immer wieder aufs Neue begeistert!
                  Viele Grüße
                  Norbert

                  Comment


                  • #10
                    Ich hatte auf deinen letzten Code geguckt da wurde SmtpMail verwendet dein Ausgangsposting hatte ich nicht mehr im Blick. Alles gut

                    Comment


                    • #11
                      https://entwickler-forum.de/showthre...ung-bei-Themen
                      Christian

                      Comment

                      Working...
                      X