2013-03-04 21 views
0

我有一個活動,其中i調用send方法在下面class..in我的代碼,它掛在transport.sendMessage(味精,msg.getallreceipents())..我已經嘗試嘗試導線,但它在那裏導致任何異常。 和一件事是當我使用gmail主機smtp.gmail.com和gmail帳戶的用戶名和密碼它的作品。transport.send(MSG)不執行

public class Mail extends javax.mail.Authenticator { 
private String _user; 
private String _pass; 

private String[] _to; 
private String _from; 

private String _port; 
private String _sport; 

private String _host; 

private String _subject; 
private String _body; 

private boolean _auth; 

private boolean _debuggable; 

private Multipart _multipart; 

public Mail() { 
    _host = "mail.namknights.org"; // default smtp server 
    _port = "587"; // default smtp port 
    _sport = "587"; // default socketfactory port 

    _user = ""; // username 
    _pass = ""; // password 
    _from = ""; // email sent from 
    _subject = ""; // email subject 
    _body = ""; // email body 

    _debuggable = false; // debug mode on or off - default off 
    _auth = true; // smtp authentication - default on 

    _multipart = new MimeMultipart(); 

    // There is something wrong with MailCap, javamail can not find a 
    // handler for the multipart/mixed part, so this bit needs to be added. 
    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); 
} 

public Mail(String user, String pass) { 
    this(); 

    _user = user; 
    _pass = pass; 
} 

public boolean send() throws Exception { 
    Properties props = _setProperties(); 

    if (!_user.equals("") && !_pass.equals("") && _to.length > 0 
      && !_from.equals("") && !_subject.equals("") 
      && !_body.equals("")) { 

     Session session = Session.getInstance(props, this); 
     session.setDebug(true); 
     DataHandler handler = new DataHandler(new ByteArrayDataSource(
       _body.getBytes(), "text/plain")); 
     MimeMessage msg = new MimeMessage(session); 

     msg.setFrom(new InternetAddress(_from)); 
     msg.setDataHandler(handler); 
     InternetAddress[] addressTo = new InternetAddress[_to.length]; 
     for (int i = 0; i < _to.length; i++) { 
      addressTo[i] = new InternetAddress(_to[i]); 
     } 
     msg.setRecipients(MimeMessage.RecipientType.TO, addressTo); 

     msg.setSubject(_subject); 
     msg.setSentDate(new Date()); 

     // setup message body 
     BodyPart messageBodyPart = new MimeBodyPart(); 
     messageBodyPart.setText(_body); 
     _multipart.addBodyPart(messageBodyPart); 

     // Put parts in message 
     msg.setContent(_multipart); 
     Log.v("mas", "Email is about to send"); 
     // send email 
     Transport transport = session.getTransport("smtp"); 
     transport.connect(_host, 587, _user, _pass); 
     Transport.send(msg); 
     Log.v("mas", "Email was send"); 
     return true; 
    } else { 
     Log.v("mas", "Email was not send"); 
     return false; 

    } 
} 

public class ByteArrayDataSource implements DataSource { 
    private byte[] data; 
    private String type; 

    public ByteArrayDataSource(byte[] data, String type) { 
     super(); 
     this.data = data; 
     this.type = type; 
    } 

    public ByteArrayDataSource(byte[] data) { 
     super(); 
     this.data = data; 
    } 

    public void setType(String type) { 
     this.type = type; 
    } 

    public String getContentType() { 
     if (type == null) 
      return "application/octet-stream"; 
     else 
      return type; 
    } 

    public InputStream getInputStream() throws IOException { 
     return new ByteArrayInputStream(data); 
    } 

    public String getName() { 
     return "ByteArrayDataSource"; 
    } 

    public OutputStream getOutputStream() throws IOException { 
     throw new IOException("Not Supported"); 
    } 
} 

@Override 
public PasswordAuthentication getPasswordAuthentication() { 
    return new PasswordAuthentication(_user, _pass); 
} 

private Properties _setProperties() { 
    Properties props = new Properties(); 

    props.put("mail.smtp.host", _host); 

    if (_debuggable) { 
     props.put("mail.debug", "true"); 
    } 

    if (_auth) { 
     props.put("mail.smtp.auth", "true"); 
    } 

    props.put("mail.smtp.socketFactory.port", _sport); 
    props.put("mail.smtp.socketFactory.class", "javax.net.SSLSocketFactory"); 
    props.put("mail.smtp.socketFactory.fallback", "true"); 
    props.put("mail.smtp.starttls.enable", false); 

    return props; 
} 

// the getters and setters 
public String getBody() { 
    return _body; 
} 

public void setBody(String _body) { 
    this._body = _body; 
} 

public void setTo(String[] toArr) { 
    // TODO Auto-generated method stub 
    this._to = toArr; 
} 

public void setFrom(String string) { 
    // TODO Auto-generated method stub 
    this._from = string; 
} 

public void setSubject(String string) { 
    // TODO Auto-generated method stub 
    this._subject = string; 
} 

// more of the getters and setters ….. 

}

回答

0

如果它與Gmail的作品,你的代碼是基本正確。如果它與其他郵件服務器失敗,則可能是配置問題。使用session.setDebug(true)從JavaMail獲得調試輸出,這可能會提供有關錯誤的線索。

請注意,您可能需要設置一些超時屬性,如果你堅持等待一個永遠不會響應的服務器。請參閱javadocs for the com.sun.mail.smtp package

最後,you shouldn't need all that socket factory stuff in your code

+0

甚至我使用端口465在例外它顯示諸如'10月3日至5日:55:07.118:d/E郵件(1181):javax.mail.MessagingException的:無法連接到SMTP主機:mail.namknights。 org,port:25; 03-05 10:55:07.118 D/e mail(1181):嵌套的異常是: 03-05 10:55:07.118:D/e mail(1181):\t javax.net.ssl.SSLHandshakeException:javax .net.ssl.SSLProtocolException:SSL握手中止:SSL = 0x256a80:失敗在SSL庫,通常一個協議錯誤 10月3日至五日:55:07.118:d/E郵件(1181):錯誤:140770FC:SSL例程:SSL23_GET_SERVER_HELLO :未知的協議(external/openssl/ssl/ ' – Prasad 2013-03-05 05:27:30

+0

請修改您的原始問題,以顯示您如何根據以前的建議更新您的代碼,以便我可以看到您做錯了什麼。物業配置,但我不能告訴你什麼沒有看到細節 – 2013-03-05 07:48:59

+0

我更新了......我已經設置超時屬性爲50000,我也改變了運輸參數......現在我正在創造'03-05 14: 23:06.498:I /的System.out(2130):DEBUG:getProvider()返回javax.mail.Provider [TRANSPORT,SMTPS,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems公司,1.4.1] 03-05 14:23 :06.519:I/System.out(2130):DEBUG SMTP:useEhlo true,useAuth false 03-05 14:23:06.519:I/System.out(2130):DEBUG SMTP:嘗試連接到主機「郵件。 namknights.org「,port 465,isSSL true ' – Prasad 2013-03-05 08:53:23