Android 发送邮件信息,附带附件

直接上demo代码:

MainActivity.java

复制代码
package com.example.androidemaildemo;

import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Multipart;
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 mail.EmailSender;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

    private Button mButton;

    private String to = "wardenr_sprites@foxmail.com,5448100202@qq.com";
    private String subject = "Application Exception for app developer";
    private String text = "<table align=center width=100%><tr><td align=right>邮件测试mail test</td></tr></table>";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mButton = (Button) findViewById(R.id.button1);
        mButton.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub

                new Thread(new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        int i = EmailSender.send(to, subject, "user return exception information to developer, please find the attached file !");
                        System.out.println("i = " + i);
                    }

                }).start();

                // sendEmail();
            }

        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}
复制代码

核心类:EmailSender.java

复制代码
package mail;

/**
* int i = EmailSender.send(to, subject, "user return exception information to developer, please find the attached file !");
* 其中第一个参数to是发送给对方的邮箱地址,比如发送给270791800@qq.com,如果是多个邮箱,邮箱地址之间用","(英文逗号隔开)
* 其中第二个参数subject是发给对方邮箱看到的邮件的title,
* 其中第三个参数是邮箱的正文
*/

import java.io.UnsupportedEncodingException;
import java.util.Properties;

import javax.activation.CommandMap;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.activation.MailcapCommandMap;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
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.Environment;
import android.util.Log;

public class EmailSender {
    
    private static final String defaultSMTPHost = "smtp.qq.com";
    private static final String defaultMailFromName = "270791800@qq.com";//以这个邮箱地址的名义发送邮件,改成使用者的邮箱
    private static final String defaultMailFromPassword = "pake.liu";//上面那个名义上的邮件的邮箱登入密码,改成使用者的邮箱密码,我博文里给的当然是错误密码.

    public static int send(String mailTos, String mailSubject, String mailText) {
        // check params
        if (mailTos == null || mailSubject == null || mailText == null)
            return 0;

        // encoding params
        String encoding = "iso-8859-1";
        try {
            // 标题不需要编码,编码后为乱码
            // 正文需要编码
            mailText = new String(mailText.getBytes(), encoding);
        } catch (UnsupportedEncodingException e) {
            System.out.println("Fail to encoding mail text to " + encoding);
        }

        Properties props = new Properties();
        props.put("mail.smtp.host", defaultSMTPHost);// 邮件服务器地址
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.user", "CTOPAY");// 发送方的发送名;
        props.put("mail.smtp.from", defaultMailFromName);// 发送邮箱地址;
        props.put("mail.debug", "false");// 不打印构建发送者信息

        // 构建发送者
        Authenticator auth = new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(defaultMailFromName,
                        defaultMailFromPassword);
            }
        };

        Session session = Session.getInstance(props, auth);
        session.setDebug(false);// 不打印发送信息

        /**
         * 一下内容是:发送邮件时添加附件
         */
        MimeBodyPart attachPart = new MimeBodyPart();
        FileDataSource fds = new FileDataSource("/sdcard/crash/exception.log"/*
                                                                             * Environment
                                                                             * .
                                                                             * getExternalStorageDirectory
                                                                             * (
                                                                             * )
                                                                             * +
                                                                             * "/crash/exception.log"
                                                                             */); // 打开要发送的文件
        MimeMultipart allMultipart = null;

        Log.i("TAGOO", "" + fds.getName());
        
        

        try {

            attachPart.setDataHandler(new DataHandler(fds));
            attachPart.setFileName(fds.getName());
            allMultipart = new MimeMultipart("mixed"); // 附件
            
            // 添加邮件正文
            attachPart.setContent(mailText, "text/html;charset=UTF-8");
//            allMultipart.addBodyPart(attachPart);
            
            allMultipart.addBodyPart(attachPart);// 添加

        } catch (MessagingException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        Message msg = new MimeMessage(session);
        int sendNum = 0;// 发送的数量

        for (String mailTo : mailTos.split(",")) {
            try {
                InternetAddress[] addresses = { new InternetAddress(mailTo) };
                msg.setRecipients(Message.RecipientType.TO, addresses);// 设置邮件接收地址集
                msg.setSentDate(new java.util.Date());// 设置邮件发送日期
                msg.setSubject(mailSubject);// 设置邮件的标题
                msg.setText(mailText);// 设置邮件的内容(文本)
                msg.setContent(allMultipart);

                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(msg);// 发送邮件

                sendNum++;// 发送记数
                System.out.println("Success to send email to " + mailTo);
            } catch (MessagingException e) {
                System.out.println("Fail to send email for:" + e);
            }
        }
        return sendNum;
    }
}
复制代码

 

PassAuthenticator.java

复制代码
package com.example.androidemaildemo;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

public class PassAuthenticator extends Authenticator  
{  
    public PasswordAuthentication getPasswordAuthentication()  
    {  
        /**
         * 这个地方需要添加上自己的邮箱的账号和密码
         */
        String username = "账号";  
        String pwd = "密码";  
        return new PasswordAuthentication(username, pwd); 
        
    }  
}  
复制代码

布局文件:

复制代码
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="40dp"
        android:layout_marginTop="31dp"
        android:text="Button" />

</RelativeLayout>
复制代码

权限如下:

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

 

posted @   MMLoveMeMM  阅读(898)  评论(1编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示