Wie versende ich eine Email ohne eigenen Mailserver

Hallo,

ich war bisher der Meinung, dass ich immer einen ausgehenden Mailserver benötige (bzw. bisher gab es immer einen). Gibt es irgendeine (leichtgewichtige) Bibliothek, mit der ich Emails versenden kann? Es handelt sich dabei um einen no-reply-Versender, entsprechend erwarte ich keine Antworten vom Empfänger.

Hat hier jemand damit mal zu tun gehabt?

Gruß

Hi,

fragst du nach reinen Java Lösungen, oder funktioniert auch schlichte, lokal installierte Software? Wenn ja, Windows oder Linux?

Gruß
Tim

Ganz ohne Mailserver kommst du nicht aus, weil du ansonsten an den Spamfiltermaßnahmen nicht vorbeikommst. Bei Bedarf kann ich diesbezüglich auch gerne etwas detaillierter werden, die Details sind aber eigentlich nicht so wichtig.
Es reicht aber, wenn du beispielsweise den googlemail-Server verwendest. Dort kannst du eine eigene Domain hinzufügen und dann Mails von einer beliebigen Adresse unter dieser Domain mit den gängigen Mitteln (javamail mit STARTTLS-Authentifizierung) versenden.

Wie wäre es eigentlich mit Mailgun?

Voraussetzung: Du möchtest keine Massenmails versenden. Die ‚no-reply‘ Adresse legt da die Vermutung nahe, wenn du in kurzer Zeit viele Mails verschickst, landest du ruckzuck auf den Spamfiltern.

Die Mail API von Oracle:
http://www.oracle.com/technetwork/java/javamail/index.html

Hallo,

danke für die zahlreichen Antworten.

Em liebsten wäre mir tatsächlich eine schmale embedded Lösung in Java.

[QUOTE=cmrudolph;140554]Ganz ohne Mailserver kommst du nicht aus, weil du ansonsten an den Spamfiltermaßnahmen nicht vorbeikommst. Bei Bedarf kann ich diesbezüglich auch gerne etwas detaillierter werden, die Details sind aber eigentlich nicht so wichtig.
Es reicht aber, wenn du beispielsweise den googlemail-Server verwendest. Dort kannst du eine eigene Domain hinzufügen und dann Mails von einer beliebigen Adresse unter dieser Domain mit den gängigen Mitteln (javamail mit STARTTLS-Authentifizierung) versenden.[/QUOTE]
Interessant. Ich wurde nämlich mit großen Augen angesehen, als ich meinte, das ich das so gar nicht kenne, sondern eigentlich immer über einen Mailserver laufe. Die Antwort war „in PHP geht das out-of-the-box“.

Kannte ich bisher noch nicht. Aber ich glaube, das löst nicht mein Problem. Einen Mailserver irgendwo zu nutzen ist hier keine Option.

Es geht nicht um Massenmails sondern um Antworten, nach einer Registrierung in einer App. Solange sich keine Massen registrieren, gibt es hier auch kein Problem :smiley:

[QUOTE=homer65;140619]Die Mail API von Oracle:
http://www.oracle.com/technetwork/java/javamail/index.html[/QUOTE]
Ich hatte gehofft, dass es hier eine einfache und leichte Lösung gibt. :smiley:

Das hängt davon ab ob dein Code auf einem Server läuft oder auf einem Client. Mit dem Stichwort php nehme ich an, dass du von einem Server sprichst, und dann hast du das Problem von SPAM protection weniger.
Wenn clients die IP dynamisch von ihrem Provider zugewiesen bekommen, sind diese meist aus einem Bereich der eben als dynamisch gekennzeichnet ist. Viele Spam-protection system erlauben es nicht emails von diesen IPs zu senden.

Ein Server der eine eigenen IP hat die nicht in diesem Bereich liegt kann Mails direkt versenden. Die JAVA Mail API sollte dir dabei helfen.

Ohne es zu kennen: https://github.com/masukomi/aspirin

