Sendefehler bei SMTP

Status
Nicht offen für weitere Antworten.

Bluevelvet64

Aktives Mitglied
Hallo

hoffe ich bin hier richtig mit meinem problem.

ich verwalte einen Linux-Server Suse 10.3 mit qmail. Der Server ist ein Root Server von 1+1.

Auf diesem Server läuft ein TomCat 6.x und darauf eine Webaplikation in Java. Diese muss mails senden.

Auf meinem Notebook habe ich das gleiche System allerdings mit Postfix anstatt qmail. Auf meinem Notebook kann ich über die Applikation Mails versenden. Auf dem Server von 1und1 geht es nicht.

Zum testen nehme ich nun kontakt zum mailserver über telnet auf und sende mit den gleichen befehlen wie die Applikation eine mail. Dann geht es auch.

In der folgenden Übersicht schreibe ich die befehle zeile für zeile über telnet und über die Applikation mit den dazugehörigen Rückmeldungen.

Telnet Applikation
---------------------------------------------------------------------------------------------------------
telnet localhost 25----------------------- Socket socket = new Socket(server,25);
220 SERVER ESMTP-------------------- 220 SERVER SMTP
helo localhost----------------------------s.println("helo localhost")
250 SERVER-----------------------------250 SERVER
mail from : MAIL--------------------------s.println("mail from:MAIL")
250 OK -----------------------------------250 OK
rcpt to:MAIL------------------------------s.println("rcpt to:MAIL")
250 OK------------------------------------250 OK
data----------------------------------------s.println("data")
354 go ahead----------------------------354 go ahead
sjdhsdhs----------------------------------s.println("jhdjshdjsjsd")
. -------------------------------------------s.println(".")
250 ok SERVER qp 3317---------------451 See http://pobox.com/~djb/docs/smtplf.html.

Die letzte zeile zeigt den fehler 451. Allerdings finde ich nichts aussagekräftiges was fehler 451 in SMTP zu sagen hat.

Witzigerweise kommt der Fehler nur auf dem 1und1 Server mit qmail. Auf meinem Notebook mit Suse10.3 und Postfix ( local ) oder smtp.arcor.de ( remote ) geht das senden über die Applikation.

Hat jemand eine Idee was hier schief gehen könnte ?

Danke für eine Antwort
 
T

tuxedo

Gast
Ist doch ganz klar. Die Lösung findest du auf http://cr.yp.to/docs/smtplf.html (dein link da oben macht nen redirect auf die Adresse hier).

Und da steht:

Bare LFs in SMTP
Most likely you're here because your mailer displayed the pointer ``See http://pobox.com/~djb/docs/smtplf.html.''
......
What is a bare LF, anyway?
It is an ASCII linefeed (LF) character not preceded by an ASCII carriage-return (CR) character.

Every line in an Internet mail message is required to end with CR LF. The entire message ends with CR LF dot CR LF. 822bis specifically prohibits other uses of LF.

The mail clients discussed above are incorrectly ending lines with LF and, in most cases, ending the entire message with LF dot LF. That's not CR LF dot CR LF, so a server such as msn.com will sit there waiting for the rest of the message. After a while it'll give up and drop the connection. Your mail doesn't get through.

Some mail servers convert a bare LF into CR LF, and accept LF dot LF as the end of a mail message. This behavior is specifically prohibited by 821bis.

Soll heissen: Dein Linefeed ist nicht korrekt und wird nicht akzeptiert.
 

Bluevelvet64

Aktives Mitglied
Habe dies auch schon gelesen, aber wenn das linefeed nicht korrect ist, dann dürfte der gleiche befehl doch wohl nie gehen. Aber über telnet geht es auf dem gleichen Server und auf jedem anderen Server postfix local auf meinem Notebook und dem smtp server von arcor geht es auch über die Applikation. Welche andere Möglichkeit den LF zu senden gibt es denn sonst noch. Habe an der Stelle auch schon herumgebastelt, aber egal wie ich den LF snede kommt die gleiche meldung.

Hast Du eine Idee. Danke für deine schnelle antwort.
 
T

tuxedo

