【问题标题】:transport.send(msg) not executedtransport.send(msg) 未执行
【发布时间】:2013-02-18 07:45:30
【问题描述】:

我有一个活动,我在下面的类中调用 send 方法..在我的代码中它挂在 transport.sendMessage(msg,msg.getallreceipents())..我尝试过尝试 cath 但它没有任何异常. 一件事是当我使用 gmail 主机 smtp.gmail.com 和 gmail 帐户的用户名和密码时,它可以工作。

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 …..

}

【问题讨论】:

    标签: android jakarta-mail transport


    【解决方案1】:

    如果它适用于 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

    【讨论】:

    • 即使我在异常情况下使用端口 465,它也显示为 03-05 10:55:07.118: D/e mail(1181): javax.mail.MessagingException: Could not connect to SMTP host: mail.namknights.org, port: 25; 03-05 10:55:07.118: D/e mail(1181): nested exception is: 03-05 10:55:07.118: D/e mail(1181): javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x256a80: Failure in SSL library, usually a protocol error 03-05 10:55:07.118: D/e mail(1181): error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (external/openssl/ssl/
    • 请编辑您的原始问题,以显示您是如何根据我之前的建议更新代码的,这样我就可以看到您做错了什么。你肯定是在属性配置上做错了,但是我不能告诉你没有看到细节。
    • 我更新了...我已经为 50000 设置了超时属性,并且我已经更改了传输参数...现在我得到了03-05 14:23:06.498: I/System.out(2130): DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc.,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: trying to connect to host "mail.namknights.org", port 465, isSSL true
    • 你的代码全乱了。您正在设置一堆您不需要的套接字工厂属性。您正在设置“mail.smtp.*”形式的其他属性,就好像您正在使用“smtp”协议一样,但是您正在使用“smtps”调用getTransport。属性名称必须与您在 getTransport 中使用的值相匹配,因此应将它们更改为“mail.smtps.*”。这应该使连接超时工作。 为什么您无法连接是另一个问题;见JavaMail FAQ for debugging tips
    猜你喜欢
    • 2016-06-24
    • 2012-09-12
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 2019-06-09
    相关资源
    最近更新 更多