如何在Android中无需用户交互即可发送电子邮件?

时间:2013-12-05 07:24:59

标签: android smtp

如何在Android中没有用户交互的情况下发送电子邮件?我在Mail类和“g mail Sender”类中使用了很多代码,我使用了库并在清单中添加了Internet权限。

但是我的所有代码都给了我同样的错误,即端口没有经过身份验证。 我使用的是端口代码:465,888,585。我已经检查了所有这些,但每次都会出现同样的错误。

请帮帮我。

2 个答案:

答案 0 :(得分:1)

我使用此课程从我的Android手机发送Gmail邮件,我希望这会有所帮助:

import java.util.Properties;
import javax.activation.CommandMap;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.activation.MailcapCommandMap;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;


public class Mail{
    private String _user;
    private String _to;
    private String _from;
    private String _pass;

    private String _port;
    private String _sport;

    private String _host;

    private String _subject;
    private String _body;

    private boolean _auth;

    private boolean _debuggable;

    private boolean testMessageSend;

    private Multipart _multipart;
    static Mail instance;

    private Mail() {
        _host = "smtp.gmail.com"; // default smtp server
        _port = "465"; // default smtp port
        _sport = "465"; // default socketfactory port

        _subject = "Person in trouble   !"; // email subject
        _body = ""; // email body

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

        _multipart = new MimeMultipart();

        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 static Mail getInstance(){
        if(instance == null){
            instance = new Mail();
        }
        return instance;
    }
    //not using this right now, but maybe for adding a GeoLocation or map etc. it might be usefull in the future
    public void addAttachment(String filename) throws Exception {
        BodyPart messageBodyPart = new MimeBodyPart();
        DataSource source = new FileDataSource(filename);
        messageBodyPart.setDataHandler(new DataHandler(source));
        messageBodyPart.setFileName(filename);

        _multipart.addBodyPart(messageBodyPart);
    }

    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.port", _port);
        props.put("mail.smtp.socketFactory.port", _sport);
        props.put("mail.smtp.socketFactory.class",
                "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.socketFactory.fallback", "false");

        return props;
    }

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

    public void setBody(String _body) {
        _body = _body + " gebruiker: " + _from;
        this._body = _body;
    }

    //A simple method for sending a testEmail
    public boolean sendTestMail() throws Exception{
        setSubject("Testing mail configuration!");
        setBody("Dit is een email voor het testen van de email configuratie ");
        testMessageSend = sendMail();
        setBody("");
        return testMessageSend;
    }
    public void setFrom(String _from){
        this._from = _from;
    }
    public String getFrom(){
        return _from;
    }
    public void setPass(String _pass){
        this._pass = _pass;
    }
    public String getPass(){
        return _pass;
    }
    public void setSubject(String _subject){
        this._subject = _subject;
    }
    public String getSubject(){
        return _subject;
    }
    public void setUser(String _user){
        this._user = _user;
    }
    public String getUser(){
        return _user;
    }

    public void updateUserInfo(String _to, String _from, String _pass){
        this._to = _to;
        this._from = _from;
        this._pass = _pass;
        this._user = _to.substring(0, _to.lastIndexOf("@"));
    }
    //All the settings needed for sending an Email, and actually sending the email
    public boolean sendMail() {
        Properties props = new Properties();
        props.put("mail.smtp.user", _from);
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.port", "25");
        props.put("mail.debug", "true");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.EnableSSL.enable", "true");
        props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.port", "465");
        props.setProperty("mail.smtp.socketFactory.port", "465");
        Session session = Session.getInstance(props,
                new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(_from, _pass);
            }
        });

        try {
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(_from));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(_to));
            message.setSubject(_subject);
            message.setText(_body);
            Transport.send(message);
            return true;
        } catch (Exception e) {
            return false;

        }
    }
}

答案 1 :(得分:1)

在我的情况下,我使用了Java Mail API,您可以使用下面的代码。请添加必要的详细信息,如用户名,密码,电子邮件ID等

    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 = "smtp.gmail.com"; // default smtp server 
    _port = "465"; // default smtp port 
    _sport = "465"; // default socketfactory port 

    _user = "username"; // username 
    _pass = "password"; // password 
    _from = "emailsentfrom@gmail.com"; // email sent from

    _to = new String[] {"toemail@gmail.com"}; 
    _subject = "subject"; // email subject 
    _body = "test"; // 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) { 
    _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); 

      MimeMessage msg = new MimeMessage(session); 

      msg.setFrom(new InternetAddress(_from)); 

      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); 

      // adding attachment
      addAttachment("filename");//replace with file name u need

      // Put parts in message 
      msg.setContent(_multipart); 

      // send email 
      Transport transport = session.getTransport("smtps");
      transport.connect(_host, 465,_user, _pass);
      Transport.send(msg); 

      return true; 
    } else { 
      return false; 
    } 
  } 

  public void addAttachment(String filename) throws Exception { 
    BodyPart messageBodyPart = new MimeBodyPart(); 
    DataSource source = new FileDataSource(filename); 
    messageBodyPart.setDataHandler(new DataHandler(source)); 
    messageBodyPart.setFileName(filename); 

    _multipart.addBodyPart(messageBodyPart); 
  } 

  @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.port", _port); 
    props.put("mail.smtp.socketFactory.port", _sport); 
    props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
    props.put("mail.smtp.socketFactory.fallback", "false"); 
    props.put("mail.smtp.starttls.enable", "true");

    return props; 
  } 

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

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

  // more of the getters and setters É.. 
} 

并编写Async任务以发送邮件

    public class SendTask extends AsyncTask<String, Integer, Integer> {

private ProgressDialog dialog;
private Context mContext;

public SendTask(Context mContext){
    this.mContext = mContext;

}

protected void onPreExecute() {
    this.dialog = new ProgressDialog(mContext);
    this.dialog.setCancelable(false);
    this.dialog.setMessage("sending");
    this.dialog.show();
}

protected Integer doInBackground(String... ids) {

    Mail mail = new Mail();
    try {
        mail.send();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return 1;
}

}