Android 后台发邮件

基于sun公司的javamail,发送邮件:

1.下载三个jar:

依赖包


2.添加权限:

< uses-permission android:name = "android.permission.INTERNET" /> < uses-permission android:name = "android.permission.READ_EXTERNAL_STORAGE" /> < uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" />

3.以下以qq邮箱为例,需要提前在qq邮箱设置里面开启smtp.在activity 调用:sendEMail();

package javamail;import java.io.IOException;import java.util.Date;import java.util.List;import java.util.Properties;import javax.mail.Authenticator;import javax.mail.Message;import javax.mail.MessagingException;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;import android.os.AsyncTask;/** * 邮件管理类 * 使用的发送者邮件,必须在邮箱设置允许smtp功能 */public class MailManager {/**发送者邮箱密码*/// 发件人的 邮箱 和 密码(替换为自己的邮箱和密码)    // PS: 某些邮箱服务器为了增加邮箱本身密码的安全性,给 SMTP 客户端设置了独立密码(有的邮箱称为“授权码”),     //     对于开启了独立密码的邮箱, 这里的邮箱密码必需使用这个独立密码(授权码)。    private static final String MAIL_FROM = "xxx@qq.com";    private static final String MAIL_FROM_PWD = "fpsaxcszdxwadejg";    /**接收者账户*/    private static final String MAIL_TO1 = "xxx@qq.com";    private static final String MAIL_TO2 = "huyu0415@163.com";        /**QQ邮箱服务器*/    private static final String VALUE_MAIL_HOST_QQ = "smtp.qq.com";    public static MailManager getInstance() {        return InstanceHolder.instance;    }    private MailManager() {    }    private static class InstanceHolder {        private static MailManager instance = new MailManager();    }    class MailTask extends AsyncTask {        private MimeMessage mimeMessage;        public MailTask(MimeMessage mimeMessage) {            this.mimeMessage = mimeMessage;        }        @Override        protected Boolean doInBackground(Void... voids) {            try {                /*                 *发送附件时会报异常:                    javax.activation.UnsupportedDataTypeException: no object DCH for MIME type multipart/related;                    解决方法是就是在sendmail前,加一段代码:                    参考 :http://blog.csdn.net/chinafe/article/details/7183400                 */                 // add handlers for main MIME types                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);                                                 Transport.send(mimeMessage);                return Boolean.TRUE;            } catch (MessagingException e) {                e.printStackTrace();                return Boolean.FALSE;            }        }    }    /**     * 不带附件的邮件     * @param title     * @param content     */    public void sendMail(final String title, final String content) {        MimeMessage mimeMessage = createMessage(title, content);        MailTask mailTask = new MailTask(mimeMessage);        mailTask.execute();    }    /**     * 带附件的邮件     * @param title     * @param content     * @param filePath     */    public void sendMailWithFile(String title, String content, String filePath) {        MimeMessage mimeMessage = createMessage(title, content);        appendFile(mimeMessage, filePath);        MailTask mailTask = new MailTask(mimeMessage);        mailTask.execute();    }    /**     * 多个附件     * @param title     * @param content     * @param pathList     */    public void sendMailWithMultiFile(String title, String content, List pathList) {        MimeMessage mimeMessage = createMessage(title, content);        appendMultiFile(mimeMessage, pathList);        MailTask mailTask = new MailTask(mimeMessage);        mailTask.execute();    }    private Authenticator getAuthenticator() {        return new Authenticator(){            @Override            public PasswordAuthentication getPasswordAuthentication() {                return new PasswordAuthentication(MAIL_FROM, MAIL_FROM_PWD);            }        };    }    private MimeMessage createMessage(String title, String content) {    //设置发送的属性        Properties properties = new Properties();         properties.put("mail.smtp.auth", "true");//向SMTP服务器提交用户认证          properties.put("mail.transport.protocol", "smtp");//指定发送邮件协议          properties.put("mail.host", VALUE_MAIL_HOST_QQ);//SMTP服务器主机地址          // PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),        //     如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误,        //     打开下面 /* ... */ 之间的注释代码, 开启 SSL 安全连接。                // SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,        //                  需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,        //                  QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)        final String smtpPort = "465";        properties.setProperty("mail.smtp.port", smtpPort);        properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");        properties.setProperty("mail.smtp.socketFactory.fallback", "false");        properties.setProperty("mail.smtp.socketFactory.port", smtpPort);                //获取Session        Session session = Session.getDefaultInstance(properties, getAuthenticator());        session.setDebug(true);   // 设置为debug模式, 可以查看详细的发送 log        //创建消息        MimeMessage mimeMessage = new MimeMessage(session);        try {        //设置发送者            mimeMessage.setFrom(new InternetAddress(MAIL_FROM));            //设置接收者(可以增加多个收件人、抄送、密送)            InternetAddress[] addresses = new InternetAddress[]{            new InternetAddress(MAIL_TO1),            new InternetAddress(MAIL_TO2)};            mimeMessage.setRecipients(Message.RecipientType.TO, addresses);            //设置邮件的主题            mimeMessage.setSubject(title);            //设置邮件的内容            MimeBodyPart textPart = new MimeBodyPart();            textPart.setContent(content, "text/html");            textPart.setText(content,"UTF-8");            Multipart multipart = new MimeMultipart();            multipart.addBodyPart(textPart);            mimeMessage.setContent(multipart);            //设置发送时间            mimeMessage.setSentDate(new Date());        } catch (MessagingException e) {            e.printStackTrace();        }        return mimeMessage;    }    /**     * 添加单个附件     * @param message     * @param filePath     */    private void appendFile(MimeMessage message, String filePath) {        try {            Multipart multipart = (Multipart) message.getContent();            MimeBodyPart filePart = new MimeBodyPart();            filePart.attachFile(filePath);            multipart.addBodyPart(filePart);        } catch (IOException e) {            e.printStackTrace();        } catch (MessagingException e) {            e.printStackTrace();        }    }    /**     * 添加多个附件     * @param message     * @param pathList     */    private void appendMultiFile(MimeMessage message, List pathList) {        try {            Multipart multipart = (Multipart) message.getContent();            for (String path : pathList) {                MimeBodyPart filePart = new MimeBodyPart();                filePart.attachFile(path);                multipart.addBodyPart(filePart);            }        } catch (IOException e) {            e.printStackTrace();        } catch (MessagingException e) {            e.printStackTrace();        }    }}private void sendEMail() {/*String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "HuyuLog";ArrayList res = new ArrayList();File dir = new File(path);if(dir.exists()){res.add(dir);}if(!res.isEmpty()){String zipFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator+ "HuyuLog.zip";File zipFile = new File(zipFilePath);if(zipFile.exists())zipFile.delete();ZipUtils.zipFiles(res, zipFile, new ZipUtils.ZipListener() {@Overridepublic void zipProgress(int zipProgress) {}});MailManager.getInstance().sendMailWithFile("错误日志", "看附件", zipFilePath);return;}*/        MailManager.getInstance().sendMail("标题:错误日志", "正文内容:没有附件:" + new Date());    }



更多相关文章

  1. Android开发中遇到的坑
  2. 在代码中设置RelativeLayout布局中标签的android:layout_toLeftO
  3. android 界面布局
  4. EditText属性
  5. Android入门——基础控件
  6. Android的OpenGL学习笔记(4)
  7. Android(安卓)基础UI编程1
  8. Android中的DownloadManager
  9. android页面全屏及状态栏和导航栏的(沉浸式)

随机推荐

  1. android sdk api的层次结构
  2. Android Things之---Android Things专题
  3. 一行命令得到签名SHA1(Android Studio)
  4. SharedPreferences
  5. android web services
  6. android常见技巧---Android按返回键退出
  7. 3D相册图片滑动+倾斜+放大+倒影处理
  8. android 6.0 不弹允许usb调试 授权对话框
  9. android读取plist文件
  10. 使用Android自带的DownloadManager下载文