alexdgg
Goto Top

SMTP-Mail Inhalt ermitteln

Hallo Leute,

ich habe in Java einen SMTP-Server implementiert für den Empfang von Mail über SMTP.

Das funktioniert auch ales sehr gut. Ich habe nur das Problem, dass ich den eigentlichen Inhalt der Mail nach SMTP(DATA) nicht extrahieren kann, da ich nicht weis wo er beginnt.
Das Ende der Mail ist ja durch "354 Start mail input; end with ." beschrieben. aber wie kann ich eindeutig den Anfang des Inhaltes ermitteln?

Hat jemand Rat für mich?

Content-ID: 151991

Url: https://administrator.de/contentid/151991

Ausgedruckt am: 26.11.2024 um 10:11 Uhr

KowaKowalski
KowaKowalski 29.09.2010 um 10:41:01 Uhr
Goto Top
Zitat von @alexdgg:
ich habe in Java einen SMTP-Server implementiert für den Empfang von Mail über SMTP.

Hi,

ich habe ja wirklich keine Ahnung von Java.
Aber eventuell stellt sich Dein Java quer weil SMTP eher für das senden von mails in Frage kommt.


mfg
kowa
alexdgg
alexdgg 29.09.2010 um 11:08:39 Uhr
Goto Top
Aber eventuell stellt sich Dein Java quer weil SMTP eher für das
senden von mails in Frage kommt.


mfg
kowa

SMTP ist das Protokoll mit dem Mail-Server Mails untereinander austauschen. Und zwar senden und empfangen!
Was Clients angeht, die senden nur über SMTP und empfangen über POP3 oder IMAP. Aber kein Mailserver wird über POP3 oder IMAP jemals Mails empfangen, weil dies auch nicht möglich ist.
Connor1980
Connor1980 29.09.2010 um 12:53:43 Uhr
Goto Top
Hallo,

Zitat von @alexdgg:
Aber kein Mailserver wird über POP3 oder IMAP jemals Mails empfangen, weil dies auch nicht möglich ist.

du meintest senden, nicht empfangen face-wink

So, um etwas kleinkariert zu sein:
mit POP3 und IMAP nicht empfangen, sondern abgerufen. (Empfangen ist passiv, ich bekomme etwas zugestellt, abrufen aktiv, ich hole ab.) face-wink

Grüße
alexdgg
alexdgg 29.09.2010 um 13:11:46 Uhr
Goto Top
du meintest senden, nicht empfangen face-wink >

Wenn ein Mailserver über SMTP Mails sended, dan EMPFÄNGT der andere Mailsserver an den es geht auch über SMTP

Hier die zugehörige RFC0821 Spezifikation zum Mailaustausch zwischen Mailservern

http://james.apache.org/server/rfclist/smtp/rfc0821.txt

Es heist ja auch nicht Simple Mail Sending Protocol sondern Simple Mail Transfer Protocol

mit POP3 und IMAP nicht empfangen, sondern abgerufen. (Empfangen ist passiv, ich bekomme etwas zugestellt, abrufen aktiv, ich hole ab.)

Deswegen habe ich ja geschrieben...
Aber kein Mailserver wird über POP3 oder IMAP jemals Mails empfangen, weil dies auch nicht möglich ist.


