Announcement

Collapse
No announcement yet.

SmtpClient

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

  • SmtpClient

    Hallo,
    ich muss eine Mail mit mehreren Attachments versenden. Der Server erwartet ein bestimmtes Format. Dies sieht in etwa so aus:
    Code:
     Content-Type: multipart/mixed;
        boundary="------------080807020509080601050908"
                 This is a multi-part message in MIME format.
                  
      --------------080807020509080601050908
      Content-Type: text/plain; charset=utf-8
      Content-Transfer-Encoding: 8bit
       
      Body der 1-Click-Lieferung
       
      --------------080807020509080601050908
      Content-Type: application/xml; name="begleitdatei.xml"
      Content-Transfer-Encoding: base64
      Content-Disposition: attachment; filename="begleitdatei.xml"
       
      PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4
      ...
       
      --------------080807020509080601050908
      Content-Type: application/octet-stream; name="Z01123456699_31.05.2015_12.00.con.xkm"
      Content-Transfer-Encoding: base64
      Content-Disposition: attachment; filename="Z01123456699_31.05.2015_12.00.con.xkm"
       
      XJ6dG51bW1lci9CU05SOiAwMTAxMDAzMDAgICAgICAgICAgICAgIA0KRXJzdGVsbHVuZ3Nk
      YXR1bTogMTguMDkuMjAxNSAxMTowNjowMSAgIA0KUGFrZXQgMS8xICAgICAgICAgICAgICAg
      ICAgICAgICAgICAgICAgIA0KDQoqWEtNKg0KMS4yNiAgDQoxICAgIA0KMSAgICANCjcgDQox
      DQowDQog..
    Muss ich die boundarys per Hand eintippseln, oder kann ich den SmtpClient dazu bringen, dass er das automatisch einfügt, wenn ich im Programmcode die Attachment-Klasse benutze und ihr die Werte für Content-Type, Content-Disposition usw. zuordne?

    Grüße Norbert

  • #2
    Das sollte der Client selbst machen, wenn man eine multipart-Message zusammenbaut.
    https://www.example-code.com/vbnet/m...ipartMixed.asp
    Christian

    Comment


    • #3
      Danke für den Link. Aber fast 300 Dollar wollte ich nicht dranhetzen.

      Comment


      • #4
        https://docs.microsoft.com/de-de/dot...tframework-4.8

        Mal selbst aktiv werden!

        https://www.google.com/search?client...%23+smtpclient

        Christian

        Comment


        • #5
          Eigentlich sollte die MailMessage Klasse aus dem Framework wenn du die zusammen mit dem SmtpClient benutzt genau das erzeugen. Außer da ist irgendwas dazwischen was nicht Standardkonform ist (nach rfc) und ich gerade nicht sehe. Dann bist du auf dich allein gestellt.

          Übrigens falls du am raten bist wie die Mail aussieht die der SmtpClient da versendet. Der SmtpClient kann auch in eine Dateischreiben beim senden.

          Code:
          var client = new SmtpClient("mylovelyhost");
          client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
          client.PickupDirectoryLocation = @"C:\mylovelydirectory";
          client.Send(message);




          Zuletzt editiert von Ralf Jansen; 24.03.2020, 18:36.

          Comment


          • #6
            Vielen Dank, dass ihr euch nochmal mit meinem Problem beschäftigt habt. Habs leider erst heute gelesen, da man keine Benachrichtighung bekommt, wenn es neue Antworten gibt.
            Mal selbst aktiv werden!
            Habe in den letzten Tagen nichts anderes gemacht. Stundenlang rfc gewälzt. Und viel gelernt. Auch den Ratschlag von Ralf, die Mail lokal zu speichern, hatte ich dann gefunden. Es wäre ohne gar nicht möglich gewesen, richtig zu coden.
            In der Tat macht der Smtp-Client alles von selbst, wenn man die richtige Syntax anwendet.
            Code:
                        'Abrechnungsdatei
                        Dim abrDatei As String = Application.StartupPath & "\OneClick\Outbox\" & tbXKMDatei.Text
                        Dim contType As String = "application/octet-stream; name=" & tbXKMDatei.Text
                        Dim contentType As New Mime.ContentType(contType)
                        attachement = New Attachment(abrDatei, contentType)
                        attachement.ContentDisposition.FileName = tbXKMDatei.Text
                        attachement.ContentDisposition.DispositionType = "attachment"
                        message.Attachments.Add(attachement)
            Zwei Dinge machen mir dabei Kummer. Im Beispiel für die Anforderung stehen Anführungszeichen:
            Code:
            Content-Type: application/octet-stream; name="Z01123456699_31.05.2015_12.00.con.xkm"
            Der Smtp-Client schreibt die aber nicht:
            Code:
            Content-Type: application/octet-stream; name=Z01123456699_31.05.2015_12.00.con.xkm
            Und vor dem zweiten Mime-Part schreibt er auch keine Leerzeile (wie es wohl richtiger wäre?):
            HTML Code:
            ----boundary_1_27a9ec7e-cff5-41a5-98d4-30aca006e046
            Content-Type: application/xml; name=begleitdatei.xml
            Content-Transfer-Encoding: base64
            Content-Disposition: attachment; filename=begleitdatei.xml
            
            77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxlaW5saWVm
            MjEuMDMuMjAyMF8xNC4yNi5jb24uWEtNIiAvPg0KPC9laW5saWVmZXJ1bmc+
            ----boundary_1_27a9ec7e-cff5-41a5-98d4-30aca006e046
            Content-Type: application/octet-stream;
             name=Z01937112797_21.03.2020_14.26.con.XKM
            Content-Transfer-Encoding: base64
            Content-Disposition: attachment;
             filename=Z01937112797_21.03.2020_14.26.con.XKM
            Content-ID: <53e02c89-0f65-4082-ab55-4e5d9c5d0132>
            
            ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KRXJzdGVsbHVu
            Z3NkYXR1bTogMjEuMDMuMjAyMCAxNDoyNjo1OSAgIA0KUGFrZXQgMS8xICAgICAgICAg
            ----boundary_1_27a9ec7e-cff5-41a5-98d4-30aca006e046--
            Ich hoffe, dass man mir das Zertifikat trotzdem zugesteht, denn ich hab nichts gefunden, wie ich das beheben könnte. Widerspricht das den Vorgaben?

            Viele Grüße
            Norbert
            Zuletzt editiert von strzata; 25.03.2020, 14:05.

            Comment


            • #7
              Gequotet wird nur wenn das auch nötig ist. Wenn dein Filename z.B. ein Leerzeichen enthält würde gequotet werden. Das sollte für keinen MailServer/MailClient ein Problem sein und ist im Rahmen des Standards.
              Das zwischen Content des MimePart und dem Begin des nächsten MimePart keine Leerzeile ist ist auch normal.

              Comment


              • #8
                Perfekt! Dann kann ich zuversichtlich sein.
                Gehe auf die 75 und programmiere seit über 30 Jahren in .Net. Aber es gibt immer wieder Dinge, von denen ich noch nie gehört habe. Reicht ein Leben, um das alles zu fassen? Oder bist Du schon über 100? ;-)
                Quäle mich seit Stunden mit einem anderen Problem (hoffentlich dem, letzten vor der Prüfung): Geliefert wird in der Response ebenfalls ein Attachment, codiert in base64 und als application/octet-stream. Es ist eine xml-Datei und ich muss ein paar Knoten daraus verarbeiten. Weisst Du, wie ich plainText daraus bekommen kann?

                Comment


                • #9
                  Sicherlich im ersten Schritt das BASE64 decodieren.
                  Dann das XML verarbeiten.

                  https://stackoverflow.com/questions/...-base64-string
                  Christian

                  Comment


                  • #10
                    Bei allen anderen Responses (nicht octet) code ich
                    Code:
                    Dim xDoc As XElement = XElement.Parse(Encoding.ASCII.GetString(Convert.FromBase64String(att.ToString)))
                    Aber hier wirft er mir eine Exception:
                    System.Xml.XmlException: "Ungültige Daten auf Stammebene. Zeile 1, Position 1."
                    Und hier das Attachment:
                    HTML Code:
                      77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxlaW5saWVmZXJ1bmcg eHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3Lmt2LXRlbGVtYXRpay5kZS8xLUNsaWNrL01l bGR1bmdfRWlubGllZmVydW5nLzIuMC4wIC4uL1NjaGVtYS9LVlRBX0VpbmxpZWZlcnVuZ19BYnJl Y2hudW5nXzJfMF8wLnhzZCIgeG1sbnM9Imh0dHA6Ly93d3cua3YtdGVsZW1hdGlrLmRlLzEtQ2xp Y2svTWVsZHVuZ19FaW5saWVmZXJ1bmcvMi4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5v cmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPg0KICA8dmVyc2lvbiBWPSIxIiAvPg0KICA8Z3Vp ZCBWPSJkZDc3M2YxZi0zMTc1LTQ2NTMtODQzMy1iNTc5ZjkyM2I3OGIiIC8+DQogIDxic25yIFY9 IjkzNzExMjc5NyIgLz4NCiAgPHRlc3RkYXRlbiBWPSJ0cnVlIiAvPg0KICA8bGllZmVydW5nc196 ZWl0cHVua3QgVj0iMjAyMC0wMy0yNVQxMzo1NzowNVoiIC8+DQogIDxkb2t1bWVudGVuX3R5cCBW PSJBQlJFQ0hOVU5HIiAvPg0KICA8cXVhcnRhbCBWPSIyMDIwLTEiIC8+DQogIDx2b2xsc3RhZW5k aWcgVj0idHJ1ZSIgLz4NCiAgPGFuaGFuZyBWPSJaMDE5MzcxMTI3OTdfMjEuMDMuMjAyMF8xNC4y Ni5jb24uWEtNIiAvPg0KPC9laW5saWVmZXJ1bmc+
                    Die Leerzeichen sind natürlich nicht drin. Sind hier beim Kopieren reingehüpft.
                    Zuletzt editiert von strzata; 25.03.2020, 16:21.

                    Comment


                    • #11
                      Zum dekodieren warum machst du das selber? Jeder MailClient (auch solche die man im eigenen Code verwenden könnte um Mails von einem Mailserver abzuholen) sollten völlig transparent das Transferencoding (z.B.Base64) behandeln. Der Zugriff aufs Attachment sollte die einfach das liefern das du auch auf der MailMessage Seite als Attachment reingegeben hast ohne jegliches angewendetes Transferencoding.

                      Zu deinem XML Encoding Problem. Es muss nicht ASCII sein. Du solltest eher UTF-8 nehmen das funktioniert auch wenn es doch nur ASCII ist.
                      Das es an der ersten Stelle schon knallt könnte bereits daran liegen. Es ist UTF-8 und enthält am Anfang einen sogenannten BOM mit dem er in ASCII nichts anfangen kann.

                      Ein weiteres Problem könnte der Aufruf von att.ToString sein. ToString liefert dir mit hoher Wahrscheinlichkeit nicht den Inhalt des Attachments. Sondern eher den Klassennamen oder sonstige Informationen die man zu Debugging Zwecken braucht.

                      Comment


                      • #12

                        77u/ und auch die Leeerzeichen sind kein BASE64
                        Poste den Code

                        Und so mal grundsätzlich:
                        Ein Mail Client sollte dir beim versenden die Möglichkeit geben eine Multipart-Mail zu erstellen. Du gibst verschiedene Attachments mit Contenttype und Filename vor und der Client verpackt das in eine eMail. Das interne (Boundary, Leerzeilen usw.) braucht dich nicht zu interessieren.

                        Ein Mail Client sollte dir beim empfangen die Möglichkeit geben Multipart-Mail zu empfangen. Du bekommst n-Attachments sowie Contenttype und Filename. Weiterhin eine Methode/Stream auf die decodierten Bytes zuzugreifen. Ist das Attachment bsp. ein JPG bekommst du einen Stream auf die Bytes des JPG. Speicherst du diese ab, hast du ein JPG. Das interne (Base64, decodieren) braucht dich nicht zu interessieren.

                        SMTP = Simple Mail Transfer Protocol
                        ist IMMER reiner Text. SMTP kennt kein HTML, RTF o.a. Es sind "Services" von eMailclients, irgendwelches HTML in einer eMail als HTML darzustellen.
                        Binäre Dateien in einer eMail werden immer BASE64 umgewandelt und dann als Text gesandt
                        Zuletzt editiert von Christian Marquardt; 25.03.2020, 17:19.
                        Christian

                        Comment


                        • #13
                          Danke. Der Mailverkehr geht über einen zwischengeschalteten KV-Client (localhost), der die Verschlüsselung (mit Zertifikaten .jks) übernimmt. Ich sende die Mail also an localhost (Port 25), der leitet weiter nach draussen. Empfang geht über localhost Port 110, wobei der KV-Client wieder die Entschlüsselung übernimmt und die Mail als eml ablegt. Ich kann sie mit Thunderbird anzeigen lassen und auch mit .Net-Code parsen.

                          @Ralf: so ganz verstehe ich nicht, was Du meinst. Die Response ist nicht gleich der gesendeten Mail. Ich habe ein Problem, das Attachment der Response (und nur dieses spezielle, weil wahrscheinlich octet stream) in die ursprüngliche xml der KV zu dekodieren. Alle die vielen anderen Attachments machen mir überhaupt keine Probleme.

                          @Chris: Leerzeichen sind nur beim Kopieren hier ins Forum reingehüpft! Hier der Code:
                          Code:
                          Dim newline As String = Environment.NewLine
                                  For Each part As String In parts
                                      If part.Contains("attachment") AndAlso part.Contains("begleitdatei.xml") Then
                                          Dim att As String = part.Split(New String() {newline & newline}, StringSplitOptions.None)(1).Replace(newline, "")
                                          Dim xDoc As System.Xml.Linq.XElement = Xml.Linq.XElement.Parse(System.Text.Encoding.ASCII.GetString(Convert.FromBase64String(att.ToString)))
                                      End If
                                  Next
                          Könnt ihr das Attachment mit .Net dekodieren?
                          Thunderbird zeigt mir den Inhalt. Aber ich brauche es im Vb.Net Code, um die Knoten zu parsen. Vor allem brauche ich die Guid, die mit Werten in einer DB verglichen werden müssen.
                          HTML Code:
                          <?xml version="1.0" encoding="UTF-8"?>
                          <einlieferung xsi:schemaLocation="http://www.kv-telematik.de/1-Click/Meldung_Einlieferung/2.0.0 ../Schema/KVTA_Einlieferung_Abrechnung_2_0_0.xsd" xmlns="http://www.kv-telematik.de/1-Click/Meldung_Einlieferung/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                            <version V="1" />
                            <guid V="dd773f1f-3175-4653-8433-b579f923b78b" />
                            <bsnr V="937112797" />
                            <testdaten V="true" />
                            <lieferungs_zeitpunkt V="2020-03-25T13:57:05Z" />
                            <dokumenten_typ V="ABRECHNUNG" />
                            <quartal V="2020-1" />
                            <vollstaendig V="true" />
                            <anhang V="Z01937112797_21.03.2020_14.26.con.XKM" />
                          </einlieferung>

                          Comment


                          • #14
                            Jedes Part eine eMail ist ein String?
                            Welche Klasse ist PARTS. Bezweifle, dass alle Attachments Strings sind.
                            Zeige welche Klassen du als eMailclient benutzt.

                            Was für ein Attachment sollte ich decodieren können.

                            Und geh doch mal Schritt für Schritt vor
                            Erst das XML aus dem Attachment ziehen, dann das XML parsen
                            UNd dein XML ist valides XML. Das kann mit NET ganz einfach geparst werden.
                            Zuletzt editiert von Christian Marquardt; 25.03.2020, 18:01.
                            Christian

                            Comment


                            • #15
                              Es kann doch nicht so schwer sein hier mal vollständigen Code zu posten
                              att ist das Attachment, welches ich in #10 (als HTML-Code <> wegen der besseren Lesbarkeit) gepostet habe.
                              Mehr Code:
                              Code:
                                      Dim boundary As String = ""
                                      Dim getBoundary As New Regex("boundary=(.*?)\r\n")
                                      Dim possibleBoundary As MatchCollection = getBoundary.Matches(eml)
                                      findBoundary = possibleBoundary.Count > 0
                              
                                      If findBoundary Then
                                          boundary = possibleBoundary(0).Groups(1).Value.Trim(CChar(""""))
                                          Dim stringSeparators() As String = New String() {"--" & boundary}
                                          mimeParts = eml.Split(stringSeparators, StringSplitOptions.None)
                                      End If
                              
                                      If mimeParts IsNot Nothing AndAlso mimeParts.Length > 0 Then
                                          header = mimeParts(0)
                                      End If
                                      ExtractGuid(mimeParts)
                              
                                  Private Function ExtractGuid(parts() As String) As String
                                      Dim newline As String = Environment.NewLine
                                      For Each part As String In parts
                                          If part.Contains("attachment") AndAlso part.Contains("begleitdatei.xml") Then
                                              Dim att As String = part.Split(New String() {newline & newline}, StringSplitOptions.None)(1).Replace(newline, "")
                                              Dim xDoc As System.Xml.Linq.XElement = Xml.Linq.XElement.Parse(System.Text.Encoding.ASCII.GetString(Convert.FromBase64String(att.ToString)))
                                          End If
                                      Next
                              eml ist die gesamte Mail. parts sind die einzelnen Mime-Parts. Hier der Anfang der Mail:
                              Code:
                               
                               +OK Message follows Content-Type: multipart/mixed;  	boundary="----=_Part_10927_2097089144.1585141215565" MIME-Version: 1.0 Message-ID: <[email protected]ack.de> Date: Wed, 25 Mar 2020 14:00:15 +0100 (CET) From: [email protected] Sender: [email protected] To: [email protected] In-Reply-To: <[email protected]> Subject: 1ClickAbrechnung;Rueckmeldung;V2.0 X-KVC-Dienstkennung: 1ClickAbrechnung;Rueckmeldung;V2.0 X-KVC-Sendersystem: KVC-Client;V4.5.0 X-EsetId: 37303A29E675F26E6D7D61  ------=_Part_10927_2097089144.1585141215565 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable  Die Pr=C3=BCfungsergebnisse bez=C3=BCglich der Abrechnungsdatei finden Sie = im Anhang dieser Nachricht.   ------=_Part_10927_2097089144.1585141215565 Content-Type: application/octet-stream; name=begleitdatei.xml Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=begleitdatei.xml  77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCjxlaW5saWVmZXJ1bmcg eHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3Lmt2LXRlbGVtYXRpay5kZS8xLUNsaWNrL01l bGR1bmdfRWlubGllZmVydW5nLzIuMC4wIC4uL1NjaGVtYS9LVlRBX0VpbmxpZWZlcnVuZ19BYnJl Y2hudW5nXzJfMF8wLnhzZCIgeG1sbnM9Imh0dHA6Ly93d3cua3YtdGVsZW1hdGlrLmRlLzEtQ2xp Y2svTWVsZHVuZ19FaW5saWVmZXJ1bmcvMi4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5v cmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPg0KICA8dmVyc2lvbiBWPSIxIiAvPg0KICA8Z3Vp ZCBWPSJkZDc3M2YxZi0zMTc1LTQ2NTMtODQzMy1iNTc5ZjkyM2I3OGIiIC8+DQogIDxic25yIFY9 IjkzNzExMjc5NyIgLz4NCiAgPHRlc3RkYXRlbiBWPSJ0cnVlIiAvPg0KICA8bGllZmVydW5nc196 ZWl0cHVua3QgVj0iMjAyMC0wMy0yNVQxMzo1NzowNVoiIC8+DQogIDxkb2t1bWVudGVuX3R5cCBW PSJBQlJFQ0hOVU5HIiAvPg0KICA8cXVhcnRhbCBWPSIyMDIwLTEiIC8+DQogIDx2b2xsc3RhZW5k aWcgVj0idHJ1ZSIgLz4NCiAgPGFuaGFuZyBWPSJaMDE5MzcxMTI3OTdfMjEuMDMuMjAyMF8xNC4y Ni5jb24uWEtNIiAvPg0KPC9laW5saWVmZXJ1bmc+
                              Wie stelle ich das rein, dass es als Textblock und nicht als ellenlange einzelne Zeile zu sehen ist?

                              Comment

                              Working...
                              X