Ich würde so etwas aber tatsächlich auch nur für Testing benutzen. Spamfilter überprüfen auf MX-Records, auf Reverse DNS (dass der host part deiner Email, wenn man ihn per DNS Lookup ermittelt auch wirklich auf die gesendete IP passt, grob gesagt)… Ich befürchte, jeder Versuch an Personen außerhalb deiner eigenen Firma mit solchen Bastellösungen Mails zu senden wird kurz oder lang auf dem Spam Filter landen. Gerade bei Registrierungsmails wäre das ärgerlich. Das behandelt auch jeder Mailanbieter anders, ich hatte nach meinem Serverumzug vergessen Reverse DNS ordentlich zu konfigurieren (ich sende Mails mit Postfix), und bei allen GMX Empfängern sind die Mails sofort im Spam gelandet.

Wenn du eh einen eigenen Server hast: Postfix installieren, alle Umgebungsparameter ordentlich konfigurieren und dann aus der Java Anwendung per SMPT auf den Postfix verbinden.

Vielleicht hilft ein wenig Beispielcode:

			Properties props = new Properties();
			props.setProperty("mail.debug","true");
			props.setProperty("mail.smtp.port",Parameter.smtpport);
			props.setProperty("mail.smtp.host",Parameter.smtpserver);
			props.setProperty("mail.smtp.auth","false");
			Session session = Session.getDefaultInstance(props,null);
			MimeMessage message = new MimeMessage(session);
			try
			{
				message.setSubject(subject);
				//String enc = ZUtil.getDefaultPlatformEncoding();
				message.setText(text,Parameter.encoding);
				Address address = new InternetAddress(von);
				message.setFrom(address);
				for (int i=0;i<nach.size();i++)
				{
					Address toAddress = new InternetAddress(nach.get(i));
					message.addRecipient(Message.RecipientType.TO,toAddress);
				}
				for (int i=0;i<cc.size();i++)
				{
					Address ccAddress = new InternetAddress(cc.get(i));
					message.addRecipient(Message.RecipientType.CC,ccAddress);
				}
				for (int i=0;i<bcc.size();i++)
				{
					Address bccAddress = new InternetAddress(bcc.get(i));
					message.addRecipient(Message.RecipientType.BCC,bccAddress);
				}
				boolean anhang = false;
				if (Parameter.att.size() > 0) anhang = true;
				if (Parameter.dd.size() > 0) anhang = true;
				if (Parameter.txtdd.size() > 0) anhang = true;
				MimeMultipart mimeMultipart = new MimeMultipart();
				if (anhang == true)
				{
				    MimeBodyPart textpart = new MimeBodyPart();
				    textpart.setText(text,Parameter.encoding);
				    textpart.setDisposition(MimeBodyPart.INLINE);
				    mimeMultipart.addBodyPart(textpart);
				}
				if (Parameter.att.size() > 0)
				{
					for (int i=0;i<Parameter.att.size();i++)
					{
						File file = new File(Parameter.att.get(i));
						MimeBodyPart attachement = new MimeBodyPart();
						attachement.setDataHandler(new DataHandler(new FileDataSource(file)));
						attachement.setFileName(getFileName(file));
						attachement.setDisposition(MimeBodyPart.ATTACHMENT);
						mimeMultipart.addBodyPart(attachement);
					}
				}
				if (Parameter.dd.size() > 0)
				{
					String jn = Parameter.jobname;
					for (int i=0;i<Parameter.dd.size();i++)
					{
						String ddn = Parameter.dd.get(i);
						ocopy(ddn);
						File file = new File(jn + "." + ddn + ".bin");
						MimeBodyPart attachement = new MimeBodyPart();
						attachement.setDataHandler(new DataHandler(new FileDataSource(file)));
						attachement.setFileName(filename);
						attachement.setDisposition(MimeBodyPart.ATTACHMENT);
						mimeMultipart.addBodyPart(attachement);
					}
				}
				if (Parameter.txtdd.size() > 0)
				{
					String jn = Parameter.jobname;
					for (int i=0;i<Parameter.txtdd.size();i++)
					{
						String ddn = Parameter.txtdd.get(i);
						ocopytxt(ddn);
						File file = new File(jn + "." + ddn + ".bin");
						MimeBodyPart attachement = new MimeBodyPart();
						attachement.setDataHandler(new DataHandler(new FileDataSource(file)));
						attachement.setFileName(filename);
						attachement.setDisposition(MimeBodyPart.ATTACHMENT);
						mimeMultipart.addBodyPart(attachement);
					}
				}
				if (anhang) message.setContent(mimeMultipart);
				Transport transport = session.getTransport("smtp");
				//transport.connect("smtp.intern.xxx.de","ece","xxx");
				//transport.connect("10.1.251.19","ece","ae48it");
				//transport.connect(Parameter.smtpserver,"ece","xxx");
				transport.connect();
				transport.sendMessage(message,message.getAllRecipients());
				transport.close();
			}
			catch (Exception e)
			{
				maxrc = 12;
				System.out.println("Verarbeitung:Exception:");
				System.out.println(e);
			}

