Toon posts:

[REGEX/VB.NET] Headers van email eruithalen...

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik maar hier gebruik van VB.NET en Regular Expressions. Mocht je een oplossing in een verwante taal met of zonder RegEx hebben dan ben ik ook geinteresseerd.

Een voorbeeld van een gedeelte van een header:

Received: [23.233.233.299] by mailer
Received: Mailvirusscanner
MessageID: <34tj4tioj43t@mailhost.nl>
To: "Some One" <Someone@here.com>, Some One" <Someone@here.com>,
"Some One" <Someone@here.com>, Some One" <Someone@here.com>,
"Some One" <Someone@here.com> Some One" <Someone@here.com>,
Date: Thu, 30 Jan 2003 15:28:30 +0100

Nu gebruik ik het volgende stuk code om de header op te spliten.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Private Sub setHeader(ByRef m As GetMail.mailmessage, ByVal h As String)
        'extract standard headers values from header string using regular expressions 
        'and save to the mailmessage class 
        m.To = Regex.Match(h, "To:(?<to>[^\n]+)\n", RegexOptions.IgnoreCase).Groups("to").Value
        m.From = Regex.Match(h, "From:(?<from>[^\n]+)\n", RegexOptions.IgnoreCase).Groups("from").Value
        m.Cc = Regex.Match(h, "CC:(?<cc>[^\n]+)\n", RegexOptions.IgnoreCase).Groups("cc").Value
        m.Subject = Regex.Match(h, "Subject:(?<subject>[^\n]+)\n", RegexOptions.IgnoreCase).Groups("subject").Value

        'clear existing header values 
        'this is just incase the same mailmessage instance is being reused 
        'for different mails  
        m.Headers.Clear()

        'extract less standard headers values from header string using regular expressions 
        'and add to the mailmessage.headers. 

        hReplyTo = Regex.Match(h, "Reply-To:(?<ReplyTo>[^\n]+)\n", RegexOptions.IgnoreCase).Groups("ReplyTo").Value
        hMessageID = Regex.Match(h, "Message-ID:(?<MessageID>[^\n]+)\n", RegexOptions.IgnoreCase).Groups("MessageID").Value
        hDate = Regex.Match(h, "Date:(?<Date>[^\n]+)\n", RegexOptions.IgnoreCase).Groups("Date").Value
    End Sub


De volgende problemen:

Je ziet in mijn voorbeeld header dat er meerdere Received: regels zijn. Hoe kan ik een RegEx maken die deze alle drie er uit haalt en achter elkaar plakt?

De To header bevat meerdere regels.... zoals het nu is leest de regularexpression alleen de 1e regel. Hoe kan ik dit wijzigen zodat hij alles mee pakt tot de volgende header?

De regular expression van de To header laat alleen het eerste wat tussen " " staat zien. Vb als de header zoals hierboven is krijg ik alleen "Someone",, terug.

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

RegExp.Multiline voor matchen met meerdere regels

VBScript Matches Collection Object
As I mentioned, the Matches collection object is only returned as a result of the Execute method. This collection object can contain zero or more Match objects, and the properties of this object are read-only.
http://msdn.microsoft.com...html/scripting051099.asp]

Rest kom je met wat gepruts vast wel uit.

Skill is when luck becomes a habit.


  • alley
  • Registratie: Mei 2002
  • Laatst online: 18-08 20:40

alley

ahuh

Je moet op zoek gaan naar \r (carriage return) ipv \n (new line):
C:
1
2
3
4
m.To = Regex.Match(h, "\nTo:(?<to>[^\r]+)\n", RegexOptions.IgnoreCase).Groups["to"].Value;
m.From = Regex.Match(h, "\nFrom:(?<from>[^\r]+)\n", RegexOptions.IgnoreCase).Groups["from"].Value;
m.Cc = Regex.Match(h, "\nCC:(?<cc>[^\r]+)\r", RegexOptions.IgnoreCase).Groups["cc"].Value;
m.Subject = Regex.Match(h, "\nSubject:(?<subject>[^\r]+)\r", RegexOptions.IgnoreCase).Groups["subject"].Value;

I am always doing that which I can not do, in order that I may learn how to do it. (Pablo Picasso)


Verwijderd

Topicstarter
alley schreef op 04 February 2003 @ 08:41:
Je moet op zoek gaan naar \r (carriage return) ipv \n (new line):
C:
1
2
3
4
m.To = Regex.Match(h, "\nTo:(?<to>[^\r]+)\n", RegexOptions.IgnoreCase).Groups["to"].Value;
m.From = Regex.Match(h, "\nFrom:(?<from>[^\r]+)\n", RegexOptions.IgnoreCase).Groups["from"].Value;
m.Cc = Regex.Match(h, "\nCC:(?<cc>[^\r]+)\r", RegexOptions.IgnoreCase).Groups["cc"].Value;
m.Subject = Regex.Match(h, "\nSubject:(?<subject>[^\r]+)\r", RegexOptions.IgnoreCase).Groups["subject"].Value;
Is er een speciale reden da je op lijn 1 en 2 aan het einde wel \n hebt laten staan ipv \r zoals op lijn 3 en 4?

Verwijderd

Topicstarter
eek schreef op 03 February 2003 @ 23:42:
RegExp.Multiline voor matchen met meerdere regels

VBScript Matches Collection Object
As I mentioned, the Matches collection object is only returned as a result of the Execute method. This collection object can contain zero or more Match objects, and the properties of this object are read-only.
http://msdn.microsoft.com...html/scripting051099.asp]

Rest kom je met wat gepruts vast wel uit.
Heeft niet geholpen :'( Weet je zeker dat daar de oplossing tussen staat?

  • alley
  • Registratie: Mei 2002
  • Laatst online: 18-08 20:40

alley

ahuh

Is geen speciale reden voor de verschillen tussen regels 1,2 en 3,4

Bij mij werkt ie wel zoals ie er staat, maar ik heb misschien nooit zo'n lange To: gehad :D

Heb ook ff geen tijd om dat uit te testen....
je zou natuurlijk ook regel voor regel kunnen parsen... Je kunt de header dan onderscheiden van de body door naar \n\n te zoeken

I am always doing that which I can not do, in order that I may learn how to do it. (Pablo Picasso)


Verwijderd

Topicstarter
alley schreef op 04 February 2003 @ 13:07:

je zou natuurlijk ook regel voor regel kunnen parsen... Je kunt de header dan onderscheiden van de body door naar \n\n te zoeken
Dat is helemaal problematisch om dan te kijken of de volgende regel bij de vorige hoort. Tenzij dit altijd is als het eerste karakter op de volgende regel een spatie is maar kon dit niet zo snel bevestigen met RFC dus ga daar voorals nog niet vanut.
Pagina: 1