android - 在 Android 应用程序中发送电子邮件

标签 android email

我正在开发 android 应用程序,有一个页面忘记密码。当用户点击它时,应用程序只是验证他输入的电子邮件并将密码发送到该电子邮件。 意思是,我只想从 Android 应用程序发送私有(private)电子邮件,

我已经完成了 JavaMail Api 的工作,从我的 gmail 帐户发送电子邮件,但这不是一个好方法,因为 gmail 会阻止邮件帐户,如果它同时从多个国家访问等等(考虑邮件作为垃圾邮件并阻止了它)

是否有任何经过验证的好方法来完成这项工作?

谢谢

最佳答案

使用下面的代码在后台发送电子邮件。

public class EmailGengerator extends javax.mail.Authenticator {

private String _user;
private String _pass;

private String[] _to;
private String _from;

private final String _port;
private final String _sport;

private final String _host;

private String _subject;
private String _body;

private final boolean _auth;

private final boolean _debuggable;

private final Multipart _multipart;
private final Context context;

private Properties props ;
private MimeMessage msg;
private Session session; 
private boolean status;

/**
 * Public Constructor. 
 * @param context
 */
public EmailGengerator(Context context) {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

    StrictMode.setThreadPolicy(policy); 

    this.context=context;
    _host = "smtp.gmail.com"; // default smtp server
    _port = "465"; // default smtp port
    _sport = "465"; // default socketfactory port
    status = false;
    _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 EmailGengerator(Context context,String user, String pass) {
    this(context);


    _user = user;
    _pass = pass;
}

/**
 * Function will handle the Sending Part,
 * @return
 * @throws Exception
 */
public boolean send() {
    try{


        props = _setProperties();

        session = Session.getInstance(props, this);

        msg = new MimeMessage(session);

        if (!_user.equals("") && !_pass.equals("") && _to.length > 0
                && !_from.equals("") && !_subject.equals("")
                && !_body.equals("")) {
            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());
            BodyPart messageBodyPart = new MimeBodyPart();
            messageBodyPart.setText(_body);
            _multipart.addBodyPart(messageBodyPart);

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

            // send email
            Transport.send(msg);

            status=true;            

        }else {

            status =false;
        }
    }catch(Exception ee){
        ((Activity)this.context).finish();
        ee.printStackTrace();
    }

    return status;
}

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

    return props;
}

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

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

public void setTo(String[] toArr) {
    this._to = toArr;
}

public void setFrom(String string) {
    this._from = string;
}

public void setSubject(String string) {
    this._subject = string;
}


public void sendEmail(Context context, String toAddress) {


    /**
     * Setting Mail Creator.
     */
    EmailGengerator m = new EmailGengerator(context,"your mail id",
            "your password");

    String[] toArr = { toAddress };
    m.setTo(toArr);
    m.setFrom("your mail id");
    m.setSubject(your subject);
    m.setBody("message");

    m.send(); }

}

注意:您需要添加 Mail.Jar 和 Activation.jar 才能使此代码正常工作。

关于android - 在 Android 应用程序中发送电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15055927/

相关文章:

Java 'Email Sending Code' > 已知异常(索引 : 14, 大小 : 14)?

java - Android AlertDialog 设置项目对齐中心

android - 无法理解 'Partially visible' 的含义

email - 无法在 GMAIL 中使用 HTML 格式

c# - 寻找新电子邮件的实时IMAP通知

asp.net-mvc - 使用 ASP.NET MVC 作为电子邮件模板引擎 : Good Idea?

html - Outlook 无法识别填充。任何不使用表格的解决方案?

android - 如何在 android 中将 setText() 与字符串对象一起使用

android - 在垂直和水平之间转动我的手机每次都调用 Activity 的 onCreate 吗?

android - 应用程序在关闭插页式广告后关闭