Das hilft mir alles aber mit meinem Problem nicht weiter. ;(
filippg
filippg 29.09.2010 um 19:47:03 Uhr
Goto Top
Hallo,

verstehe ich nicht.
Der Client sendet DATA, dein Server als Antwort daraufhin 354. Und genau dann fängt die Mail an.
Erst kommen die Header, dann eine Leerzeile, dann der Body (vielleicht meinst du das mit "eigentlichem Inhalt"). Irgendwann kommt eine Zeile, die nur einen . enthält, dann ist die Mail vorbei (bzw. schon am Ende der vorhergehenden Zeile). Aus einer Mail mit Attachments o.ä. den Text herauszufiltern ist nicht ganz trivial, dann müsstest du dich mal mit MIME auseinander setzen.

Gruß

Filipp
dog
dog 29.09.2010 um 21:36:58 Uhr
Goto Top
Aus einer Mail mit Attachments o.ä. den Text herauszufiltern ist nicht ganz trivial, dann müsstest du dich mal mit MIME auseinander setzen.

Was aber ein MTA gar nicht braucht.
Der Code ist ja ziemlich trivial:

<?php

	function read_mail(&$con)
	{
		$buf = '';  
		while(($line = fgets($con)) != '.') {  
			$buf .= $line;
		}
		return $buf;
	}

	//... verbindungsaufbau
	
	if(trim(fgets($con)) == 'DATA')  
		$mail = read_mail($con);
		
	//... abhandlung

?>
Natürlich ist das so nicht praxistauglich
alexdgg
alexdgg 30.09.2010 um 09:04:09 Uhr
Goto Top
Zitat von @filippg:
Der Client sendet DATA, dein Server als Antwort daraufhin 354. Und genau dann fängt die Mail an.
Erst kommen die Header, dann eine Leerzeile, dann der Body (vielleicht meinst du das mit "eigentlichem Inhalt").

Das Problem ist, dass von verschiedenen Clients verschiedene Header kommen (Format).

Bsp1:

From: test1@test.de
Subject: Testinhalt
To: test2@test.de
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8


Testinhalt
.

Bsp2:

Message-ID: <F83ACCA76B054072AFF0BAB6D26AB8A0@test.de>
From: "test" <test1@test.de>
To: <test2@test.de>
Subject: Test
Date: Thu, 30 Sep 2010 09:02:21 +0200
MIME-Version: 1.0
Content-Type: text/plain;

format=flowed;
charset="iso-8859-1";
reply-type=original
Content-Transfer-Encoding: 7bit
X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook Express 6.00.2900.5843
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5579

Testinhalt
.

Da ich den eigentlichen Inhalt (Text) als SMS senden will würde ich gerne den Header komplett entfernen. Mit dem ersten Leerzeichen haut aber auch nicht hin. Siehe Bsp2 Da kommen 2 Zeilen mit Leerzeichen und erst nach dem zweiten geht der Text los.

Kann ich über das Protokoll nicht irgendwie selber einen Seperator angeben?
KowaKowalski
KowaKowalski 30.09.2010 um 19:05:03 Uhr
Goto Top
Hi Alex,

ginge es denn nicht das Du im ersten Schritt feststellst welcher Client verwendet wird und dann erst die Behandlung für den Text losgeht?

Also erkenne Outlook Express als Client. Mailtext ab zeile 17

Erkenne Thunderbird als Client. Mailtext ab Zeile 9

und so weiter

Wobei Du dann natürlich ständig erweitern müsstest sowie sich ein "neuer" Mailclient verbreitet/durchsetzt. Und es müssten schon im Vorfeld alle verbreiteten Clienten in Diener Liste stehen.


OK OK, iss wohl nicht praktikabel

mfg
kowa
dog
dog 30.09.2010 um 21:19:03 Uhr
Goto Top
Das sind ja erstmal zwei Paar Schuhe.
Im ersten Schritt musst du erstmal den DATA-Block empfangen.
Zu dem Zeitpunkt ist ja erstmal völlig egal, was da drin steht.

Im zweiten Schritt kannst du dich dann an den Inhalt der Mail machen und da wurde das Stichwort schon gesagt: MIME
alexdgg
alexdgg 01.10.2010 um 09:21:03 Uhr
Goto Top
Zitat von @dog:
Im zweiten Schritt kannst du dich dann an den Inhalt der Mail machen und da wurde das Stichwort schon gesagt: MIME

Es muss doch auch irgendwann mal etwas einfach gehen... Jetzt muss ich mich auch noch mit dem Misst beschäftigen ;(