2012-10-05 18 views
12

मैंने एसएमटीपी के माध्यम से एसएमटीपी के माध्यम से जेवामेल एपीआई का उपयोग करके ईमेल भेजने के लिए निम्नलिखित कोड लिखा है क्योंकि एसएसएल समर्थित नहीं है लेकिन मैं समाप्त हुआ निम्नलिखित अपवाद के साथ। कृपया नीचे मेरा कोड देखें। मैंने डिबगिंग मोड का उपयोग किया है और कोड के नीचे आप अपवाद भी पा सकते हैं।SMTP का उपयोग करके एक ईमेल भेजने में असमर्थ (javax.mail.MessagingException प्राप्त करना: सॉकेट को टीएलएस में परिवर्तित नहीं किया जा सका;)

import java.util.Properties; 
import javax.mail.Message; 
import javax.mail.MessagingException; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 

public class SendMailTLS { 

    public static void main(String[] args) { 

     final String username = "[email protected]"; 
     final String password = "***********"; 

     Properties props = new Properties(); 
     props.put("mail.smtp.auth", "true"); 
     props.put("mail.smtp.starttls.enable", "true"); 
     props.put("mail.smtp.host", "mail.mydomain.com"); 
     props.put("mail.smtp.debug", "true"); 
     props.put("mail.smtp.port", "587"); 

     Session session = Session.getInstance(props, 
      new javax.mail.Authenticator() { 
      protected PasswordAuthentication getPasswordAuthentication() { 
       return new PasswordAuthentication(username, password); 
      } 
      }); 
     session.setDebug(true); 

     try { 

      Message message = new MimeMessage(session); 
      message.setFrom(new 
        InternetAddress("[email protected]")); 
      message.setRecipients(Message.RecipientType.TO, 
      InternetAddress.parse("[email protected]")); 
      message.setSubject("Testing Subject"); 
      message.setText("Dear Mail Crawler," 
       + "\n\n No spam to my email, please!"); 

      Transport.send(message); 

      System.out.println("Done"); 

     } catch (MessagingException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 

अपवाद ट्रेस

DEBUG: setDebug: JavaMail version 1.4.5 
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc] 
DEBUG SMTP: useEhlo true, useAuth true 
DEBUG SMTP: useEhlo true, useAuth true 
DEBUG SMTP: trying to connect to host "mail.mydomain.com", port 587, isSSL false 
220-cpanel35.per.syra.net.au ESMTP Exim 4.80 #2 Fri, 05 Oct 2012 17:28:56 +0800 
220-We do not authorize the use of this system to transport unsolicited, 
220 and/or bulk e-mail. 
DEBUG SMTP: connected to host "mail.mydomain.com", port: 587 

EHLO xxxxxx.xxxxx.com 
250-cpanel35.per.syra.net.au Hello xxxx.xxxxx.com [xx.xx.xx.xxx]i 
250-SIZE 52428800 
250-8BITMIME 
250-PIPELINING 
250-AUTH PLAIN LOGIN 
250-STARTTLS 
250 HELP 
DEBUG SMTP: Found extension "SIZE", arg "52428800" 
DEBUG SMTP: Found extension "8BITMIME", arg "" 
DEBUG SMTP: Found extension "PIPELINING", arg "" 
DEBUG SMTP: Found extension "AUTH", arg "PLAIN LOGIN" 
DEBUG SMTP: Found extension "STARTTLS", arg "" 
DEBUG SMTP: Found extension "HELP", arg "" 
STARTTLS 
220 TLS go ahead 
Exception in thread "main" java.lang.RuntimeException: javax.mail.MessagingException: Could not convert socket to TLS; 
    nested exception is: 
    javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair 
    at SendMailTLS.main(SendMailTLS.java:52) 
Caused by: javax.mail.MessagingException: Could not convert socket to TLS; 
    nested exception is: 
    javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair 
    at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1918) 
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:652) 
    at javax.mail.Service.connect(Service.java:317) 
    at javax.mail.Service.connect(Service.java:176) 
    at javax.mail.Service.connect(Service.java:125) 
    at javax.mail.Transport.send0(Transport.java:194) 
    at javax.mail.Transport.send(Transport.java:124) 
    at SendMailTLS.main(SendMailTLS.java:47) 
