2011-12-23 12 views
8

मैं अब Grails एप्लिकेशन और असफल से मेल भेजने के लिए प्रयास कर रहा हूं। मैं उपयोग कर रहा हूँ:एमएस एक्सचेंज के साथ जावामेल: सर्वर और क्लाइंट दोनों द्वारा समर्थित कोई प्रमाणीकरण mechansims

  • grails 1.3.7
  • मेल 1.0 प्लगइन
  • वसंत-सुरक्षा-कोर 1.2.6 प्लगइन
  • बिल्ला 7.0.23

Specifficaly मैं टॉमकैट सर्वर ट्रॉट पोर्ट 25 पर तैनात आवेदन से एक्सचेंज के साथ मेल भेजने की कोशिश नहीं, प्रमाणीकरण के साथ, कोई एसएसएल नहीं।

मैंने वीएमवेयर वर्चुअल मशीन से टेलनेट के साथ संदेश भेजने की कोशिश की है जिस पर ऐप तैनात किया गया है और यह मुश्किल हो गया है।

यह मेल भेजने के लिए मेरी कक्षा है:

public boolean sendMessage(String to, String msgSubject, String msgText) 
{ 
    String host = "mail.mydomain.com"; 
    String username = "[email protected]"; // your authsmtp username 
    String password = "mypassword" // your authsmtp password 
    String from = "[email protected]"; 

    Properties props = System.getProperties(); 
    props.put("mail.smtp.host", host); 
    props.put("mail.smtp.user", username); 
    props.put("mail.smtp.password", password); 
    props.put("mail.smtp.port", "25"); // thish is the port recommended by authsmtp 
    props.put("mail.smtp.auth", "false"); 

    Session session = Session.getDefaultInstance(props, null); 
    MimeMessage message = new MimeMessage(session); 
    message.setFrom(new InternetAddress(from)); 

    InternetAddress to_address = new InternetAddress(to); 
    message.addRecipient(Message.RecipientType.TO, to_address); 

    message.setSubject(msgSubject); 
    message.setText(msgText); 
    Transport transport = session.getTransport("smtp"); 
    transport.connect(host, username, password); 
    transport.sendMessage(message, message.getAllRecipients()); 
    transport.close(); 
    return true; 
} 

यह वह जगह है त्रुटि स्टैक ट्रेस: ​​

javax.mail.AuthenticationFailedException: No authentication mechansims supported by both server and client 

at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:590) 

at javax.mail.Service.connect(Service.java:291) 

at javax.mail.Service.connect(Service.java:172) 

at javax.mail.Service$connect.call(Unknown Source) 

at org.helpdesk.MymailService.sendMessage(MymailService.groovy:37) 

at org.helpdesk.MymailService$sendMessage.call(Unknown Source) 

at org.helpdesk.RequestController$_closure13.doCall(RequestController.groovy:247) 

at org.helpdesk.RequestController$_closure13.doCall(RequestController.groovy) 

at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 

at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 

at java.lang.Thread.run(Unknown Source) 

मैं कुछ दर्जन इस तरह की समस्याओं पर विचार पदों पढ़ा है लेकिन मैं अभी भी प्रबंधन havent गया है इस समस्या को हल करने के लिए। किसी भी मदद की सराहना की है।

* संपादित करें: * क्या यह संभव है कि कोई प्रमाणीकरण होने पर एक्सचेंज सर्वर एसएमटीपी के साथ जावामेल का उपयोग कर मेल भेजने में कुछ समस्याएं हैं?

+0

को तुम मेरे SendMessage विधि बताने के लिए मेल विन्यास लेने के लिए की तरह "mail.smtp.host" Config.groovy' –

+0

@Don में 'लेकिन यह कैसे सभी गुण कॉन्फ़िगर करना चाहिए Config.groovy से विकल्प? – drago

+0

क्या मुझे ईमेलिंग सक्षम करने के लिए टॉमकैट पर कुछ कॉन्फ़िगर करना चाहिए? – drago

