# Umlaute: E-Mail per JavaMail und Textfile



## freez (22. Nov 2008)

Hallo,

ich versuche ein Textfile einzulesen und dieses mit JavaMail zu verschicken. Nun habe ich ein Problem mit den Umlauten ... die kommen nicht so an, wie sie sollen, und manchmal fehlen auch die Zeilenumbrüche.

Die Textdatei habe ich einmal im UTF-8 und einmal im ANSI Format abgespeichert. Und egal, wie ich sie einlese (als Byte mit dem ByteToUTF8Converter, als InputStreamReader, ich habe nie ein befriedigendes Ergebniss.

Hier mal mein Code, der das File einliesst:



```
private String readTextFile(String Filename) {
		try {
			File file = new File(Filename);
			BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
			String line;
			StringBuffer buf = new StringBuffer();
			
			while((line = reader.readLine()) != null)
				buf.append(line);
			
			reader.close();
			return buf.toString();
}
```

Dies ist einer von meinen Tests. Ich habe es auch, wie gesagt in ein Byte Array eingelesen und versucht in UTF-8 zu konvertieren.

Was kann ich noch tun?


----------



## freez (22. Nov 2008)

Ich habe nun den String auch mal in der Konsole ausgegeben. Dort passen die Umlaute. Was läuft verkehrt?


----------



## HoaX (22. Nov 2008)

so wie du einliest erzwingst du utf-8. mehr kann man nicht zu deinem code sagen.

willst du die datei als anhang versenden? dann musst du nicht die datei einlesen sondern einfach nur FileDataSource verwenden...


----------



## freez (23. Nov 2008)

Nein, in der Textdatei ist der Text, der in der EMail drin stehen soll.

Hier auch noch der Code zum Senden der Mail:

```
public boolean sendMail(String recipientsAddress,String subject,String text, String senderAddress ){
		boolean email_sended = false;
        MailAuthenticator auth = new MailAuthenticator(username, password);
        Properties properties = new Properties();
        // Den Properties wird die ServerAdresse hinzugefügt
        properties.put("mail.smtp.host", smtpHost);

        // !!Wichtig!! Falls der SMTP-Server eine Authentifizierung
        // verlangt
        // muss an dieser Stelle die Property auf "true" gesetzt
        // werden
        properties.put("mail.smtp.auth", "true");

        // Hier wird mit den Properties und dem implements Contructor
        // erzeugten
        // MailAuthenticator eine Session erzeugt
        Session session = Session.getInstance(properties, auth);

        try {

            // Eine neue Message erzeugen
            Message msg = new MimeMessage(session);

            // Hier werden die Absender- und Empfängeradressen gesetzt
            msg.setFrom(new InternetAddress(senderAddress));
            msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipientsAddress, false));

            // Der Betreff und Body der Message werden gesetzt
            msg.setSubject(subject);
            msg.setText(text);

            // Hier lassen sich HEADER-Informationen hinzufügen
            msg.setHeader("Test", "Test");
            msg.setSentDate(new Date( ));

            // Zum Schluss wird die Mail natürlich noch verschickt
            Transport.send(msg);
            email_sended = true;
        }
        catch (Exception e) {
            email_sended = false;
            //TODO DEBUG Ausgabe
            e.printStackTrace();
        }
        return email_sended;
	}
```


----------



## freez (23. Nov 2008)

Ich habe scheinbar eine Lösung gefunden. Ich habe an beiden Seiten gedreht. Einmal beim einlesen und einmal beim E-Mail verschicken.

Hier mal die Methode zum verschicken der Mail mit den Einstellungen encoding = "8bit", charset = "iso-8859-1", contentType = "text/plain", subjectEncoding = "Q":

```
String encoding = "8bit";
    String charset = "iso-8859-1";
    String contentType = "text/plain";
    String subjectEncoding = "Q";

	
	public boolean sendMail(String recipientsAddress,String subject,String text, String senderAddress ){
		boolean email_sended = false;
        MailAuthenticator auth = new MailAuthenticator(username, password);
        Properties properties = new Properties();
        // Den Properties wird die ServerAdresse hinzugefügt
        properties.put("mail.smtp.host", smtpHost);

        // !!Wichtig!! Falls der SMTP-Server eine Authentifizierung
        // verlangt
        // muss an dieser Stelle die Property auf "true" gesetzt
        // werden
        properties.put("mail.smtp.auth", "true");

        // Hier wird mit den Properties und dem implements Contructor
        // erzeugten
        // MailAuthenticator eine Session erzeugt
        Session session = Session.getInstance(properties, auth);

        try {

            // Eine neue Message erzeugen
            Message msg = new MimeMessage(session);

            // Hier werden die Absender- und Empfängeradressen gesetzt
            msg.setFrom(new InternetAddress(senderAddress));
            msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipientsAddress, false));

            // Der Betreff und Body der Message werden gesetzt
//            msg.setSubject(subject);
//            msg.setText(text);

            msg.setSubject(MimeUtility.encodeText(subject, this.charset, subjectEncoding));

            msg.setText(text);

            // set Type and Charset in Headerfield 'Content-Type'
            msg.setHeader("Content-Type", this.contentType + "; charset=" + this.charset);

            // set Transfer-Encoding for printing umlauts
            msg.setHeader("Content-Transfer-Encoding", this.encoding);
            msg.setSentDate(new Date(System.currentTimeMillis()));
            msg.saveChanges();

            // Zum Schluss wird die Mail natürlich noch verschickt
            Transport.send(msg);
            email_sended = true;
        }
        catch (Exception e) {
            email_sended = false;
            //TODO DEBUG Ausgabe
            e.printStackTrace();
        }
        return email_sended;
	}
```

und zum einlesen des Files habe ich byteweise eingelesen und diese in UTF konvertiert:

```
private String readTextFile(String Filename) {
		try {
			
//			Vorabdeklaration
			File file = new File(Filename);
			FileInputStream fis = new FileInputStream(file);
			DataInputStream dis = new DataInputStream(fis);
			ByteToCharUTF8 converter = new ByteToCharUTF8();
			
			
//			Buffer und einlesen
			byte[] data = new byte[(int)file.length()];
			dis.read(data);
			dis.close();
			fis.close();
			
//			Konvertieren
			String result = new String(converter.convertAll(data));
			converter.reset();			

			return result;
```


----------



## freez (23. Nov 2008)

Achso, die Textdatei muss in UTF-8 ohne BOM vorliegen. Dann hat man alle Umlaute, Zeilenumbrüche und die "?" am Anfang des Files verschwinden.


----------

