Javax.Mail: Check this out

timbeau

Gesperrter Benutzer
Hallo zusammen,

ich habe für einen Freund ein Programm zusammengestöpselt aus verschiedenen Funden im Internet und meinem Kopf.

Der Kern des Programms versendet eine Email mittels SMTP. Das klappt auch soweit.
Ein Problem existiert jedoch, er hat unter Windows XP vor dem Betreff und dem Inhalt jeweils ein Fragezeichen stehen. Umlaute gehen jedoch.

Bei mir unter Linux klappt beides korrekt.

Auf meinem Handy sehe ich die Mail-Betreffzeile wiederrum komisch, wenn mein Kumpel sie über sein System an mich verschickt:
=?CP1252?Q?=3F......

Es werden also die Umlaute anders dargestellt. Die gleiche Email ist jedoch im Thunderbird und in Evolution korrekt, bis auf das Fragezeichen.

Die eigentliche Frage ist, ob ich irgendetwas besser machen kann, übersehen habe etc. im Bereich des Versendens und der richtigen Kodierung.

Schonmal vielen Dank.


Hier der Abschnitt der die Mail versendet:

Java:
public boolean sendMail(String recipientsAddress, String password) {
		
		String username = getProperty("username");
		String host = getProperty("mail.smtp.host");
		String port = getProperty("mail.smtp.port");
		String senderAddress = getProperty("senderAddress");
		String text = getTextFile(getProperty("newsTextPath"));
		String subject = getTextFile(getProperty("subjectPath"));
		String attachmentPath = getProperty("attachmentPath");
		File file2send = new File(attachmentPath);
		
		Session session = prepareTechnicalPart(password, username, host, port);

		return technicalPart(recipientsAddress, senderAddress, text, subject, session, file2send);
		
	}

	private Session prepareTechnicalPart(String password, String username,
			String host, String port) {
		MailAuthenticator auth = new MailAuthenticator(username, password);
		Properties properties = new Properties();

		properties.put("mail.smtp.host", host);
		properties.setProperty("mail.smtp.port", port);
		properties.put("mail.smtp.auth", getProperty("mail.smtp.auth"));

		Session session = Session.getDefaultInstance(properties, auth);
		return session;
	}

	private boolean technicalPart(String recipientsAddress, String senderAddress,
			String text, String subject, Session session, File file2send) {
		try {
			
			Message msg = new MimeMessage(session);	

			
			msg.setFrom(new InternetAddress(senderAddress));
			msg.setRecipients(Message.RecipientType.TO,
					InternetAddress.parse(recipientsAddress, false));

			MimeBodyPart textBodyPart = new MimeBodyPart();


			textBodyPart.setText(text);
			textBodyPart.setDisposition(MimeBodyPart.INLINE);

			msg.setSubject(subject);
			msg.setText(text);

			MimeBodyPart attachement = new MimeBodyPart();
			attachement.setDataHandler(new DataHandler(new FileDataSource(
					file2send)));
			attachement.setFileName(file2send.getName());
			attachement.setDisposition(MimeBodyPart.ATTACHMENT);

			MimeMultipart mimeMultipart = new MimeMultipart();
			mimeMultipart.addBodyPart(textBodyPart);
			mimeMultipart.addBodyPart(attachement);

			msg.setContent(mimeMultipart);

			msg.setSentDate(new Date());

			Transport.send(msg);

		} catch (Exception e) {
			System.err.println("Malfunction of sending process. System will exit.");
			e.printStackTrace();
			return false;
		}
		return true;
	}


Hiermit lese ich gespeicherte Textdateien ein.

Java:
private String getTextFile(String source) {
		StringBuffer sb = new StringBuffer();
		try {
			Reader fr = new InputStreamReader(new FileInputStream(source), "UTF-8");
			BufferedReader br = new BufferedReader(fr);
			String line;
			while ((line = br.readLine()) != null) {
				sb.append(line);
				sb.append(System.getProperty("line.separator"));
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		return sb.toString();

	}

Gibt es da eine gute Möglichkeit um so ein System Windows + Linux kompatibel zu gestalten?

Schönen Gruß, Tim
 
Ja, das liegt an der Kodierung. Ist schon bissle her das ich mich damit beschäftigt habe, aber konnte man nicht Programm intern das verwenden von UTF8 einstellen? (Oder war das nicht sogar Standard?). Wie Thunderbird damit umgeht weiß ich nicht, aber Linux und Windows verwenden da beide andere standards. Man konnte aber imho im Email-Header angeben welche Codierung verwendet wurde wenn ich mich grad recht entsinne.
 
Zuletzt bearbeitet:
Naja, das Tutorial ist ja gut gemacht, aber über diese Ebene bin ich ja hinweg. Der Versand an sich funktioniert ja. Mein Problem ist das Zusammenspiel: Windows-Konsole - UTF-8 Dateien - Java - Mail(-Server)?


Mir ist auch klar, dass CP1252 DER Windows Zeichensatz ist. Mein Gedanke ist aber auch, innerhalb des Programms komplett auf UTF-8 zu setzen. Ist das so unmöglich?

Hat vielleicht jmd. noch einen Gedanken?
 
Hmm,

ich weiß nicht wieweit die CMD da mit eingreift. Dürfte ja eigentlich nicht sein. Es wird nur über das Programm gelesen und geschrieben. Es kann aber natürlich über cmd mittels java -jar usw gestartet werden. War eher eine Vermutung.

Hier übrigens noch die Speicherende Methode:

Java:
public void writeFile(String text, String path){
		String charsetName = "UTF8";
		BufferedWriter bw = null;
		try {
			bw = new BufferedWriter(new OutputStreamWriter(new BufferedOutputStream
					(new FileOutputStream(new File(path)) ), charsetName));
			bw.write(text);
		} catch (IOException e) {
			e.printStackTrace();
		}
		finally {
			if(bw != null){
				try {
					bw.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		
	}



@TheRealSpike: Das hab ich doch schon längst .. .
 
Ach echt ? Du hast also schon das MIME-Encoding UTF-8 in deiner Mail ? Wo denn bitte ... weil alles was ich sehe ist das du das File mit UTF-8 einliest ... dies aber nirgends in der E-Mail setzt !
 
Ahh ok, dann hab ich dich falsch verstanden. Danke.

Ich hab auch noch was anderes entdeckt und gebe gleich nochmal Rückmeldung nach dem Schalkespiel 😉

Sorry, zu müde. Hab lange mit Header Infos rumgespielt ala:

Java:
/msg.setHeader("Content-Transfer-Encoding", "8bit");
			msg.addHeader("Content-Type", "text/plain; charset=ISO-8859-1");
			msg.saveChanges();

und mit utf-8 aber dann sind die Mails völlig vermurkst. Ich bin einen Schritt weitergekommen, dass ich bemerkt habe, dass es an einer Speichermethode lag die nur aufgerufen wird, wenn ich das als Jar exportiere. Diese habe ich abgewandelt und jetzt wird auch, wenn ich das Jar über Windows-Konsole starte, auf meinem Handy alles korrekt angezeigt. Scheint, dass da Thunderbird mehr korrigieren kann als Symbian.

Gute Nacht und ich melde mich die Tage
 
Zuletzt bearbeitet:

Zurück
Oben