mail per smtp lokal in postfix einliefern

Sladda

Aktives Mitglied
Hallo.

Ich habe ein Java-Programm geschrieben, das auf einer ubuntu maschine, per Shell-Aufruf emails an den postfix übergibt, der die mails dann versendet.
Etwa so:
Java:
String cmd = "/usr/sbin/sendmail -t;

		Process p = Runtime.getRuntime().exec(cmd);					
					
		InputStream p_i_s = p.getInputStream();
		InputStream p_e_s = p.getErrorStream();
					
		OutputStream ops = p.getOutputStream();
		PrintWriter out = new PrintWriter(new OutputStreamWriter(ops));
		out.println(prepareEmail(to,subject,html,text, nid, rid));
		out.flush();
(prepareEmail baut einen String zusammen, der die Email im MIME-Format enthält).

Jetzt möchte ich die mail aber nicht mehr über den Shell-Aufruf mit sendmail an den postfix geben, sondern lokal per smtp, da das wesentlich schneller gehen soll (wir haben sehr viele mails zum versenden (Kein Spam! ^^)).

Leider weiß ich nicht wie das geht. JavaMail scheint mir dafür nicht geeignet oder zumindest finde ich da keinen Ansatz um die Mail lokal einzuliefern und kann mir auch nicht vorstellen, dass das schneller geht, als der Shellaufruf wenn man bedenkt wie viele Objekte da bei JavaMail erzeugt werden usw...

Kann mir jemand weiterhelfen?

Viele Grüße
sladda
 
Keine Ahnung was du jetzt genau machen willst?
Mails erstellen und versenden? JavaMail
Einen MailServer? James - Overview
oder was?

EDIT:
>zumindest finde ich da keinen Ansatz um die Mail lokal einzuliefern

Was heisst das? Mails kann man Senden und Empfangen. Irre liefert man ein.
Senden tut man mit dem SMTP Protokoll
Empfangen wahlweise mit POP3 oder IMAP

Das alles kann JavaMail.
 
Zuletzt bearbeitet:
danke für die Antwort 🙂

Ich will Mails verschicken. In großen Mengen.
Dafür habe ich einen leistungsstarken root-server.
Auf diesem server soll eine java-Anwendung laufen, die die mails aus einer Datenbank holt und PER SMTP lokal an den postfix auf diesem server übergibt, der dann ja die mail versendet.

Momentan wird die mail per shell-cmd an den postfix übergeben. Funktioniert auch gut. Aber ich möchte ausprobieren, ob die Übergabe per SMTP schneller geht als per Shell-cmd.

Ich hoffe es ist jetzt deutlicher geworden was ich meine!?
 
>Ich will Mails verschicken.

Ok. Kling schön.

>In großen Mengen.

Ok. Kling dubios.

>Auf diesem server soll eine java-Anwendung laufen...

Wie liegen die Mails in der DB vor? flat mit header und body (.eml mässig?)
Könntest sie dann (via Stream) in eine MimeMessage packen (JavaMail) und
dann über Transport.send(...) an den postfix weiterleiten. Aber ob das schneller ist bezweifle ich.
 
> Ok. Kling dubios.
Keine Sorge, es geht alles mit rechten Dingen zu 🙂

> Wie liegen die Mails in der DB vor? flat mit header und body (.eml mässig?)
Sie sind quasi gestückelt (zB ein Feld für Betreff, ein Feld für den Text, etc.) und werden in Java dann als String zusammengebastelt, sodass ein valides MIME-Format rauskommt.

> Könntest sie dann (via Stream) in eine MimeMessage packen (JavaMail) und dann über Transport.send(...) an den postfix weiterleiten.
Ok, dann setze ich einfach localhost als SmtpHost ein und verzichte auf Authentication!?

> Aber ob das schneller ist bezweifle ich.
Das gilt es herauszufinden....
Eine andere Möglichkeit das gleiche zu erreichen ohne JavaMail gibt es nicht?
 
Ich hab da so ein FAQ-Teil, das man schnell ummodeln kann für Test. Da es soweit ich sehe simple Mails sind und keine Multiparts, kann man gleich alles in die Message drücken (setText() oder so) und muss keine Multiparts erstellen.

Was dabei teuer ist (zeitaufwendig), ist das erstellen der Session! Aber selbst ist dem Mann. Einfach mal ein wenig rumspielen


Java:
package ch.dmj.faq.mail;

import java.io.File;
import java.io.IOException;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.URLName;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;


class SimpleMail {

	// login data
	private static final String TYPE = "smtp";
	private static final String HOST = "localhost";
	private static final String USER = "sysadmin";
	private static final String PASSWD = "password";
	private static final int PORT = 25;
	// send data
	private static final String SENDER = "sysadmin@localhost";
	private static final String RECIPIENT = "test@localhost";

	public static void main(String[] args) throws Exception {
		sendMail();
	}

	private static void sendMail() throws NoSuchProviderException, MessagingException,
			AddressException, IOException {
		Properties props = new Properties();
		props.put("mail.smtp.starttls.enable", "true");
		Session session = Session.getDefaultInstance(props);
		session.setDebug(false);
		Transport tr = session.getTransport(new URLName(TYPE, HOST, PORT, null, USER, PASSWD));
		Message message = new MimeMessage(session);
		message.addRecipient(RecipientType.TO, new InternetAddress(RECIPIENT));
		message.addFrom(new InternetAddress[] { new InternetAddress(SENDER) });
		//subject
		message.setSubject("the subject");
		//the multipart
		MimeMultipart multiPart = new MimeMultipart("mixed");
		// a plaintext part
		MimeBodyPart body1 = new MimeBodyPart();
		body1.setContent("blub", "text/plain");
		multiPart.addBodyPart(body1);
		// a html part
		MimeBodyPart body2 = new MimeBodyPart();
		body2.setContent("<b>hallo welt</b>", "text/html");
		multiPart.addBodyPart(body2);
		// a picture
		MimeBodyPart body3 = new MimeBodyPart();
		body3.attachFile(new File("/home/user/Desktop/picture"));
		multiPart.addBodyPart(body3);
		// set the content to the multipart
		message.setContent(multiPart);
		//send
		tr.connect();
		tr.sendMessage(message, message.getAllRecipients());
		tr.close();
	}
}
 

Zurück
Oben