उत्तर

17

आप प्रमाणीकरण के बिना आपके मेल सर्वर से कनेक्ट करने की कोशिश कर रहे हैं, तो कनेक्ट विधि है कि एक उपयोगकर्ता नाम और पासवर्ड नहीं ले करता है कहते हैं। यदि आप इसे उपयोगकर्ता नाम और पासवर्ड पास करते हैं, तो यह आपको लगता है कि वास्तव में प्रमाणित करना चाहते हैं, और चूंकि सर्वर प्रमाणीकरण तंत्र को नहीं ढूंढ पा रहा है, यह विफल रहता है।

+0

धन्यवाद कि मेरे आवेदन के लिए समाधान था! संपादित करें: यह javamail 1.4.3 के बाद से एक बगफिक्स है https://java.net/projects/javamail/lists/dev/archive/2014-01/message/3 –

+0

धन्यवाद, यह मुझे बहुत बचाता है, मैं लड़ रहा हूं इसके साथ एक हफ्ते के लिए। आखिरकार! –

+0

धन्यवाद।यह मेरे लिए काम किया। लेकिन यह बहुत बेवकूफ है हालांकि mail.smtps.auth = false, यह उपयोगकर्ता नाम और पासवर्ड को जोड़ने का प्रयास क्यों कर रहा है? – Zafer

3

अच्छा लगता है कि मुझे कुछ समस्याएं थीं। पहले, एक्सचेंज सही ढंग से सेटअप नहीं किया गया था। और फिर ऐसा लगता है कि मैंने सभी संभावित कॉन्फ़िगरेशन की कोशिश की है लेकिन सही है। यह काम करता है:

class MymailService 
{ 
    boolean transactional = false 

    public sendMessage(String to, String cc, String msgSubject, String msgText) 
    { 
     String host = "mail.mailserver.com"; 
     String username = "[email protected]"; 
     String password = "xxx"; 
     String from = "[email protected]"; 
     String port = "25"; 

     Properties props = System.getProperties(); 
     props.put("mail.smtp.host", host); 
     props.put("mail.smtp.port", port); 
     props.put("mail.smtp.auth", "false"); 

     Transport transport = null; 

     try{ 
      Session session = Session.getDefaultInstance(props, null); 
      MimeMessage message = new MimeMessage(session); 
      message.setFrom(new InternetAddress(from)); 

     InternetAddress to_address = new InternetAddress(to); 
     message.addRecipient(Message.RecipientType.TO, to_address); 

     InternetAddress cc_address = new InternetAddress(cc); 
     message.addRecipient(Message.RecipientType.CC, cc_address); 

     message.setSubject(msgSubject); 
     message.setText(msgText); 

     transport = session.getTransport("smtp"); 
     transport.connect(); 
     transport.sendMessage(message, message.getAllRecipients()); 
    } finally { 
     if (transport != null) try { transport.close(); } catch (MessagingException logOrIgnore){} 
    } 
} 
} 

अंतिम सुराग बिल शैनन की पोस्ट थी। धन्यवाद बिल!

0

यहाँ मेरी समाधान है, शायद यह सबसे अच्छा तरीका है नहीं है, लेकिन यह मेल-config.xml में मेरे लिए काम करता ...

:

<bean id="mailSender" class="com.xxx.service.MailSender"> 
    <property name="host" value="${mail.host}" /> 
    <property name="port" value="${mail.port}" /> 
    <property name="protocol" value="${mail.protocol}" /> 
    <property name="defaultEncoding" value="UTF-8" /> 
    <property name="authRequired" value="${mail.auth}" /> 
    <property name="username" value="${mail.username}" /> 
    <property name="password" value="${mail.password}" /> 
    <property name="javaMailProperties"> 
     <props> 
      <prop key="mail.smtps.auth">${mail.auth}</prop> 
     </props> 
    </property> 
