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>
分类:
Android APP
, Android 网络通信开发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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 重磅开源!
· 字符编码:从基础到乱码解决