Caused by: javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair 
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:208) 
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1868) 
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1826) 
    at sun.security.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java:1809) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1328) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1305) 
    at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:548) 
    at com.sun.mail.util.SocketFetcher.startTLS(SocketFetcher.java:485) 
    at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1913) 
    ... 7 more 
Caused by: java.lang.RuntimeException: Could not generate DH keypair 
    at sun.security.ssl.DHCrypt.<init>(DHCrypt.java:123) 
    at sun.security.ssl.ClientHandshaker.serverKeyExchange(ClientHandshaker.java:618) 
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:202) 
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868) 
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:804) 
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:998) 
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1294) 
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1321) 
    ... 11 more 
Caused by: java.security.InvalidAlgorithmParameterException: Prime size must be multiple of 64, and can only range from 512 to 1024 (inclusive) 
    at com.sun.crypto.provider.DHKeyPairGenerator.initialize(DHKeyPairGenerator.java:120) 
    at java.security.KeyPairGenerator$Delegate.initialize(KeyPairGenerator.java:658) 
    at sun.security.ssl.DHCrypt.<init>(DHCrypt.java:117) 
    ... 18 more 

किसी को भी मुझे इस डिबग मदद कर सकते हैं? अग्रिम में धन्यवाद!

उत्तर

9

मैं सिर्फ नीचे संपत्ति

props.put("mail.smtp.starttls.enable", "true"); 

टिप्पणी करके इस समस्या का समाधान और कोड कोई त्रुटि या चेतावनी के साथ मार डाला गया या बस ऊपर के स्रोत कोड से इस लाइन को हटाना। यह आज तक एक आकर्षण की तरह काम कर रहा है।

+0

दूसरे शब्दों में इस संपत्ति को mail.smtp.starttls.enable = false –

+12

के रूप में सेट करें दूसरे शब्दों में, आपका पासवर्ड इंटरनेट के माध्यम से सादे पाठ के रूप में यात्रा कर रहा है। बहुत बुरी सलाह। – dschulz

+0

हाँ, यह एन्क्रिप्टेड नहीं है। यह आपके ईमेल को जंक मेल के रूप में भी भेज देगा। – santafebound

2

ऐसा लगता है कि आपके सर्वर द्वारा उपयोग किए गए SSL कार्यान्वयन को आपके द्वारा उपयोग किए जा रहे जेडीके के संस्करण में SSL कार्यान्वयन के साथ संगत नहीं है। फ़ाइल SSLNOTES.txt (जावामेल डाउनलोड बंडल में भी शामिल है) में कुछ डिबगिंग युक्तियां हैं। इसे हल करने के लिए आपको एक जेडीके एसएसएल विशेषज्ञ की आवश्यकता हो सकती है।

+0

उत्तर विधेयक के लिए धन्यवाद। –

1

आप SSL का उपयोग नहीं करना चाहते हैं, और आप smtps के बजाय smtp उपयोग कर रहे हैं इन सेटिंग्स

mail.smtp.starttls.enable=false 
mail.transport.protocol=smtp 
1

मैं इस समस्या थी प्रयास करें। कारण हमारे व्यवस्थापक ने टीएलएस और एसएसएल प्रोटोकॉल को अवरुद्ध कर दिया था।

3

सुनिश्चित करें कि आपका एंटीवायरस सॉफ़्टवेयर एप्लिकेशन को अवरुद्ध नहीं कर रहा है। मेरे मामले में अवास्ट मुझे जावा एसई एप्लिकेशन में ई-मेल भेजने से रोक रहा था।

+1

कृपया अंग्रेजी उत्तर पोस्ट करें – msrd0

+0

आंद्रे एंड्रैड ने इसे मेरे लिए हल किया! मेरे मामले में, यह सबसे उपयोगी उत्तर था (और, चूंकि इस समस्या का परीक्षण करने में 1 मिनट लगते हैं, इसलिए अन्य सभी चीज़ों पर घंटों को बर्बाद करने से पहले इसे आजमाएं) – Jake

8

