栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java android studio 安卓开发 - 使用java发送邮件

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java android studio 安卓开发 - 使用java发送邮件


01 先导包
https://javaee.github.io/javamail/#Samples
里面找到 for android的连接
但是后面run时,报错以下内容
javax.mail.Session com.sun.mail.imap.IMAPStore.getSession() would have incor
这只是截取一小段,网上也找不到解决办法。
但是觉得是导包出错,网上搜导包语句,使用下面的两个语句放在build.gradle的 dependencies中,正常
implementation 'com.sun.mail:android-mail:1.5.5'
implementation 'com.sun.mail:android-activation:1.5.5'


02 写类

package com.example.myapplication;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import java.text.AttributedCharacterIterator;
import java.util.Properties;

public class SendMail {
    String title;
    String content;

    SendMail(String title, String content){
        this.title = title;
        this.content = content;
    }
    public void send_mail() throws MessagingException {
//            新建 properties对象
        Properties pro = new Properties();
//            设置主机
        pro.setProperty("main.host", "smtp.qq.com");
//            设置传输协议
        pro.setProperty("main.transport.protocol", "smtp");
//            设置允许邮箱认证
        pro.setProperty("mail.smtp.auth", "true");
//            设置认证器
        SendMail.Auth auth = new SendMail.Auth();

//            获取一个会话对象
        Session session = Session.getDefaultInstance(pro, auth);
//            获取连接
        Transport ts = session.getTransport();
//            连接服务器
        ts.connect("smtp.qq.com", "xxxxxxxxxx@qq.com", "授权码");
//            创建邮件对象
        MimeMessage message = new MimeMessage(session);
//            设置发件人地址
        message.setFrom(new InternetAddress("xxxxxxxxxx@qq.com"));
//            设置收件人地址
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("xxxxxxxxxx@qq.com"));
//            设置邮件标题
        message.setSubject(title);
//            设置内容
        message.setContent(content, "text/html;charset=gbk");
//            发送邮件
        ts.sendMessage(message, message.getAllRecipients());
//            关闭连接
        ts.close();
    }

    class Auth extends Authenticator {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("xxxxxxxxxx@qq.com", "授权码");
        }
    }

}


03 实例化,在activity中调用
SendMail sendMail = new SendMail(mail_title, mail_content);
try {
    sendMail.send_mail();
    Toast.makeText(MainActivity.this, "邮件发送成功", Toast.LENGTH_SHORT).show();
} catch (MessagingException e) {
    e.printStackTrace();
}


注意01 配置网络

这是报错
android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1315)

配置网络访问权限


注意02 缺少其他包
按照上面的代码运行时,调用发送邮件类会报错,如下,只贴几行:
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.myapplication, PID: 32340
    android.os.NetworkOnMainThreadException
        at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1315)
        at java.net.Inet6AddressImpl.lookupHostByName(Inet6AddressImpl.java:86)
        at java.net.Inet6AddressImpl.lookupAllHostAddr(Inet6AddressImpl.java:74)
网上搜,和线程有关,大概意思是,网络相关操作不能放在主线程上,多线程我还没学呢。
参照这个博文解决办法
https://blog.csdn.net/zxnlmj/article/details/25887447
在onCreate中放如下代码,ok
StrictMode.ThreadPolicy policy=new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/323325.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号