</bean> 

और यहां सेटिंग है:

mail.from=XXX Team <[email protected]> 
mail.host=exchange.xxx.com 
mail.port=25 
mail.protocol=smtp 
mail.auth=false 
mail.username= 
mail.password= 

और अंत में, कोड:

package com.xxx.service; 
import org.springframework.mail.javamail.JavaMailSenderImpl; 

public class MailSender extends JavaMailSenderImpl { 

    private boolean authRequired; 

    @Override 
    public String getUsername() { 
     if (!authRequired) { 
      return null; 
     } 
     return super.getUsername(); 
    } 

    @Override 
    public String getPassword() { 
     if (!authRequired) { 
      return null; 
     } 
     return super.getPassword(); 
    } 

    public boolean isAuthRequired() { 
     return authRequired; 
    } 

    public void setAuthRequired(boolean authRequired) { 
     this.authRequired = authRequired; 
    } 

} 
1
  1. जांचें कि क्या आप जिस सर्वर पर मार रहे हैं उसे प्रमाणीकरण या नहीं है। कोड में इस पर और अधिक।

  2. एक मेल डालें। गुणों में डीबग करें यह जानने के लिए कि आपके कोड और मेलसर्वर के बीच वास्तव में क्या चल रहा है। कोड में इस पर और अधिक।

यहाँ एक सरल कोड है कि मेरी कंपनी के मेल सर्वर के साथ मेरे लिए अच्छी तरह से काम करता है:

package com.datereminder.service; 

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 ReminderDaemonService2 { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     Properties props = new Properties(); 
     props.put("mail.smtp.host", "mail.mycompany123.com"); 
// this mandates authentication at the mailserver 
     props.put("mail.smtp.auth", "true"); 
// this is for printing debugs 

     props.put("mail.debug", "true"); 

     Session session = Session.getDefaultInstance(props, 
      new javax.mail.Authenticator() { 
       protected PasswordAuthentication getPasswordAuthentication() { 
        return new PasswordAuthentication("[email protected]","xxxxxxxxxxx"); 
       } 
      }); 

     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 Friend," + 
        "\n\n This is a Test mail!"); 

      Transport.send(message); 

     } catch (MessagingException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 
14
मेरे मामले में

, मैं "false"

को संपत्ति

"mail.smtp.ehlo" 

स्थापित करने के लिए किया था

(को संपत्ति "mail.smtp.auth" की स्थापना को जोड़ने के अलावातथापि "false" को "mail.smtp.ehlo" सेट करने से पहले this link के अनुसार डिफ़ॉल्ट)

हो रहा है जो मैं निम्नलिखित डिबग आउटपुट ("true" को संपत्ति "mail.debug" की स्थापना से सक्षम) देखा:

DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM 
DEBUG SMTP: mechanism LOGIN not supported by server 
DEBUG SMTP: mechanism PLAIN not supported by server 
DEBUG SMTP: mechanism DIGEST-MD5 not supported by server 
DEBUG SMTP: mechanism NTLM not supported by server 

और फिर उसी के लिए हो रही javax.mail.AuthenticationFailedException

+1

सावधान रहें - सही/गलत सेट करते समय, "सत्य" 'सत्य से अलग है! (उद्धृत रूप काम करने लगते हैं!)। – vektor

+0

mail.smtp.ehlo = झूठी (उद्धरण के लिए कोई ज़रूरत नहीं) StreamSets के लिए मेरे लिए काम किया – Jamby

0

आप अपने आवेदन कि एसएमटीपी सर्वर के लिए लॉग इन करने के लिए (आप प्रमाणीकरण विवरण प्रदान कर रहे हैं के बाद से) चाहते हैं तो (इस मामले में, एसएमटीपी सर्वर एक माइक्रोसॉफ्ट एक था)। बस

props.put("mail.smtp.auth", false); 

बदलने

props.put("mail.smtp.auth", true); 
संबंधित मुद्दे