Android邮件发送实现

这里邮件的实现方式使用的是 JavaMail for Andorid,用到的包主要有android-mail和android-activation,具体详情可以参考:https://javaee.github.io/javamail/#JavaMail_for_Android,这里使用的Android studio进行开发,首先是进行配置:

repositories { 
    jcenter()
    maven {
        url "https://maven.java.net/content/groups/public/"
    }
}


android {
    packagingOptions {
        pickFirst 'META-INF/LICENSE.txt' // picks the JavaMail license file
    }
}


dependencies {
    // use whatever the current version is...
    compile 'com.sun.mail:android-mail:1.6.0'
    compile 'com.sun.mail:android-activation:1.6.0'
}

 这里是根据官网进行配置的,但配置完这个后,我的编译结果是会报错的,所以对上面的配置进行了一些修改:

第一点修改:

packagingOptions {
    pickFirst 'META-INF/*' // picks the JavaMail license file
}

第二点修改,在dependencies中添加:

configurations {    all*.exclude group: 'javax.activation', module: 'activation'}

第三点修改,我在3.1.3编译不过,这里我改为3.0.0可以编过:

    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'
    }

在这样配置后,编译就没问题了,接下类就是怎么去实现邮件的发送了,这里先来一段官网的小样列,感兴趣的可以自己去看看,地址:https://javaee.github.io/javamail/docs/api/:

    Properties props = new Properties();
    props.put("mail.smtp.host", "my-mail-server");
    Session session = Session.getInstance(props, null);

    try {
        MimeMessage msg = new MimeMessage(session);
        msg.setFrom("[email protected]");
        msg.setRecipients(Message.RecipientType.TO,
                          "[email protected]");
        msg.setSubject("JavaMail hello world example");
        msg.setSentDate(new Date());
        msg.setText("Hello, world!\n");
        Transport.send(msg, "[email protected]", "my-password");
    } catch (MessagingException mex) {
        System.out.println("send failed, exception: " + mex);
    }

这就是官网的一个小demo,对于刚开始接触的人,里面的这些配置可能会让你不明所以,会有各种坑在等你,下面将对这些参数进行说明:

1、首先就是: props.put("mail.smtp.host", "my-mail-server");一开始我看到这的时候,这什么东西,完全看不懂,其实这里就是要你配置你是从哪个邮箱发出去的,put方法中的键是你不需要变的,这里举两例,如果你是已QQ发出去,那么这里"my-mail-server"就得改为:smtp.163.com,如果是是163邮箱,那么就是:smtp.163.com,最终代码就改为:props.put("mail.smtp.host", "my-mail-server");如果你是其他邮箱,那你就百度:xx邮箱的smtp设置;

2、msg.setFrom("[email protected]");这里就是你是从哪个邮箱发出去的;

3、msg.setRecipients(Message.RecipientType.TO, "[email protected]");这里是设置收件人的邮箱;

4、msg.setSubject("JavaMail hello world example");    设置邮件的主题;
                msg.setSentDate(new Date());                                  设置有邮件的日期;
                msg.setText("Hello, world!\n");                                   设置邮件的内容;

5、Transport.send(msg, "[email protected]", "my-password");这里需要注意这个my-password,这里传的并不是你邮箱的密码,而是你邮箱的授权码,这里以163邮箱为例:

Android邮件发送实现_第1张图片

 这里可以先点掉 :POP3/SMTP服务  后在点上,之后跟着提示走就可以自己设置授权码了。qq邮箱也是需要这样设置得到授权码的,这里就不在说了。

最后这里在贴上我自己修改后的代码:

    private void sendMailMy(){
        Properties props = new Properties();
        props.put("mail.smtp.host", "smtp.163.com");
        Session session = Session.getInstance(props, null);
        try {
            MimeMessage msg = new MimeMessage(session);
            msg.setFrom("[email protected]");
            msg.setRecipients(Message.RecipientType.TO, "[email protected]");
            msg.setSubject("标题");
            msg.setSentDate(new Date());
            msg.setText("你好!\n这里是来自ubt的信息");
            Transport.send(msg, "[email protected]", "授权码");
        } catch (MessagingException mex) {
            System.out.println("send failed, exception: " + mex);
        }
    }

这里是从我的163邮箱发给了我的qq邮箱,有没有觉得so easy。

但是,这种方式只是发了文本内容,并没有发送附件,而且看起来不舒服,下面就来封装一下,主要分为四个类: 

第一个类是对消息体(Message)的封装,如果你还想设置消息中的其他内容,都可以在这里添加属性,这只是样例:

public class MailSenderInfo {

    private String mailServerHost;
    private String mailServerPort = "25";
    private String fromAddress;
    private String toAddress;
    private String userName;
    private String password;
    private boolean validate = false;
    private String subject;
    private String content;
    private String[] attachFileNames;

    public Properties getProperties() {
        Properties p = new Properties();
        p.put("mail.smtp.host", this.mailServerHost);
        p.put("mail.smtp.port", this.mailServerPort);
        p.put("mail.smtp.auth", validate ? "true" : "false");
        return p;
    }

    public String getMailServerHost() {
        return mailServerHost;
    }

