上一篇
安卓开发中如何将数据发到邮箱
- 行业动态
- 2025-04-23
- 2740
安卓发送邮件可通过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。
代码示例:
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:如何处理发送失败的情况?
解答:
- 检查网络状态:确保设备联网。
- 验证SMTP配置:确认服务器地址、端口、用户名、密码正确。
- 捕获异常:通过
try-catch
捕获MessagingException
,提示用户重试。 - 日志记录:打印详细错误日志(如
e.printStackTrace()
)以便