Die php-eigene Funktion nutzt einen lokal installierten Mailserver. Unter Linux läuft grundsätzlich ein Mailserver, der normalerweise aber nur für lokale Mailzustellung konfiguriert ist.
Siehe zu php auch die Referenzdokumentation: PHP: mail - Manual

The Windows implementation of mail() differs in many ways from the Unix implementation. First, it doesn’t use a local binary for composing messages but only operates on direct sockets which means a MTA is needed listening on a network socket (which can either on the localhost or a remote machine).

Das liegt genau daran, dass unter Windows normalerweise kein lokaler Mailserver zur Verfügung steht.

Bei Webservern, die Mails versenden können, sind die lokalen Mailserver so konfiguriert, dass sie auch Mails an andere als lokale Adressen zulassen.

Wie @AmunRa schon richtig angemerkt hat, ist es nahezu unmöglich, Mails von dynamischen IP-Adressen aus zuzustellen. Und auch bei einem Server mit statischer IP-Adresse ist extrem viel Aufwand notwendig, um Mails zuverlässig zuzustellen.
Bis gestern konnte ich beispielsweise keine Mails an googlemail zustellen, weil sie nicht vom Server signiert wurden. Andere Provider nehmen Mails nicht an, weil man kein ausreichendes Versandvolumen hat oder die Reputation eines IP-Adressbereiches zu schlecht ist. Kleine Fehlkonfigurationen (Reverse-Lookup passt nicht zum Hostnamen, SMTP wird nicht 100%ig eingehalten, Header werden nicht ganz korrekt gesetzt…) können dazu führen, dass Mails nicht ankommen.
Am einfachsten ist es tatsächlich, sich auf einen externen Dienst zu verlassen und diesen mit javamail anzusprechen.

Habe übrigens noch ein einfaches Beispiel zum versenden einer EMail ohne Anhang per Google Mail gefunden.

package pack;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;
public class Main 
{
	public static void main(String[] args) 
	{
		final String username = "homer65";
		final String password = "xxx";
		Properties props = new Properties();
		props.put("mail.smtp.auth", "true");
		props.put("mail.smtp.starttls.enable", "true");
		props.put("mail.smtp.host", "smtp.gmail.com");
		props.put("mail.smtp.port", "587");
		Session session = Session.getInstance(props,
		  new javax.mail.Authenticator() {
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(username, password);
			}
		  });
		try 
		{

			Message message = new MimeMessage(session);
			message.setFrom(new InternetAddress("homer65@googlemail.com"));
			message.setRecipients(Message.RecipientType.TO,
				InternetAddress.parse("xy@z.de"));
			message.setSubject("Test Betreff");
			message.setText("Bla bla bla");
			Transport.send(message);
		} 
		catch (MessagingException e) 
		{
			throw new RuntimeException(e);
		}
	}
}

Habe mein letztes Beispiel mal ausprobiert. Mit Google Mail klappt es leider nicht mehr. Aber über den SMTP Server von Strato hatt es noch funktioniert.