2013-03-04 255 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