Gast
was für nen Linefeed sendest du denn?
Hier wird ja ein CRLF empfohlen.

Und warum benutzt du nicht die Mail-API? Man muss das Rad ja nicht neu erfinden.

- Alex
 

Bluevelvet64

Aktives Mitglied
Ich verwende diese paar zeilen da ich schon Mail über Java versendet habe bevor es die Mail Api gab. Und diese methode hat in den vergangenen Jahren immer problemlos gearbeitet. Daher hatte ich keinen Grund mir die Mail API anzusehen.

ich sende bisher immer nur den Punkt. Aber auch ein \n bringt keinen Erfolg.

Danke für deiune Antwort
 
T

tuxedo

Gast
wie wär's wenn du \r auch noch mit ins Spiel bringst?

\n ist einfach nur LF
\r ist der geforderte CR

- Alex
 

Bluevelvet64

Aktives Mitglied
Danke für den Tip

aber jede Kombination aus

\r.\r

oder .\r\n

oder .\r

oder welche auch immer führt zu dem gleichen Fehler. ???
 
T

tuxedo

Gast
auf die Idee mit "\r\n.\r\n" bist du nicht gekommen, oder? Steht doch so im Text...

- Alex
 

Bluevelvet64

Aktives Mitglied
Habe nur nicht alle varianten beschrieben

hier der Auszug aus dem Text

s.println("data");
String dataST = server_output.readLine();
s.println("sasasaasas");
s.println("\r\n.\r\n");
String punktST = server_output.readLine();


In den Objekten dataST und PunktST stehen jeweils die Rückmeldungen des Servers.

Danke für deine Hilfe
 
T

tuxedo

Gast
Was steckt denn hinter println? Ich vermute da wird auch ein Zeilenunbruch gemacht. Lass mal sehen was sich da tut. Wenn da ein korrekter CRLF drin steckt, dann sollte

"\r\n."

funktionieren...

- Alex
 

Bluevelvet64

Aktives Mitglied
println sendet selbst einen LineFeed.

habe mal anstatt print genommen, gleicher Effekt.

und auch println("\r\n.") führt zu keinem Erfolg
 
T

tuxedo

Gast
Und was für ein LineFeed sendet println? Welche implementierung steckt dahinter? Aus welcher Klasse kommt die Methode?

- Alex
 

Bluevelvet64

Aktives Mitglied
hier die Erläuterung

println
public void println()
Terminate the current line by writing the line separator string. The line separator string is defined by the system property line.separator, and is not necessarily a single newline character ('\n').
 
T

tuxedo

Gast
Allem anschein nach verwendet println ein einfaches "\n" als LineFeed.

Wenn du print() nimmst, solltest du danach noch ein flush() ausführen. Generell bin ich kein Freund von solchen Implementierungen wie "PrintStream" wenn es um solche Anwendungen geht. Da benutz ich doch lieber einen nackigen OutputStream.

Mal schauen ob ich das ganze auf meinem Debian System hie reproduzieren kann. --> Debian hat kein Qmail drin. Ist mir auch n bisschen zu viel Stress das einzubauen.

Wäre es nicht einfacher und sicherer auf Java Mail API umzusatteln?

- Alex
 

Bluevelvet64

Aktives Mitglied
Hallo

danke nochmal für deine Hilfe.

Habe das problem gelöst. Man muss nach zeile die nach dem data kommt, am ende ein \r\n einfügen.

Also auch nach subject: hhhh \r\n
text\r\n

und am Ende bei .\r\n

Also Danke noch mal
 
T

tuxedo

Gast
Davon bin ich die ganze Zeit ausgegangen. Macht ja auch keinen Sinn unterschiedliche Linefeed-Varianten zu benutzen.

- Alex
 

Bluevelvet64

Aktives Mitglied
Hallo

in Subject und im text hatte ich bisher gar kein zeilende zeichen verwendet. Und das Ende habe ich bisher nur mit dem Punkt beendet. und beim testen habe ich daher nur bei dem Punkt ein \r oder \n oder \r\n usw. getestet. Daher hatte es nie funktioniert.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben