Announcement

Collapse
No announcement yet.

Attachment aus EML öffnen

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

  • Attachment aus EML öffnen

    Hallo,
    im Netz finde ich nirgends eine Hilfe, wie man aus einer Mail (.eml) mit .Net den Anhang extrahieren kann. Am aussichtsreichsten schien mir ein Beispiel mit ADODB und CDO (https://bytes.com/topic/visual-basic...through-vb-net). Aber es knallt bei LoadFromFile ("Der Vorgang ist für ein geschlossenes Objekt nicht zugelassen"). Kann mir jemand einen Tipp geben? Die Mail sieht so aus:
    Code:
    +OK Message follows
    Content-Type: multipart/mixed;
        boundary="----=_Part_4074_1246384185.1560101900440"
    MIME-Version: 1.0
    Message-ID: <5504970.4075.1560101900440.JavaMail.fhirpmc@kvt-ref-13.comback.de>
    Date: Sun, 9 Jun 2019 19:38:20 +0200 (CEST)
    From: [email protected]
    To: [email protected]
    In-Reply-To: <450357062.65.2814291694867.JavaMail.Nutzer@SZ2>
    Subject: eTS;Vermittlungscode-Lieferung-Muster06;V2.0
    X-KVC-Dienstkennung: eTS;Vermittlungscode-Lieferung-Muster06;V2.0
    X-KVC-Sendersystem: KVC-Client;V4.5.1-RC7-SNAPSHOT
    X-EsetId: 37303A29E675F26B63726A
    
    ------=_Part_4074_1246384185.1560101900440
    Content-Type: application/fhir+xml; charset=UTF-8;
        name=Vermittlungscode-Lieferung-Muster06.xml
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment; filename="Vermittlungscode-Lieferung-Muster06.xml"
    
    PEJ1bmRsZT4KICAgIDxpZCB2YWx1ZT0iMzBiNWZlMTAtZDIzZi00YjE2LWEwNTktMWM3OTNlNWVh
    ZWRlIi8+CiAgICA8bWV0YT4KICAgICAgICA8cHJvZmlsZSB2YWx1ZT0iaHR0cHM6Ly9maGlyLmti
    di5kZS9TdHJ1Y3R1cmVEZWZpbml0aW9uLzc0X1BSX0VUU19CdW5kbGUiLz4KICAgIDwvbWV0YT4K
    ICAgIDx0eXBlIHZhbHVlPSJtZXNzYWdlIi8+CiAgICA8ZW50cnk+CiAgICAgICAgPGZ1bGxVcmwg
    dmFsdWU9InVybjp1dWlkOjU3ZjY0Nzc2LWFlYzMtNGQyNy1hMzE4LTM2M2U4YmIxZDk4ZiIvPgog
    ICAgICAgIDxyZXNvdXJjZT4KICAgICAgICAgICAgPE1lc3NhZ2VIZWFkZXI+CiAgICAgICAgICAg
    ICAgICA8aWQgdmFsdWU9IjU3ZjY0Nzc2LWFlYzMtNGQyNy1hMzE4LTM2M2U4YmIxZDk4ZiIvPgog
    ICAgICAgICAgICAgICAgPG1ldGE+CiAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgdmFsdWU9
    Imh0dHBzOi8vZmhpci5rYnYuZGUvU3RydWN0dXJlRGVmaW5pdGlvbi83NF9QUl9FVFNfTUhfVmVy
    bWl0dGx1bmdzY29kZXMtYW5mb3JkZXJuX1Jlc3BvbnNlIi8+CiAgICAgICAgICAgICAgICA8L21l
    dGE+CiAgICAgICAgICAgICAgICA8ZXZlbnQ+CiAgICAgICAgICAgICAgICAgICAgPHN5c3RlbSB2
    YWx1ZT0iaHR0cHM6Ly9maGlyLmtidi5kZS9Db2RlU3lzdGVtLzc0X0NTX0VUU19FdmVudHMiLz4K
    ICAgICAgICAgICAgICAgICAgICA8Y29kZSB2YWx1ZT0idmVybWl0dGx1bmdzY29kZS1hbmZvcmRl
    cm4iLz4KICAgICAgICAgICAgICAgIDwvZXZlbnQ+CiAgICAgICAgICAgICAgICA8dGltZXN0YW1w
    IHZhbHVlPSIyMDE5LTA2LTA5VDE5OjM4OjIwLjQzOCswMjowMCIvPgogICAgICAgICAgICAgICAg
    PHNvdXJjZT4KICAgICAgICAgICAgICAgICAgICA8ZW5kcG9pbnQgdmFsdWU9Im1haWx0bzplVGVy
    bWluc2VydmljZS50ZXN0QGt2LXNhZmVuZXQuZGUiLz4KICAgICAgICAgICAgICAgIDwvc291cmNl
    PgogICAgICAgICAgICAgICAgPHJlc3BvbnNlPgogICAgICAgICAgICAgICAgICAgIDxpZGVudGlm
    aWVyIHZhbHVlPSJlM2RkYmRlZC0zMWQzLTQ1MDUtODA1YS0wM2IwZDk0MTYyMWUiLz4KICAgICAg
    ICAgICAgICAgICAgICA8Y29kZSB2YWx1ZT0ib2siLz4KICAgICAgICAgICAgICAgIDwvcmVzcG9u
    c2U+CiAgICAgICAgICAgICAgICA8Zm9jdXM+CiAgICAgICAgICAgICAgICAgICAgPHJlZmVyZW5j
    ZSB2YWx1ZT0idXJuOnV1aWQ6ZDA3MzU1Y2EtYWMwYi00YjA2LTgyNzQtNWE0MTZlYmM3OWU1Ii8+
    CiAgICAgICAgICAgICAgICA8L2ZvY3VzPgogICAgICAgICAgICA8L01lc3NhZ2VIZWFkZXI+CiAg
    ICAgICAgPC9yZXNvdXJjZT4KICAgIDwvZW50cnk+CiAgICA8ZW50cnk+CiAgICAgICAgPGZ1bGxV
    cmwgdmFsdWU9InVybjp1dWlkOmQwNzM1NWNhLWFjMGItNGIwNi04Mjc0LTVhNDE2ZWJjNzllNSIv
    PgogICAgICAgIDxyZXNvdXJjZT4KICAgICAgICAgICAgPFJlZmVycmFsUmVxdWVzdCB4bWxucz0i
    aHR0cDovL2hsNy5vcmcvZmhpciI+CiAgIDxpZCB2YWx1ZT0iZDA3MzU1Y2EtYWMwYi00YjA2LTgy
    NzQtNWE0MTZlYmM3OWU1Ij48L2lkPgogICA8bWV0YT4KICAgICAgPHByb2ZpbGUgdmFsdWU9Imh0
    dHBzOi8vZmhpci5rYnYuZGUvU3RydWN0dXJlRGVmaW5pdGlvbi83NF9QUl9FVFNfUmVmZXJyYWxy
    ZXF1ZXN0X2FudHdvcnRfbXVzdGVyMDYiPjwvcHJvZmlsZT4KICAgPC9tZXRhPgogICA8aWRlbnRp
    Zmllcj4KICAgICAgPHN5c3RlbSB2YWx1ZT0iaHR0cHM6Ly9maGlyLmtidi5kZS9pZGVudGlmaWVy
    ZXIvNzRfSURfRVRTX1Zlcm1pdHRsdW5nc2NvZGUiPjwvc3lzdGVtPgogICAgICA8dmFsdWUgdmFs
    dWU9IlpLUExWQkNXNThSRyI+PC92YWx1ZT4KICAgPC9pZGVudGlmaWVyPgogICA8c3RhdHVzIHZh
    bHVlPSJkcmFmdCI+PC9zdGF0dXM+CiAgIDxpbnRlbnQgdmFsdWU9Im9yZGVyIj48L2ludGVudD4K
    ICAgPHR5cGU+CiAgICAgIDxjb2Rpbmc+CiAgICAgICAgIDxzeXN0ZW0gdmFsdWU9Imh0dHA6Ly93
    d3cua2J2LmRlL2ZoaXIvQ29kZVN5c3RlbS83NF9DU19BV19BbmxhZ2V0eXAiPjwvc3lzdGVtPgog
    ICAgICAgICA8Y29kZSB2YWx1ZT0iS1YtTXVzdGVyXzYiPjwvY29kZT4KICAgICAgPC9jb2Rpbmc+
    CiAgIDwvdHlwZT4KICAgPHByaW9yaXR5IHZhbHVlPSJyb3V0aW5lIj48L3ByaW9yaXR5PgogICA8
    c3ViamVjdD4KICAgICAgPGRpc3BsYXkgdmFsdWU9Ii0iPjwvZGlzcGxheT4KICAgPC9zdWJqZWN0
    PgogICA8cmVxdWVzdGVyPgogICAgICA8YWdlbnQ+CiAgICAgICAgIDxpZGVudGlmaWVyPgogICAg
    ICAgICAgICA8c3lzdGVtIHZhbHVlPSJodHRwOi8vZmhpci5kZS9OYW1pbmdTeXN0ZW0va2J2L2xh
    bnIiPjwvc3lzdGVtPgogICAgICAgICAgICA8dmFsdWUgdmFsdWU9IjkzNzExMjc5NyI+PC92YWx1
    ZT4KICAgICAgICAgPC9pZGVudGlmaWVyPgogICAgICA8L2FnZW50PgogICAgICA8b25CZWhhbGZP
    Zj4KICAgICAgICAgPGlkZW50aWZpZXI+CiAgICAgICAgICAgIDxzeXN0ZW0gdmFsdWU9Imh0dHA6
    Ly9maGlyLmRlL05hbWluZ1N5c3RlbS9rYnYvYnNuciI+PC9zeXN0ZW0+CiAgICAgICAgICAgIDx2
    YWx1ZSB2YWx1ZT0iODgyMDM3MzAxIj48L3ZhbHVlPgogICAgICAgICA8L2lkZW50aWZpZXI+CiAg
    ICAgIDwvb25CZWhhbGZPZj4KICAgPC9yZXF1ZXN0ZXI+CiAgIDxzcGVjaWFsdHk+CiAgICAgIDxl
    eHRlbnNpb24gdXJsPSJodHRwczovL2ZoaXIua2J2LmRlL1N0cnVjdHVyZURlZmluaXRpb24vNzRf
    RVhfRVRTX0FkZGl0aW9uYWxRdWFsaWZpY2F0aW9uIj4KICAgICAgICAgPHZhbHVlQ29kaW5nPgog
    ICAgICAgICAgICA8c3lzdGVtIHZhbHVlPSJodHRwczovL2ZoaXIua2J2LmRlL0NvZGVTeXN0ZW0v
    NzRfQ1NfU0ZISVJfQkFSX1pVU0FUWkJFWkVJQ0hOVU5HIj48L3N5c3RlbT4KICAgICAgICAgICAg
    PGNvZGUgdmFsdWU9IjAxNSI+PC9jb2RlPgogICAgICAgICA8L3ZhbHVlQ29kaW5nPgogICAgICA8
    L2V4dGVuc2lvbj4KICAgICAgPGNvZGluZz4KICAgICAgICAgPHN5c3RlbSB2YWx1ZT0iaHR0cHM6
    Ly9maGlyLmtidi5kZS9Db2RlU3lzdGVtLzc0X0NTX1NGSElSX0JBUjJfV0JPIj48L3N5c3RlbT4K
    ICAgICAgICAgPGNvZGUgdmFsdWU9IjAzMCI+PC9jb2RlPgogICAgICA8L2NvZGluZz4KICAgPC9z
    cGVjaWFsdHk+CjwvUmVmZXJyYWxSZXF1ZXN0PgogICAgICAgIDwvcmVzb3VyY2U+CiAgICA8L2Vu
    dHJ5Pgo8L0J1bmRsZT4=
    ------=_Part_4074_1246384185.1560101900440--
    Im Anhang steckt ein 12-stelliger Schlüssel, den ich auslesen muss. Zum Beispiel:
    Code:
       <identifier>
          <system value="https://fhir.kbv.de/identifierer/74_ID_ETS_Vermittlungscode"></system>
          <value value="ZKPLVBCW58RG"></value>
       </identifier>
    Ich brauche nur den Schlüssel. Alles andere ist bedeutungslos.

    Gruß Norbert

  • #2
    Eine eMail ist reines Textformat. Anhänge werden, damit Bytes in Textform dargestellt werden können, BASE 64 codiert.
    Was bei dir mit
    EJ1bmRsZT4KICAgIDxpZCB2YWx1ZT0iMzBiNWZlMTAtZDIzZi0 0YjE2LWEwNTktMWM3OTNlNWVh
    beginnt und mit
    dHJ5Pgo8L0J1bmRsZT4=
    endet, ist ein BASE64 codierter String

    Anhänge werdern durch ein Boundary getrennt. Dieses wird für jede Mail extra im Header der Mail festgelegt.
    Bei dir
    Content-Type: multipart/mixed; boundary="----=_Part_4074_1246384185.1560101900440"

    Somit der erste Beginn deines Anhanges ------=_Part_4074_1246384185.1560101900440 mit dem Boundary
    Danach folgen Informationen um was für eine Datei es sich handelt, Codierung, Dateiname
    Bei dir Content-Type: application/fhir+xml; charset=UTF-8; name=Vermittlungscode-Lieferung-Muster06.xml

    Wie wurde die Datei in der Mail codiert BASE64
    Bei dir Content-Transfer-Encoding: base64

    Contenttyp und Dateiname
    Bei dir Content-Disposition: attachment; filename="Vermittlungscode-Lieferung-Muster06.xml"

    Wenn du also den Anhang decodiert hast, bekommst du ein XML-Dokument, wo offenbar in irgeneinem Tag dei Schlüssel steht.
    Also wird das Ergebnis noch mit einem XML-Parser verarbeitet werden müsssen
    Christian

    Comment


    • #3
      Dein decodiertes XML aus dem BASE64 String

      Code:
      <Bundle>
          <id value="30b5fe10-d23f-4b16-a059-1c793e5eaede"/>
          <meta>
              <profile value="https://fhir.kbv.de/StructureDefinition/74_PR_ETS_Bundle"/>
          </meta>
          <type value="message"/>
          <entry>
              <fullUrl value="urn:uuid:57f64776-aec3-4d27-a318-363e8bb1d98f"/>
              <resource>
                  <MessageHeader>
                      <id value="57f64776-aec3-4d27-a318-363e8bb1d98f"/>
                      <meta>
                          <profile value="https://fhir.kbv.de/StructureDefinition/74_PR_ETS_MH_Vermittlungscodes-anfordern_Response"/>
                      </meta>
                      <event>
                          <system value="https://fhir.kbv.de/CodeSystem/74_CS_ETS_Events"/>
                          <code value="vermittlungscode-anfordern"/>
                      </event>
                      <timestamp value="2019-06-09T19:38:20.438+02:00"/>
                      <source>
                          <endpoint value="mailto:[email protected]"/>
                      </source>
                      <response>
                          <identifier value="e3ddbded-31d3-4505-805a-03b0d941621e"/>
                          <code value="ok"/>
                      </response>
                      <focus>
                          <reference value="urn:uuid:d07355ca-ac0b-4b06-8274-5a416ebc79e5"/>
                      </focus>
                  </MessageHeader>
              </resource>
          </entry>
          <entry>
              <fullUrl value="urn:uuid:d07355ca-ac0b-4b06-8274-5a416ebc79e5"/>
              <resource>
                  <ReferralRequest xmlns="http://hl7.org/fhir">
         <id value="d07355ca-ac0b-4b06-8274-5a416ebc79e5"></id>
         <meta>
            <profile value="https://fhir.kbv.de/StructureDefinition/74_PR_ETS_Referralrequest_antwort_muster06"></profile>
         </meta>
         <identifier>
            <system value="https://fhir.kbv.de/identifierer/74_ID_ETS_Vermittlungscode"></system>
            <value value="ZKPLVBCW58RG"></value>
         </identifier>
         <status value="draft"></status>
         <intent value="order"></intent>
         <type>
            <coding>
               <system value="http://www.kbv.de/fhir/CodeSystem/74_CS_AW_Anlagetyp"></system>
               <code value="KV-Muster_6"></code>
            </coding>
         </type>
         <priority value="routine"></priority>
         <subject>
            <display value="-"></display>
         </subject>
         <requester>
            <agent>
               <identifier>
                  <system value="http://fhir.de/NamingSystem/kbv/lanr"></system>
                  <value value="937112797"></value>
               </identifier>
            </agent>
            <onBehalfOf>
               <identifier>
                  <system value="http://fhir.de/NamingSystem/kbv/bsnr"></system>
                  <value value="882037301"></value>
               </identifier>
            </onBehalfOf>
         </requester>
         <specialty>
            <extension url="https://fhir.kbv.de/StructureDefinition/74_EX_ETS_AdditionalQualification">
               <valueCoding>
                  <system value="https://fhir.kbv.de/CodeSystem/74_CS_SFHIR_BAR_ZUSATZBEZEICHNUNG"></system>
                  <code value="015"></code>
               </valueCoding>
            </extension>
            <coding>
               <system value="https://fhir.kbv.de/CodeSystem/74_CS_SFHIR_BAR2_WBO"></system>
               <code value="030"></code>
            </coding>
         </specialty>
      </ReferralRequest>
              </resource>
          </entry>
      </Bundle>
      Christian

      Comment


      • #4
        @Christian:
        Toll wie Du mir das erklärt hast. Danke! Haben die Bindestriche eine Bedeutung? Mal sind es 4 und mal 6. Ist das immer so bei MIME1?
        Wenn ich den Quellcode mit einem StreamReader einlese
        Code:
                Dim reader As New StreamReader("D:\VBEntwicklung\ML5.1.0.1\Debug\TerminService\Inbox\a16015cb-6db4-4405-956d-7b70e86f60aa.eml")
                Dim s As String = reader.ReadToEnd()
        dann habe ich Zeilenumbrüche und Leerzeichen im String. Geht es eleganter als unzählige Replaces zu machen? Dann muss ich wohl noch per IndexOf nach dem Boundary (Anfang und Ende) suchen?
        Habs jetzt im Spaghetti-Code erstmal zusammengefriemelt. "Gekonnt" sieht das aber nicht aus...

        Das XML ist fertig und ich kann den Wert, den ich brauche, auslesen.
        Code:
                Dim parameter As String = System.Text.Encoding.ASCII.GetString(Convert.FromBase64String(s))
                Dim xDoc As XElement = XElement.Parse(parameter)
                Dim xval As String = xDoc.<entry>.<resource>.<fh:ReferralRequest>.<fh:identifier>.<fh:value>.@value

        Comment


        • #5
          Post hat sich überschnitten. Wie hast Du das denn so schnell und sauber hinbekommen? Aus der eml heraus oder per Hand das Attachment ausgeschnitten?

          Comment


          • #6
            Das mit den Bindestriche weiß nicht nicht. Normalerweise hat man keine *.eml, sondern holt sich das per POP3 vom Mailserver.
            Zeilenumbrüche und Leerzeichen INNERHALB des BASE54 codierten Strings sind schädlich.
            Nach Boundaray suchen
            Headerinfos überlesen
            Nach dem Umbruch beginnt der BASE64 String
            Endet vor den Bindestrichen
            Christian

            Comment


            • #7
              Post hat sich überschnitten. Wie hast Du das denn so schnell und sauber hinbekommen? Aus der eml heraus oder per Hand das Attachment ausgeschnitten?
              In Java programmiert.....
              Christian

              Comment


              • #8
                Ich würde es nun gern noch etwas hübscher machen. Der StreamReader scheint nicht geeignet zu sein. Wieso macht der bei ankommenden +Zeichen ein Space davor und danach? Gibt es eine andere Möglichkeit die Bytes sauber zu lesen?
                Gruß Norbert

                Comment

                Working...
                X