2008-11-07 8 views
10

Ich möchte E-Mails senden, ohne mich um den SMTP-Server zu kümmern, der für die Zustellung verwendet wird.Jemand kennt eine Mail (SMTP) Delivery Library für Java?

So funktioniert JavaMail API nicht für mich, weil ich einen SMTP-Server angeben muss, um zu verbinden.

Ich möchte, dass die Bibliothek selbst herausfinden kann, welcher SMTP-Server für welche E-Mail-Adresse verantwortlich ist, indem sie den MX-Eintrag der Mail-Adressdomäne abfragt.

Ich bin auf der Suche nach etwas wie Aspirin. Leider kann ich Aspirin selbst nicht verwenden, da die Entwicklung 2004 eingestellt wurde und die Bibliothek nicht mehr korrekt mit modernen Spam-Servern kommunizieren kann.

Eine einbettbare Version von James würde die Aufgabe erledigen. Aber ich habe keine Dokumentation darüber gefunden, ob das möglich ist.

Oder weiß jemand über andere Bibliotheken, die ich verwenden könnte?

+0

Ich bin neugierig, warum möchten Sie nicht Ihren eigenen Mail-Server verwenden, um die Nachrichten zu behandeln und die Arbeit von Ihnen zu entladen? – Joel

+0

Die Anwendung wird für verschiedene Kunden in verschiedenen Umgebungen installiert. Sie werden Report-Mails an ihre eigene E-Mail-Adresse senden. Ich möchte nicht, dass sie "unseren" E-Mail-Server verwenden, um "ihre" E-Mails zuzustellen. –

+3

Beachten Sie, dass die Arbeit an Aspirin anscheinend neu gestartet wurde. Es wurde 2009 nach GitHub verlegt (http://github.com/masukomi/aspirin) und im September veröffentlicht. –

Antwort

2

Dies ist völlig die falsche Art, damit umzugehen.

Jeder mit dem Internet verbunden wird eine Art „Legit“ SMTP-Server haben, um sie zur Verfügung, die Einreichung von E-Mail zu nehmen - Ihr ISP, Ihr Büro usw.

Sie wollen nutzen, weil sie mehrere tun Dinge für dich.

1) Sie nehmen Ihre Nachricht und die Verantwortung, diese Nachricht zu behandeln. Nachdem du es abgelegt hast, ist es nicht mehr dein Problem.

2) Alle Mail-Spam-Technologien werden vom Server verarbeitet. Noch besser, wenn/wenn sich diese Technologien ändern (Domain-Schlüssel irgendjemand?), Verarbeitet der Server sie, nicht Ihren Code.

3) Sie haben als Client dieses sendenden E-Mail-Systems bereits alle Anmeldeinformationen, die Sie benötigen, um mit diesem Server zu sprechen. Die Haupt-SMTP-Server sind über Authentifizierung, IP-Bereich usw. gesperrt.

4) Sie erfinden das Rad nicht neu.Nutzen Sie die Infrastruktur, die Sie haben. Schreibst du eine Anwendung oder einen Mailserver? Einrichten von Mail-Server ist eine alltägliche Aufgabe, die in der Regel einfach zu tun ist. All diese Gelegenheitsbenutzer im Internet haben es geschafft, E-Mails einzurichten.

16

Eine mögliche Lösung: Holen Sie sich den MX-Datensatz selbst und verwenden Sie JavaMail API.

Sie können den MX-Eintrag mit dem dnsjava Projekt erhalten:

Maven2 Abhängigkeit:

<dependency> 
    <groupId>dnsjava</groupId> 
    <artifactId>dnsjava</artifactId> 
    <version>2.0.1</version> 
</dependency> 

Methode für MX Abruf:

public static String getMXRecordsForEmailAddress(String eMailAddress) { 
    String returnValue = null; 

    try { 
     String hostName = getHostNameFromEmailAddress(eMailAddress); 
     Record[] records = new Lookup(hostName, Type.MX).run(); 
     if (records == null) { throw new RuntimeException("No MX records found for domain " + hostName + "."); } 

     if (log.isTraceEnabled()) { 
      // log found entries for debugging purposes 
      for (int i = 0; i < records.length; i++) { 
       MXRecord mx = (MXRecord) records[i]; 
       String targetString = mx.getTarget().toString(); 
       log.trace("MX-Record for '" + hostName + "':" + targetString); 
      } 
     } 

     // return first entry (not the best solution) 
     if (records.length > 0) { 
      MXRecord mx = (MXRecord) records[0]; 
      returnValue = mx.getTarget().toString(); 
     } 
    } catch (TextParseException e) { 
     throw new RuntimeException(e); 
    } 

    if (log.isTraceEnabled()) { 
     log.trace("Using: " + returnValue); 
    } 
    return returnValue; 
} 

private static String getHostNameFromEmailAddress(String mailAddress) throws TextParseException { 
    String parts[] = mailAddress.split("@"); 
    if (parts.length != 2) throw new TextParseException("Cannot parse E-Mail-Address: '" + mailAddress + "'"); 
    return parts[1]; 
} 

Senden Mail über Java Mail Code:

public static void sendMail(String toAddress, String fromAddress, String subject, String body) throws AddressException, MessagingException { 
    String smtpServer = getMXRecordsForEmailAddress(toAddress); 

    // create session 
    Properties props = new Properties(); 
    props.put("mail.smtp.host", smtpServer); 
    Session session = Session.getDefaultInstance(props); 

    // create message 
    Message msg = new MimeMessage(session); 
    msg.setFrom(new InternetAddress(fromAddress)); 
    msg.setRecipient(Message.RecipientType.TO, new InternetAddress(toAddress)); 
    msg.setSubject(subject); 
    msg.setText(body); 

    // send message 
    Transport.send(msg); 
} 
+0

Ich denke nicht, dass dies für den Massenfall funktionieren würde. Es gibt nicht viele Administratoren, die ihren Mailserver im offenen Relay-Modus konfigurieren. Sie müssen sich beim Server authentifizieren. – Lazarin

+4

Dies ist kein Relay-Szenario. Wir liefern die Mail an den Mail-Server, der für die Email-Adresse zuständig ist. [email protected] wird an Google Mail zugestellt und Google Mail akzeptiert die Mail, wenn es sich um eine gültige Google Mail-Adresse handelt. So funktioniert das E-Mail-System. –

+1

Sie haben Recht, Sie beschreiben kein Relais. Aber, ich denke, Lazarin hat es verstanden, dass ein Spam-gehärteter Server sicherstellen wird, dass der sendende Host in einem MX-Eintrag für die Domäne des mutmaßlichen Absenders aufgeführt wird. – erickson

2

Nicht.

Senden von E-Mails ist viel komplexer als es scheint. E-Mail-Server zeichnen sich durch eine zuverlässige Zustellung aus (oder sollten diese übertreffen).

Richten Sie einen separaten E-Mail-Server, wenn Sie benötigen, das wird im Wesentlichen das gleiche wie die Implementierung in Java sein (Ich bezweifle, dass Sie Bibliotheken für diese Aufgabe finden - sie würden im Wesentlichen vollständige Mail-Server sein), aber viel einfacher .