当前位置:首页 > 行业动态 > 正文

安卓开发中如何将数据发到邮箱

安卓发送邮件可通过Intent调用系统邮件客户端,或集成JavaMail API实现SMTP协议发送,需配置收件人、主题及内容

使用Intent调用系统邮件客户端

基本实现步骤

通过隐式Intent调用手机内置的邮件客户端,无需手动处理SMTP协议。

核心代码示例:

public void sendEmailViaIntent(Context context, String recipient, String subject, String body) {
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.putExtra(Intent.EXTRA_EMAIL, new String[]{recipient}); // 收件人
    intent.putExtra(Intent.EXTRA_SUBJECT, subject); // 主题
    intent.putExtra(Intent.EXTRA_TEXT, body); // 正文
    intent.setType("message/rfc822"); // 必须设置MIME类型
    context.startActivity(Intent.createChooser(intent, "选择邮件客户端"));
}

支持附件的实现

需将ACTION_SEND改为ACTION_SEND_MULTIPLE,并添加附件URI。

安卓开发中如何将数据发到邮箱  第1张

代码示例:

public void sendEmailWithAttachment(Context context, String recipient, String subject, String body, Uri attachmentUri) {
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.putExtra(Intent.EXTRA_EMAIL, new String[]{recipient});
    intent.putExtra(Intent.EXTRA_SUBJECT, subject);
    intent.putExtra(Intent.EXTRA_TEXT, body);
    intent.putExtra(Intent.EXTRA_STREAM, attachmentUri); // 附件URI
    intent.setType("message/rfc822");
    context.startActivity(Intent.createChooser(intent, "选择邮件客户端"));
}

使用JavaMail API直接发送

添加依赖

build.gradle中添加JavaMail和激活库:

implementation 'com.sun.mail:android-mail:1.6.7'
implementation 'com.sun.mail:android-activation:1.6.7'

配置SMTP参数

以QQ邮箱为例(需开启SMTP服务):

参数名 说明
SMTP_HOST smtp.qq.com SMTP服务器地址
SMTP_PORT 465 SSL端口号
USERNAME your_email@qq.com 发件人邮箱
PASSWORD your_password 授权码(QQ邮箱需使用授权码)

发送邮件代码

public void sendEmailViaJavaMail(String recipient, String subject, String body) {
    Properties props = new Properties();
    props.put("mail.smtp.host", "smtp.qq.com"); // QQ邮箱SMTP服务器
    props.put("mail.smtp.port", "465");          // SSL端口
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.ssl.enable", "true");   // 启用SSL
    Session session = Session.getInstance(props, new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("your_email@qq.com", "your_authorization_code");
        }
    });
    try {
        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress("your_email@qq.com")); // 发件人
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipient)); // 收件人
        message.setSubject(subject);
        message.setText(body);
        Transport.send(message);
    } catch (MessagingException e) {
        e.printStackTrace();
    }
}

关键注意事项

问题 解决方案
权限问题 需在AndroidManifest中添加<uses-permission android:name="android.permission.INTERNET"/>
主线程网络操作 JavaMail发送需在子线程执行,避免NetworkOnMainThreadException
QQ邮箱SMTP限制 需开启“SMTP服务”并使用授权码而非密码
大文件附件 推荐使用Intent方式(系统邮件客户端处理),或JavaMail分片上传

相关问题与解答

问题1:如何发送HTML格式的邮件内容?

解答:
使用JavaMail时,设置setContent而非setText,并指定text/html类型:

message.setContent("<h1>这是标题</h1><p>这是正文</p>", "text/html; charset=utf-8");

问题2:如何处理发送失败的情况?

解答:

  1. 检查网络状态:确保设备联网。
  2. 验证SMTP配置:确认服务器地址、端口、用户名、密码正确。
  3. 捕获异常:通过try-catch捕获MessagingException,提示用户重试。
  4. 日志记录:打印详细错误日志(如e.printStackTrace())以便
0