2009-01-04 25 views
38

के साथ जावामेल का उपयोग करके मुझे जावामेल एपीआई के संबंध में एसओ पर कई अन्य प्रश्न मिले और एक एसएमटीपी सर्वर के माध्यम से मेल भेजना, लेकिन उनमें से कोई भी टीएलएस सुरक्षा का उपयोग करके चर्चा नहीं कर पाया। मैं अपने काम के लिए एसएमटीपी मेल सर्वर के माध्यम से अपने आप को स्टेटस अपडेट भेजने के लिए जावामेल का उपयोग करने की कोशिश कर रहा हूं, लेकिन इसके लिए टीएलएस की आवश्यकता है, और मुझे किसी भी उदाहरण के लिए जावामेल का उपयोग करने के लिए कोई उदाहरण नहीं मिल सकता है जो एक एसएमटीपी सर्वर तक पहुंचने के लिए है जिसे टीएलएस एन्क्रिप्शन की आवश्यकता होती है। क्या कोई इसके लिए सहायता कर सकता है?टीएलएस

उत्तर

54

हमारे पास वास्तव में हमारे उत्पाद में कुछ अधिसूचना कोड है जो मेल उपलब्ध कराने के लिए टीएलएस का उपयोग करता है।

आपको जावा मेल गुण सेट करने की आवश्यकता होगी। आपको केवल टीएलएस की आवश्यकता है लेकिन अगर आपका एसएमटीपी सर्वर एसएसएल का उपयोग करता है तो आपको एसएसएल की आवश्यकता हो सकती है।

Properties props = new Properties(); 
props.put("mail.smtp.starttls.enable","true"); 
props.put("mail.smtp.auth", "true"); // If you need to authenticate 
// Use the following if you need SSL 
props.put("mail.smtp.socketFactory.port", d_port); 
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
props.put("mail.smtp.socketFactory.fallback", "false"); 

फिर आप या तो एक JavaMail सत्र या Session.getDefaultInstance(props) की तरह किसी अन्य सत्र instantiator को यह पारित कर सकते हैं।

+2

बहुत बहुत धन्यवाद! सचमुच मैंने जो किया वह लाइन props.put ("mail.smtp.starttls.enable", "true") जोड़ रहा था; मेरे कोड के लिए और यह पूरी तरह से काम किया! – dancavallaro

+1

ध्यान दें कि आधुनिक जावा.मेल के साथ सॉकेट फैक्ट्री की आवश्यकता नहीं है: http://stackoverflow.com/questions/17581066/using-javamail-with-a-self-igned-certificate/17584714#17584714 – Vadzim

22

अच्छा पोस्ट, लाइन

props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 

अनिवार्य एसएमटीपी सर्वर, एसएसएल प्रमाणीकरण का उपयोग करता है, तो जीमेल एसएमटीपी सर्वर की तरह काम करता है। हालांकि यदि सर्वर TLS पर प्लेनटेक्स्ट प्रमाणीकरण का उपयोग करता है, तो यह उपस्थित नहीं होना चाहिए, क्योंकि जावा मेल प्रारंभिक कनेक्शन सादे टेक्स्ट के बारे में शिकायत करेगा।

यह भी सुनिश्चित करें कि आप जावा मेल का नवीनतम संस्करण उपयोग कर रहे हैं। हाल ही में मैंने पिछले प्रोजेक्ट से कुछ पुराने जावा मेल जार का इस्तेमाल किया था और कोड काम नहीं कर सका, क्योंकि लॉगिन प्रक्रिया विफल रही थी। जावा मेल के नवीनतम संस्करण में अपग्रेड करने के बाद, त्रुटि का कारण स्पष्ट हो गया: यह एक javax.net.ssl.SSLHandshakeException था, जिसे lib के पुराने संस्करण में नहीं फेंक दिया गया था।

8

ऊपर दिए गए उदाहरण से सेटिंग्स उस सर्वर के लिए काम नहीं करती थी जिसका उपयोग मैं कर रहा था (authsmtp.com)। मुझे यह त्रुटि मिल रही है:

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection? 

मैंने mail.smtp.socketFactory सेटिंग्स और सबकुछ काम किया। अंतिम सेटिंग्स इस थे (एसएमटीपी प्रमाणन इस्तेमाल किया गया था नहीं और मैं बंदरगाह कहीं और सेट):

java.util.Properties props = new java.util.Properties(); 
props.put("mail.smtp.starttls.enable", "true"); 
6

बस निम्नलिखित कोड का उपयोग करें। यह जावा के माध्यम से ईमेल भेजने के लिए वास्तव में उपयोगी है, और यह काम करता है:

import java.util.*; 
import javax.activation.CommandMap; 
import javax.activation.MailcapCommandMap; 
import javax.mail.*; 
import javax.mail.Provider; 
import javax.mail.internet.*; 

public class Main { 

    public static void main(String[] args) { 
      final String username="[email protected]"; 
      final String password="password"; 
      Properties prop=new Properties(); 
      prop.put("mail.smtp.auth", "true"); 
      prop.put("mail.smtp.host", "smtp.gmail.com"); 
      prop.put("mail.smtp.port", "587"); 
      prop.put("mail.smtp.starttls.enable", "true"); 

      Session session = Session.getDefaultInstance(prop, 
      new javax.mail.Authenticator() { 
      protected PasswordAuthentication getPasswordAuthentication() { 
       return new PasswordAuthentication(username, password); 
      } 
     }); 
      try { 
       String body="Dear Renish Khunt Welcome"; 
       String htmlBody = "<strong>This is an HTML Message</strong>"; 
       String textBody = "This is a Text Message."; 
     Message message = new MimeMessage(session); 
     message.setFrom(new InternetAddress("[email protected]")); 
       message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("[email protected]")); 
     message.setSubject("Testing Subject"); 
     MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap(); 
     mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html"); 
     mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml"); 
     mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain"); 
     mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed"); 
     mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822"); 
     CommandMap.setDefaultCommandMap(mc); 
      message.setText(htmlBody); 
         message.setContent(textBody, "text/html"); 
      Transport.send(message); 

      System.out.println("Done"); 

     } catch (MessagingException e) { 
      e.printStackTrace(); 
     } 

    } 

} 
2

Simple Java Mail 5.0.0 के साथ (simplejavamail.org) यह बहुत ही सरल है और पुस्तकालय आप के लिए सभी सत्र गुण का ख्याल रखना होगा।

यहाँ गूगल के SMTP सर्वर का उपयोग एक उदाहरण है:

Email email = EmailBuilder.startingBlank() 
     .from("lollypop", "[email protected]") 
     .to("C.Cane", "[email protected]") 
     .withSubject("hey") 
     .withPlainText("We should meet up!") 
     .withHTMLText("<b>We should meet up!</b>") 
     .buildEmail(); 

MailerBuilder.withSMTPServer("smtp.gmail.com", 25, "user", "pass", SMTP_TLS) 
     .buildMailer() 
     .sendMail(email); 

MailerBuilder.withSMTPServer("smtp.gmail.com", 587, "user", "pass", SMTP_TLS) 
     .buildMailer() 
     .sendMail(email); 

MailerBuilder.withSMTPServer("smtp.gmail.com", 465, "user", "pass", SMTP_SSL) 
     .buildMailer() 
     .sendMail(email); 

आप द्वि-कारक लॉगिन चालू किया हुआ है, तो आप अपने गूगल खाते से एक application specific password उत्पन्न करने के लिए की जरूरत है।

संबंधित मुद्दे