由于项目中有需求,所以试了一下在Android中使用Java Mail,在这里记录一下方便以后复制粘贴!
开始环境:
AndroidStudio 2.3.3
需要在build.gardle引入Java Mail相关库 :
compile 'com.sun.mail:android-mail:1.6.0' compile 'com.sun.mail:android-activation:1.6.0'
发送邮件需要权限:
<uses-permission android:name="android.permission.INTERNET"/>如果发送附件还需要:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
在这里使用QQ邮箱作为例子:
private void sendMail() throws Exception{ //host跟port可以到: //http://service.mail.qq.com/cgi-bin/help?subtype=1&&no=1000557&&id=20010 String host ="smtp.qq.com"; int port = 25; String user = "123456789@qq.com";//换成你自己的 String password = ""; Properties properties = System.getProperties(); properties.put("mail.smtp.starttls.enable", "true"); properties.put("mail.smtp.auth", "true"); // Session session = Session.getDefaultInstance(properties); MimeMessage message = new MimeMessage(session); 设置发件人 message.setFrom("隔壁老王<123456789@qq.com>"); // MimeMultipart multipart = new MimeMultipart(); //邮件内容 MimeBodyPart text = new MimeBodyPart(); text.setText("窗前明月光,疑似地上霜,举头望明月,低头思故乡。", "UTF-8"); multipart.addBodyPart(text); // MimeBodyPart attachment = new MimeBodyPart(); //附件地址 attachment.attachFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/test.docx"); //附件名称,收件人收到附件显示的附件名称 attachment.setFileName("test.docx"); multipart.addBodyPart(attachment); //设置收件人 message.addRecipients(Message.RecipientType.TO, "987654321@qq.com"); //邮件主题 message.setSubject("Hello World", "UTF-8"); message.setContent(multipart); //发送时间 message.setSentDate(new Date()); //不传附件的话可以使用message.setText()设置邮件内容,否则message.setText()不起作用,接受者收不到内容 //message.setText("窗前明月光,疑似地上霜,举头望明月,低头思故乡。", "UTF-8"); // Transport transport = session.getTransport(); transport.connect(host, port, user, password); // transport.sendMessage(message, message.getAllRecipients()); transport.close(); }
过程中遇到了附件名称中文乱码问题,可以使用
MimeUtility.encodeText(String text)
例子:
String name = MimeUtility.encodeText("小明.docx")
如果邮件名称过长的话使用MeneUtility.encodeText()还是会出现问题的
例子:
String name = MimeUtility.encodeText("小明 2017.08.11 王大明 135****5436.doc")
这样的附件名称在收件人那边会显示:tcmime.1245.1725.5276.bin
解决办法是,加上这行代码:
properties.put("mail.mime.splitlongparameters","false");
这个问题我找了好久都没能自己解决,最后在这里找到答案了:
http://blog.csdn.net/wty19/article/details/50607411
感谢wty19