संपत्ति "mail.smtp.starttls.enable" पर टिप्पणी करने का अर्थ है कि आप एक डिफ़ॉल्ट और असुरक्षित कनेक्शन पर वापस आते हैं, जो केवल तभी काम करेगा जब रिमोट एसएमटीपी होस्ट पोर्ट 587 पर असुरक्षित परिवहन स्वीकार करता है (मेल के लिए बंदरगाह एंड-डिलीवरी या रिले ऑपरेशंस के लिए पोर्ट 25 बनाम जमा करें)। मेरे संदर्भ में, टीएलएस 587 पर अनिवार्य है और TLS के बिना एक सत्र को खोलने के लिए किसी भी प्रयास को उपज एसएमटीपी सर्वर त्रुटि प्रतिसाद "530 पहले एक STARTTLS आदेश जारी करना चाहिए"। फिर "mail.smtp.starttls.enable" को "सच" अकेले अब भी वही त्रुटि उपज लेकिन अब एक सुराग के साथ "टीएलएस को सॉकेट नहीं बदला जा सका" सेटिंग: "सर्वर विश्वसनीय नहीं है"। दूरस्थ करने के लिए सेट "mail.smtp.ssl.trust": वास्तव में, आप या तो एक कीस्ट्रोक JVM में परिभाषित गुण है कि प्रमाणपत्र श्रृंखला किसी विश्वसनीय रूट प्रमाणपत्र पर समाप्त होने वाले होते हैं, या तो इस अतिरिक्त संपत्ति के साथ विश्वास को लागू शुरू होना आवश्यक है मेजबान का नाम

उदाहरण (जो आप आसानी से सादे javamail एपीआई को मैप कर सकते हैं) के लिए javamail के लिए स्प्रिंग समर्थन में पूरे सामान का विन्यास निम्न में से सभी की आवश्यकता है:

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> 
<property name="host" value="theRemoteSmtpServer" /> 
<property name="port" value="587" /> 
<property name="username" value="muUserID" /> 
<property name="password" value="myPassword" /> 
<property name="javaMailProperties"> 
    <props> 
     <prop key="mail.smtp.starttls.enable">true</prop> 
     <prop key="mail.smtp.ssl.trust">theRemoteSmtpServer</prop> 
     <prop key="mail.smtp.auth">true</prop> 
    </props> 
</property> 
</bean> 
+0

यह मेरे लिए काम करता है ... बहुत बहुत धन्यवाद। मैं पिछले 24 घंटों के लिए इस मुद्दे को दूर करने की कोशिश कर रहा था। अंत में आपकी पोस्ट मेरे बचाव में आई !! :) –

+0

यह मेरे लिए काम किया। मैं 'mail.smtp.ssl.trust' संपत्ति खो रहा था और इसे मेरे लिए तय कर रहा था। धन्यवाद! –

3

मैं smtp.gmail के साथ एक ही समस्या थी।कॉम और निम्न चरणों

  1. प्रति berhauz के रूप में मेरे कोड बदल के साथ तय हो गई टिप्पणी
  2. इस लिंक से जीमेल सेटिंग में बदला: https://www.google.com/settings/security/lesssecureapps
0

स्टैक ट्रेस पता चलता है कि समस्या का वास्तविक कारण है यह:

java.security.InvalidAlgorithmParameterException: Prime size must be multiple of 64, and can only range from 512 to 1024 (inclusive) 

आप जावा के पुराने संस्करणों की सीमा में भाग रहे हैं जो 1024 बिट्स से अधिक डीएच प्राइम्स का समर्थन नहीं करते हैं, जो आपके एसएमटीपी सर्वर शायद की आवश्यकता थी। यहाँ प्रासंगिक बग प्रविष्टियों हैं:

यह प्रतिबंध/सीमा जावा 8 (the release notes देखें) में हटा दिया गया था।

ध्यान दें कि जैसा कि पहले से ही बताया गया है, STARTTLS को अक्षम करने का आपका "ठीक" वास्तविक समाधान नहीं है: इसका मतलब है कि आपका पासवर्ड सादे पाठ के रूप में भेजा जाएगा, साथ ही यह केवल SMTP सर्वर के लिए काम करेगा जो अनएन्क्रिप्टेड ट्रैफ़िक को अनुमति देता है पोर्ट 587.