本文以腾讯企业邮箱为例,展示如何发送邮件 及相关问题 选择腾讯企业邮箱是因为腾讯企业邮箱一般都是开启了smtp服务
项目地址:https://gitee.com/bimingcong/MySendEmail
具体的smtp服务开启方式如下: 设置----》客户端设置----》记住红色框内的发送服务器地址smtp.exmail.qq.com 以及要用到的SSL端口号465
首先用android系统发送邮件的话 需要用到针对android的邮件发送包 在此我们可以在Gradle
里边加入所需的依赖库 重点是红色部分的内容
apply plugin: ‘com.android.application‘ android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.bi.mysendemail" minSdkVersion 15 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘ } } packagingOptions { pickFirst ‘META-INF/LICENSE.txt‘ // picks the JavaMail license file }} repositories { jcenter() maven { url "https://maven.java.net/content/groups/public/" }} dependencies { compile ‘com.sun.mail:android-mail:1.5.5‘ compile ‘com.sun.mail:android-activation:1.5.5‘}
添加完所需要的依赖库,
我们开始找发送邮件所需要的要素 然后新建一个发送邮件的类(包括邮件信息的生成以及连接邮件服务器)
/** * @param sendEmail 发送者的邮箱 * @param sendPass 发送者的邮箱密码 * @param senderName 发送者的昵称 * @param receiverEmail 接收者的邮箱 * @param receiverName 接受者的昵称 * @param ccEmail 抄送的邮箱 * @param ccName 抄送的昵称 * @param subject 邮件的主题 * @param content 邮件的内容 */
新建一个发送类,并将对应的发送内容转为html的格式
private String preView(boolean isPreview) { String preString=""; if(isPreview){ Date currentDate_temp=new Date(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time_temp = format.format(currentDate_temp.getTime());//这个就是把时间戳经过处理得到期望格式的时间 preString="发件人:"+selfName +"<"+selfEmail+"><br><br>"+ "发送时间:"+time_temp+"<br><br>"+ "收件人:"+receiverName+"<"+receiverEmail+"><br><br>"+ "抄送:"+ccName+"<"+ccEmail+"><br><br>"; } Date currentDate=new Date(); SimpleDateFormat format0 = new SimpleDateFormat("yyyy-MM-dd"); String time = format0.format(currentDate.getTime());//这个就是把时间戳经过处理得到期望格式的时间 preString+= "【日报】 "+time+" "+selfName +"<br><br>" + "■今日工作计划<br><br>"; if(firstContent.length()!=0){ preString+=" 1、"+ firstContent+"<br><br>" ; } if(secondContent.length()!=0){ preString+=" 2、"+ secondContent+"<br><br>" ; } if(thirdContent.length()!=0){ preString+=" 3、"+ thirdContent+"<br><br>" ; } preString+= "■今日工作内容和实施状态<br><br>"; if(firstProcess.length()!=0){ preString+=" 1、"+ firstContent+"-------------------------- "+firstProcess +"%<br><br>" ; } if(secondProcess.length()!=0){ preString+=" 2、"+ secondContent+"-------------------------- "+secondProcess +"%<br><br>" ; } if(thirdProcess.length()!=0){ preString+=" 3、"+ thirdContent+"-------------------------- "+thirdProcess +"%<br><br>" ; } preString+= "■明日工作计划<br><br>" + "■问题课题<br><br>" + "■问题原因及对策"; return preString; }
package com.bi.mysendemail; import java.util.Date; import java.util.Properties; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; /** * Created by bmc on 2018/6/22. */ public class SendEmail { // 网易163邮箱的 SMTP 服务器地址为: smtp.163.com 腾讯企业邮箱是 smtp.exmail.qq.com public static String myEmailSMTPHost = "smtp.exmail.qq.com"; /** * @param sendEmail 发送者的邮箱 * @param sendPass 发送者的邮箱密码 * @param senderName 发送者的昵称 * @param receiverEmail 接收者的邮箱 * @param receiverName 接受者的昵称 * @param ccEmail 抄送的邮箱 * @param ccName 抄送的昵称 * @param subject 邮件的主题 * @param content 邮件的内容 */ public void send(String sendEmail,String sendPass,String senderName,String receiverEmail, String receiverName,String ccEmail,String ccName,String subject,String content) { // 1. 创建参数配置, 用于连接邮件服务器的参数配置 Properties props = new Properties(); // 参数配置 props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求) props.setProperty("mail.smtp.host", myEmailSMTPHost); // 发件人的邮箱的 SMTP 服务器地址 props.setProperty("mail.smtp.auth", "true"); // 需要请求认证 // PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启), // 打开 SSL 安全连接 final String smtpPort = "465"; props.setProperty("mail.smtp.port", smtpPort); props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.setProperty("mail.smtp.socketFactory.fallback", "false"); props.setProperty("mail.smtp.socketFactory.port", smtpPort); // 2. 根据配置创建会话对象, 用于和邮件服务器交互 Session session = Session.getInstance(props); session.setDebug(true); // 设置为debug模式, 可以查看详细的发送 log MimeMessage message = null; try { message = createMimeMessage(session, sendEmail,senderName,receiverEmail,receiverName,ccEmail,ccName,subject,content); // 4. 根据 Session 获取邮件传输对象 Transport transport = null; transport = session.getTransport(); // 5. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错 // // PS_01: 成败的判断关键在此一句, 如果连接服务器失败, 都会在控制台输出相应失败原因的 log, // 仔细查看失败原因, 有些邮箱服务器会返回错误码或查看错误类型的链接, 根据给出的错误 // 类型到对应邮件服务器的帮助网站上查看具体失败原因。 // // PS_02: 连接失败的原因通常为以下几点, 仔细检查代码: // (1) 邮箱没有开启 SMTP 服务; // (2) 邮箱密码错误, 例如某些邮箱开启了独立密码; // (3) 邮箱服务器要求必须要使用 SSL 安全连接; // (4) 请求过于频繁或其他原因, 被邮件服务器拒绝服务; // (5) 如果以上几点都确定无误, 到邮件服务器网站查找帮助。 // // PS_03: 仔细看log, 认真看log, 看懂log, 错误原因都在log已说明。 transport.connect(sendEmail, sendPass); // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人 transport.sendMessage(message, message.getAllRecipients()); // 7. 关闭连接 transport.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 创建一封只包含文本的简单邮件 * * @param session 和服务器交互的会话 * @param sendMail 发件人邮箱 * @param shortName 发件人的昵称 * @param receiveMail 收件人邮箱 * @param receiverName 收件人的昵称 * @param ccEmail 抄送邮箱 * @param ccName 抄送人昵称 * @param subject 邮件的主题 * @param content 邮件的内容 * @return * @throws Exception */ public MimeMessage createMimeMessage(Session session, String sendMail,String shortName, String receiveMail,String receiverName, String ccEmail,String ccName,String subject,String content) throws Exception { // 1. 创建一封邮件 MimeMessage message = new MimeMessage(session); // 2. From: 发件人(昵称有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改昵称) message.setFrom(new InternetAddress(sendMail, shortName, "UTF-8")); // 3. To: 收件人(可以增加多个收件人、抄送、密送) message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, receiverName, "UTF-8")); //添加抄送者 message.setRecipient(MimeMessage.RecipientType.CC, new InternetAddress(ccEmail, ccName, "UTF-8")); // 4. Subject: 邮件主题(标题有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改标题) message.setSubject(subject, "UTF-8"); message.setContent(content, "text/html;charset=UTF-8"); // 6. 设置发件时间 message.setSentDate(new Date()); // 7. 保存设置 message.saveChanges(); return message; } }
在Android系统中发送邮件是网络操作 属于耗时操作 所以我们发送的时候要在子线程中去发送
@Override public void onClick(View v) { switch (v.getId()){ //立即发送邮件 case R.id.btn_now_send: getInfo(); new Thread(new Runnable() { @Override public void run() { //自定义邮件的主题 Date currentDate=new Date(); SimpleDateFormat format0 = new SimpleDateFormat("yyyy-MM-dd"); String time = format0.format(currentDate.getTime());//这个就是把时间戳经过处理得到期望格式的时间 String subject_temp= "【日报】 "+time+" "+selfName; sendEmail.send(selfEmail,selfPass,selfName,receiverEmail,receiverName,ccEmail,ccName,subject_temp,preView(false)); } }).start(); break; case R.id.btn_time_send: break; } } public void getInfo(){ selfEmail=et_selfEmail.getText().toString(); selfName=et_selfName.getText().toString(); selfPass=et_selfPass.getText().toString(); receiverName=et_receiverName.getText().toString(); receiverEmail=et_receiverEmail.getText().toString(); ccEmail=et_ccEmail.getText().toString(); ccName=et_ccName.getText().toString(); subject=et_subject.getText().toString(); firstContent=et_firstContent.getText().toString(); firstProcess=et_firstProcess.getText().toString(); secondContent=et_secondContent.getText().toString(); secondProcess=et_secondProcess.getText().toString(); thirdContent=et_thirdContent.getText().toString(); thirdProcess=et_thirdProcess.getText().toString(); }
如此,填上对应的参数就可以实现邮件的发送,打开目标邮箱就可以看到效果
当我们需要定时发送邮件的时候可以后台启动一个服务在服务里边开一个定时器,实现定时发送邮件
针对服务可以开启两个服务,故障检测对方是否存活,如果不存活,另一个去重新救活,提高服务的存活率
项目地址:https://gitee.com/bimingcong/MySendEmail
严禁盗版
转载请注明出处:https://www.cnblogs.com/bimingcong/p/9215398.html
原文地址:https://www.cnblogs.com/bimingcong/p/9215398.html
时间: 2024-10-14 10:54:34