C# Email senden, Frage zu Zeilenubruechen

Ranayna

Admiral
Registriert
Mai 2019
Beiträge
7.572
Hallo zusammen,

folgender Beispielcode, Teil eines groesseren Programmes das Informationen sammeln und per E-Mail verschickt:
C#:
String mailBody = String.Format("Script started at {0}\r\n\r\n", scriptstart);
....
Hier werden Daten in die Mail geschrieben.
....
mailBody += String.Format("\r\nFind the logfiles at {0}\r\n", AppDomain.CurrentDomain.BaseDirectory);
mailBody += String.Format("Script running on {0}\r\n", System.Environment.MachineName);
mailBody += String.Format("Script finished at: {0}\r\n", scriptend);
mailBody += "Revision 1";

MailMessage message = new MailMessage();
SmtpClient smtp = new SmtpClient();
message.From = new MailAddress("example@example.com");
message.To.Add(new MailAddress("example@example.com"));
message.Subject = "Example Mail";
message.Body = mailBody;
message.Attachments.Add(new Attachment("Dateiname.whatever"));

smtp.Port = 25;
smtp.Host = "Interner SMTP";
smtp.Send(message);

Zuerst, der Code funktioniert eigendlich wie er soll, und ist nur ein kleiner Teil eines groesseren Programmes dessen Code ich nicht posten kann.
Ich habe jetzt nur das mysterioese Phaenomen, das wenn ich die komplierte Exe manuell starte, alle Zeilenumbrueche passen wie sie sollen.
Packe ich das ganze aber in einen Scheduled Task auf einem Windows Server, dann sind die "\r\n" Zeilenumbrueche weg, witzigerweise aber nicht alle. Falls es relevant sein sollte, der Task laeuft als NT Authority\Network Service

Das ist jetzt eigendlich nur eine pisselige Kleinigkeit, aber ich weiss jetzt schon dass mich das den ganzen Weihnachtsurlaub beschaeftigen wird. :D
Ich werde leider keine weiteren Test mit unserem Emailserver machen koennen bevor dieser Urlaub beginnt, aber vielleicht ist jemandem schonmal was in der Richtung aufgefallen.
 
Schon mal mit newline probiert?
 
Was passiert, wenn du MailBody in eine Datei dumpst? Sind da alle \r\n noch da oder auch schon weg?
Wenn du die Mail als Rawtext anschaust, sind da die \r\n auch schon weg?
Wenn du im Wireshark den SMTP Verkehr mitschneidest (sofern das geht), fehlen die \r\n da auch?

SMTP mag kein "\r\n\r\n.\r\n\r\n" (oder so), da das das Ende einer Mail anzeigt. Mglw. macht da der SmtpClient was für dich.

Mailprogramme haben die Angewohnheit, \r\n manchmal nicht anzuzeigen (weil es "zu viele sind").
 
Versendest du den Mail-Body als Text oder als HTML? Bei HTML ist \r\n kein Zeilenumbruch sondern <br/>.
Bei Text-Mails kann dir eine automatische Absatz-Formatierung ganz schnell die Suppe versalzen bzw. dein Mail-Programm auf die Darstellung von Zeilenumbrüchen "zur besseren Lesbarkeit" verzichten.

Falls möglich, versuche den Mail-Body per HTML zu versenden, dort passiert meiner Erfahrung nach deutlich weniger Voodoo als bei Text-Nachrichten.


Und etwas Off-Topic: += löst bei Strings ein concat aus. Wenn du das in größerem Stil verwendest, dann verbrennst du Unmengen Arbeitsspeicher, da die Strings nie erweitert, sondern immer in neue, noch größere Strings kopiert werden. Eventuell lohnt es sich für dich mal einen System.Text.StringBuilder anzuschauen. Und rein syntaktischer Zucker, ohne Änderung am kompilierten Code: Statt
C#:
mailBody += String.Format("Script finished at: {0}\r\n", scriptend);
kannst du, falls dein Compiler C# 6 oder neuer beherrscht,
C#:
mailBody += $"Script finished at: {scriptend}\r\n";
schreiben.
 
  • Gefällt mir
Reaktionen: pcBauer
@Hancock: Waehrend der Debugphase habe ich mir den Mailbody in die Konsole ausgeben lassen, per
Code:
Console.WriteLine(mailBody);
. Da passte immer alles.

Das mit dem doppelten \r\n muss der SMTP Client rausfiltern. Denn das habe ich ja ganz oben drin fuer einen doppelten Zeilenumbruch. Und das passt auch, ich habe eine Leerzeile vor den eigendlichen Daten.
Aber vielleicht ist der mit dem Filtern etwas uebereifrig, denn das wuerde ein paar andere Eigenheiten erklaeren die mir beim Testen aufgefallen ist. Ich denke das wird fuer Tests im neuen Jahr mein Ansatzpunkt sein. Vielleicht mit direkten Newlines wie @Dreia vorschlaegt.

@SoDaTierchen: Plaintext, es sind nur zwei Spalten tabellarischer Daten im Mailbody, das wichtige ist im Anhang. Und halt die Infos zur Laufzeeit des Scripts. Ist den Aufwand nicht Wert das schoen zu machen. :)

Was dein OffTopic betrifft: Ich bin kein wirklicher Entwicker und habe einen grossen Teil meiner C# Kenntnisse for fast 15 Jahren in der Berufsschule erlangt :D Da merkt man wohl das ich wohl einiges nachzuholen habe :heul:
Mir ist bewusst dass das Concatenation ist die RAM verbraucht, aber das passiert erst ganz am Ende nachdem das Script fast eine Stunde Daten gesammelt hat, die in diversen List<string> und Dictionary<string, List<string>> landen. Da ist das dann ein Tropfen auf den heissen Stein. Und ein echter Entwickler mit moderneren Kenntnissen schlaegt die Haende ueber dem Kopf zusammen :p
 
Ich würde schauen, ob eine der verwendeten Klassen als Übergabewert oder sonst wo eine CultureInfo übernimmt. Diese würde dann wohl von PC zu PC unterschiedliche Ergebnisse liefern, wenn eine andere Culture eingestellt ist als an deinem PC. Auch unterscheidet sich der Zeilenumbruch bei TextBox und RichtTextBox voneiander. Es gibt auch noch Environment.NewLine. Was aber für dein Programm davon richtig ist, kann ich dir nicht sagen....
 
Mal etwas Rueckmeldung hier :)
@DerDaDrüben: Ich lasse das ganze nur in der Firma laufen, die Culture ist dort ueberall wo es in meinem Fall relevant ist die gleiche.
Davon abgesehen mache ich in dem ganzen script nur XML und Stringmanipulationen.
Ich hole mir via HTTP Clients XML-Strings von einem Webserver, die ich direkt nach XMLDocument casten kann. Diese XMLs durchsuche ich nach diversen Parametern, fasse die Ergebnisse in Dictonarys zusammen, und bastele aus dem ganzen Kram am Ende CSV Dateien die ich zippe und verschicke.
Ich wuesste also nicht, wo eine CultureInfo herkommen sollte.

Environment.NewLine funktioniert besser, aber witzigerweise immer noch nicht vollstaendig konsistent. Aber ich und meine Kollegen koennen damit leben und muss mich jetzt eh anderen Themen zuwenden :)
 
Zurück
Oben