0

我有一个活动,我在下面的类中调用 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 …..

}

4

1 回答 1

0

如果它适用于 Gmail,那么您的代码基本上是正确的。如果其他邮件服务器出现故障,则可能是配置问题。使用 session.setDebug(true) 从 JavaMail 获取调试输出,这可能会提供有关问题所在的线索。

请注意,如果您一直在等待永远不会响应的服务器,您可能需要设置一些超时属性。请参阅com.sun.mail.smtp 包的 javadocs

最后,您的代码中不需要所有套接字工厂的东西

于 2013-03-04T19:42:52.973 回答