0

以下のクラスでsendメソッドを呼び出すアクティビティがあります。私のコードでは、transport.sendMessage(msg、msg.getallreceipents())..でハングします。cathを試してみましたが、例外はありません。1つは、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 …..

}

4

1 に答える 1

0

Gmail で動作する場合、コードは基本的に正しいです。他のメール サーバーで失敗する場合は、構成の問題である可能性があります。session.setDebug(true) を使用して、JavaMail からデバッグ出力を取得します。これにより、問題の原因に関する手がかりが得られる場合があります。

決して応答しないサーバーを待っている場合、いくつかのタイムアウト プロパティを設定する必要があるかもしれないことに注意してください。com.sun.mail.smtp パッケージの javadoc を参照してください。

最後に、すべてのソケット ファクトリをコードに含める必要はありません

于 2013-03-04T19:42:52.973 に答える