    public void setMailServerHost(String mailServerHost) {
        this.mailServerHost = mailServerHost;
    }

    public String getMailServerPort() {
        return mailServerPort;
    }

    public void setMailServerPort(String mailServerPort) {
        this.mailServerPort = mailServerPort;
    }

    public boolean isValidate() {
        return validate;
    }

    public void setValidate(boolean validate) {
        this.validate = validate;
    }

    public String[] getAttachFileNames() {
        return attachFileNames;
    }

    public void setAttachFileNames(String[] fileNames) {
        this.attachFileNames = fileNames;
    }

    public String getFromAddress() {
        return fromAddress;
    }

    public void setFromAddress(String fromAddress) {
        this.fromAddress = fromAddress;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getToAddress() {
        return toAddress;
    }

    public void setToAddress(String toAddress) {
        this.toAddress = toAddress;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getSubject() {
        return subject;
    }

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

    public String getContent() {
        return content;
    }

    public void setContent(String textContent) {
        this.content = textContent;
    }
}

第二个是对权限的封装,也就是我们发送邮箱的账号和密码(授权码):

public class MailAuthenticator extends Authenticator {

    String userName=null;
    String password=null;

    public MailAuthenticator(){
    }
    public MailAuthenticator(String username, String password) {
        this.userName = username;
        this.password = password;
    }
    // 这个方法在Authenticator内部会调用
    protected PasswordAuthentication getPasswordAuthentication(){
        return new PasswordAuthentication(userName, password);
    }

}

 第三个就是封装一个简易的发送器了,通过这个将邮件发送出去,这里封装了三个方法,第一个是发送纯文本;第二个是发送文本和附件;第三个是以HTML格式发送,可根据需求自行添加:

public class SimpleMailSender {

    /**
     * 以文本格式发送邮件
     *
     * @param mailInfo 待发送的邮件的信息
     */
    public boolean sendTextMail(MailSenderInfo mailInfo) {
        // 判断是否需要身份认证
        MailAuthenticator authenticator = null;
        Properties pro = mailInfo.getProperties();
        if (mailInfo.isValidate()) {
            // 如果需要身份认证,则创建一个密码验证器
            authenticator = new MailAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
        }
        // 根据邮件会话属性和密码验证器构造一个发送邮件的session
        Session sendMailSession = Session.getDefaultInstance(pro, authenticator);
        try {
            // 根据session创建一个邮件消息
            Message mailMessage = new MimeMessage(sendMailSession);
            // 创建邮件发送者地址
            Address from = new InternetAddress(mailInfo.getFromAddress());
            // 设置邮件消息的发送者
            mailMessage.setFrom(from);
            // 创建邮件的接收者地址,并设置到邮件消息中
            Address to = new InternetAddress(mailInfo.getToAddress());
            mailMessage.setRecipient(Message.RecipientType.TO, to);
            // 设置邮件消息的主题
            mailMessage.setSubject(mailInfo.getSubject());
            // 设置邮件消息发送的时间
            mailMessage.setSentDate(new Date());
            // 设置邮件消息的主要内容
            String mailContent = mailInfo.getContent();
            mailMessage.setText(mailContent);
            // 发送邮件
            Transport.send(mailMessage);
            return true;
        } catch (MessagingException ex) {
            ex.printStackTrace();
        }
        return false;
    }

    /**
     * 以文本格式发送邮件并添加附加
     *
     * @param mailInfo 待发送的邮件的信息
     */
    public boolean sendTextAndFileMail(MailSenderInfo mailInfo,String[] filePath) {
        // 判断是否需要身份认证
        MailAuthenticator authenticator = null;
        Properties pro = mailInfo.getProperties();
        if (mailInfo.isValidate()) {
            // 如果需要身份认证,则创建一个密码验证器
            authenticator = new MailAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
        }
        // 根据邮件会话属性和密码验证器构造一个发送邮件的session
        Session sendMailSession = Session.getDefaultInstance(pro, authenticator);
        try {
            // 根据session创建一个邮件消息
            Message mailMessage = new MimeMessage(sendMailSession);
            // 创建邮件发送者地址
            Address from = new InternetAddress(mailInfo.getFromAddress());
            // 设置邮件消息的发送者
            mailMessage.setFrom(from);
            // 创建邮件的接收者地址,并设置到邮件消息中
            Address to = new InternetAddress(mailInfo.getToAddress());
            mailMessage.setRecipient(Message.RecipientType.TO, to);
            // 设置邮件消息的主题
            mailMessage.setSubject(mailInfo.getSubject());
            // 设置邮件消息发送的时间
            mailMessage.setSentDate(new Date());

            // 添加附件体
            BodyPart messageBodyPart = new MimeBodyPart();
            // 设置邮件消息的主要内容
            messageBodyPart.setContent(mailInfo.getContent(),  "text/html;charset=utf-8");
            MimeMultipart multipart = new MimeMultipart();
            multipart.addBodyPart(messageBodyPart);
            for (int i = 0; i < filePath.length; i++) {
                MimeBodyPart bodyPart = new MimeBodyPart();
                try {
                    //绑定附件路径
                    bodyPart.attachFile(filePath[i]);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                multipart.addBodyPart(bodyPart);
            }
            mailMessage.setContent(multipart);

            // 发送邮件
            Transport.send(mailMessage);
            return true;
        } catch (MessagingException ex) {
            ex.printStackTrace();
        }
        return false;
    }

    /**
     * 以HTML格式发送邮件
     *
     * @param mailInfo 待发送的邮件信息
     */
    public static boolean sendHtmlMail(MailSenderInfo mailInfo) {
        // 判断是否需要身份认证
        MailAuthenticator authenticator = null;
        Properties pro = mailInfo.getProperties();
        //如果需要身份认证,则创建一个密码验证器
        if (mailInfo.isValidate()) {
            authenticator = new MailAuthenticator(mailInfo.getUserName(), mailInfo.getPassword());
        }
        // 根据邮件会话属性和密码验证器构造一个发送邮件的session
        Session sendMailSession = Session.getDefaultInstance(pro, authenticator);
        try {
            // 根据session创建一个邮件消息
            Message mailMessage = new MimeMessage(sendMailSession);
            // 创建邮件发送者地址
            Address from = new InternetAddress(mailInfo.getFromAddress());
            // 设置邮件消息的发送者
            mailMessage.setFrom(from);
            // 创建邮件的接收者地址,并设置到邮件消息中
            Address to = new InternetAddress(mailInfo.getToAddress());
            // Message.RecipientType.TO属性表示接收者的类型为TO
            mailMessage.setRecipient(Message.RecipientType.TO, to);
            // 设置邮件消息的主题
            mailMessage.setSubject(mailInfo.getSubject());
            // 设置邮件消息发送的时间
            mailMessage.setSentDate(new Date());
            // MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象
            Multipart mainPart = new MimeMultipart();
            // 创建一个包含HTML内容的MimeBodyPart
            BodyPart html = new MimeBodyPart();
            // 设置HTML内容
            html.setContent(mailInfo.getContent(), "text/html; charset=utf-8");
            mainPart.addBodyPart(html);
            // 将MiniMultipart对象设置为邮件内容
            mailMessage.setContent(mainPart);
            // 发送邮件
            Transport.send(mailMessage);
            return true;
        } catch (MessagingException ex) {
            ex.printStackTrace();
        }
        return false;
    }

}

    最后就是将上面三个类需要的信息配置一下就可以发送,这里在抽出一个类:

public class EmailUtil {
    private static final String TAG = "EmailUtil";

    /**
     * @param title  邮件的标题
     * @param msuggestions 邮件的文本内容
     * @param toAddress  收件人的地址  如:[email protected]
     */
    public static void autoSendMail(String title,String msuggestions,String toAddress) {
        MailSenderInfo mailInfo = new MailSenderInfo();
        mailInfo.setMailServerHost("smtp.163.com");//smtp地址
        mailInfo.setMailServerPort("25");
        mailInfo.setValidate(true);
        mailInfo.setUserName("[email protected]");// 发送方邮件地址
        mailInfo.setPassword("发送邮箱授权码");// 邮箱POP3/SMTP服务授权码
        mailInfo.setFromAddress("[email protected]");// 发送方邮件地址
        mailInfo.setToAddress(toAddress);//接受方邮件地址
        mailInfo.setSubject(title);//设置邮箱标题
        mailInfo.setContent(msuggestions);
        // 这个类主要来发送邮件
        SimpleMailSender sms = new SimpleMailSender();
        sms.sendTextMail(mailInfo);// 发送文体格式
        Log.d(TAG, "autoSendMail: msuggestions: "+msuggestions);
    }

    /**
     * @param title  邮件的标题
     * @param msuggestions 邮件的文本内容
     * @param toAddress  收件人的地址  如:[email protected]
     * @param filePath  附件的路径 
     */
    public static void autoSendFileMail(String title,String msuggestions,String toAddress,String[] filePath) {
        MailSenderInfo mailInfo = new MailSenderInfo();
        mailInfo.setMailServerHost("smtp.163.com");//smtp地址
        mailInfo.setMailServerPort("25");
        mailInfo.setValidate(true);
        mailInfo.setUserName("[email protected]");// 发送方邮件地址
        mailInfo.setPassword("发送邮箱授权码");// 邮箱POP3/SMTP服务授权码
        mailInfo.setFromAddress("[email protected]");// 发送方邮件地址
        mailInfo.setToAddress(toAddress);//接受方邮件地址
        mailInfo.setSubject(title);//设置邮箱标题
        mailInfo.setContent(msuggestions);
        // 这个类主要来发送邮件
        SimpleMailSender sms = new SimpleMailSender();
        sms.sendTextAndFileMail(mailInfo,filePath);// 发送文体格式
        Log.d(TAG, "autoSendMail: msuggestions: "+msuggestions);
    }
}

这里我是把发送的邮箱定死了,该配的参数也都在这里配好了,其他需要定制的参数传进来就好了,这样就大体完成了,如果有其他需求的可以自行修改,这里提供的只是一个模板。

参考文章:https://www.jianshu.com/p/305baada101b

你可能感兴趣的:(Android)