2008-11-07 17 views
10

Teslimat için kullanılan SMTP-Server ile uğraşmadan posta göndermek istiyorum. Ben bağlanmak için bir SMTP sunucusu belirtmek zorunda çünküBirisi Java için bir posta (SMTP) yayın kitaplığını biliyor mu?

Yani JavaMail API benim için çalışmaz.

ben posta adresi etki alanının MX kaydını sorgulayarak posta adresi için sorumlu olduğu SMTP sunucusu kendi başına öğrenmek için kitaplığı istiyorum.

Aspirin gibi bir şey arıyorum. Ne yazık ki, geliştirme 2004'te durdurulduğu ve kütüphanenin modern spam sertleştirilmiş sunucularla doğru şekilde iletişim kuramadığı için Aspirin'i kullanamam.

James bir gömülebilir sürümü görevi yapardı. Ancak bunun mümkün olup olmadığına dair belge bulamadım.

Ya da kullanabileceğim başka kütüphaneleri bilen var mı?

+0

Merak ediyorum, neden mesajlarını işlemek ve sizden işi boşaltmak için kendi posta sunucunuzu kullanmak istemiyorsunuz? – Joel

+0

Uygulama farklı ortamlarda farklı müşteriler için yüklenir. Rapor e-postalarını kendi e-posta adreslerine gönderecekler. "Kendi" e-posta sunucusunu "kendi" e-postalarını iletmek için kullanmalarını istemiyorum. –

+3

Aspirin ile ilgili çalışmanın yeniden başlatılmış gibi görünüyor. 2009 yılında GitHub'a taşındı (http://github.com/masukomi/aspirin) ve Eylül ayında yapılan bir sürüm. –

cevap

2

Bunu işlemenin tamamen yanlış yolu budur. Onların birkaç çünkü kaldıraç İSTİYORUM

vb ISS, ofis, - internete bağlı

herkes e-posta gönderme almaya kendilerine sunulan "okunaklı" SMTP sunucusu çeşit olacak Senin için şeyler. 1) mesajınızı ve bu mesajı işlemek için sorumluluk alırlar. Düştükten sonra, artık senin problemin değil.

2) Postadan korunma amaçlı tüm teknolojiler sunucu tarafından işlenir. Daha da iyisi, eğer bu teknolojiler değiştiğinde (Domain keys anyone?), Sunucu kodunuzu değil, işleyebilir.

3), yani gönderme posta sisteminin bir müşteri olarak, zaten o sunucu konuşmak için ne gerekiyorsa kimlik var. Ana SMTP sunucuları kimlik doğrulama, IP aralığı vb. Ile kilitlenir.

4) Tekerleği yeniden icat etmiyorsunuz.Sahip olduğunuz altyapıdan yararlanın. Bir uygulama veya posta sunucusu mu yazıyorsunuz? Posta sunucusunu ayarlamak, genellikle yapılması basit bir günlük bir görevdir. İnternet üzerindeki tüm bu "aptal" kullanıcıların hepsi e-posta kurulumunu başardı.

16

Olası bir çözüm: MX kaydını kendiniz edinin ve JavaMail API'u kullanın.

Sen dnsjava projesinin kullanıldığı MX kaydını alabilirsiniz:

Maven2 bağımlılık: MX kaydı alma için

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

Yöntem: JavaMail kodu aracılığıyla posta gönderme

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]; 
} 

:

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

Bunun kitle olayı için işe yarayacağını düşünmüyorum. Posta sunucusunu açık geçiş modunda yapılandıracak pek çok yönetici yoktur. Kendinizi sunucuya doğrulamanız gerekir .. – Lazarin

+4

Bu bir röle senaryosu değildir. Postayı, e-posta adresinden sorumlu posta sunucusuna gönderiyoruz. [email protected] gmail ve gmail'e teslim edilir. Geçerli bir gmail adresi ise mail kabul edilir. E-posta sistemi böyle çalışır. –

+1

Haklısınız, bir röleyi tanımıyorsunuz. Ancak, Lazarin'ın neyi kastettiğini düşünüyorum, spam ile sertleştirilmiş bir sunucunun, gönderen sunucunun iddia edilen gönderenin etki alanı için bir MX kaydında listelenmesini sağlamasıdır. Maven bağımlılığını eklemek için – erickson

2

Yapma.

E-posta göndermek, göründüğünden çok daha karmaşıktır. E-posta sunucuları güvenilir bir şekilde teslim edilmesinde mükemmel (ya da başarılı olmalı).

Gerekirse, ayrı bir e-posta sunucusu kurmanız gerekir - bu, Java'da bir uygulamayla aynı olacaktır (bu görev için kütüphaneleri bulacağınızdan şüpheliyim - bunlar aslında posta sunucularını tamamlayacaklardır), ancak çok daha basit .

İlgili konular