# Sendefehler bei SMTP



## Bluevelvet64 (27. Feb 2008)

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


----------



## tuxedo (27. Feb 2008)

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?
> ...



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


----------



## Bluevelvet64 (27. Feb 2008)

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.


----------



## tuxedo (27. Feb 2008)

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 (27. Feb 2008)

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


----------



## tuxedo (27. Feb 2008)

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 (27. Feb 2008)

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. ???


----------



## tuxedo (27. Feb 2008)

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

- Alex


----------



## Bluevelvet64 (27. Feb 2008)

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


----------



## tuxedo (27. Feb 2008)

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 (27. Feb 2008)

println sendet selbst einen LineFeed.

habe mal anstatt print genommen, gleicher Effekt.

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


----------



## tuxedo (27. Feb 2008)

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

- Alex


----------



## Bluevelvet64 (27. Feb 2008)

Die Klasse ist PrintStream aus Java1.5


----------



## Bluevelvet64 (27. Feb 2008)

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').


----------



## tuxedo (27. Feb 2008)

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 (29. Feb 2008)

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


----------



## tuxedo (29. Feb 2008)

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

- Alex


----------



## Bluevelvet64 (29. Feb 2008)

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.


----------

