Android 发送邮件以及定时发送邮件的实现
本文以腾讯企业邮箱为例,展示如何发送邮件 及相关问题 选择腾讯企业邮箱是因为腾讯企业邮箱一般都是开启了smtp服务
项目地址:https://gitee.com/bimingcong/MySendEmail
具体的smtp服务开启方式如下: 设置----》客户端设置----》记住红色框内的发送服务器地址smtp.exmail.qq.com 以及要用到的SSL端口号

首先用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
Android 发送邮件以及定时发送邮件的实现的更多相关文章
- VBS实现定时发送邮件
原理:建立CDO.Message对象,设置好参数后直接Send就可以了 代码如下: NameSpace = "http://schemas.microsoft.com/cdo/configu ...
- python (18)在linux中如何实现定时发送邮件
最近要用到,定时发送邮件功能: 如何定时,当然要用到linux中crontab了 如下的代码能够定时发送邮件 #!/usr/bin/env python # -*- coding=utf-8 -*- ...
- Android 使用 Gmail 来发送邮件
Android 使用 Gmail 来发送邮件 1. [代码]SendMail.java package org.apache.android.mail; import android.app.Acti ...
- spring利用javamail,quartz定时发送邮件 <转>
原文地址:spring利用javamail,quartz定时发送邮件 <转>作者:物是人非 spring提供的定时发送邮件功能,下面是一个简单的例子以供大家参考,首先从spring配置文件 ...
- java实现qq邮箱每天定时发送邮件
本周四的时候去学校的某机构值班,主要工作是帮老师送文件,干一些杂活.那天没有什么活儿,于是想起用Java实现发送邮件和接收邮件的功能.前几天接触过一点quartz框架,用来实现定时开始任务的功能.于是 ...
- odoo定时发送邮件
采购订单延迟或者存在部分到货的情况,定时发送邮件给相关人员 包含,采购订单明细,订单数量,已到货数量,未到货数量 <?xml version="1.0" encoding=& ...
- python3 通过qq邮箱定时发送邮件
下面的代码为了每天定时发送监控邮件,监控什么呢?监控当天redis队列中是否有没有消费的数据,和当天mysql中新增的数据量 # -*- coding:utf-8 -*- from common.re ...
- asp.net基于windows服务实现定时发送邮件的方法
本文实例讲述了asp.net基于windows服务实现定时发送邮件的方法.分享给大家供大家参考,具体如下: //定义组件 private System.Timers.Timer time; publi ...
- python (18)在linux中如何实现定时发送邮件到指定邮箱,监测任务
最近要用到,定时发送邮件功能: 如何定时,当然要用到linux中crontab了 如下的代码能够定时发送邮件 #!/usr/bin/env python # -*- coding=utf-8 -*- ...
随机推荐
- Android之MainActivity类
一.MainActivity: 1.每个种语言都有一个程序入库(如:C#main函数),而Android程序的入口就是Mani Actiivty函数. 2.Activity是Android的核心类(a ...
- 理解OpenShift(2):网络之 DNS(域名服务)
理解OpenShift(1):网络之 Router 和 Route 理解OpenShift(2):网络之 DNS(域名服务) 理解OpenShift(3):网络之 SDN 理解OpenShift(4) ...
- 随机森林RandomForest
ID3,C4.5决策树的生成: 输入:训练集D,特征集A,阈值eps, 输出:决策树T 若D中所有样本属于同一类Ck,则T为单节点树,将类Ck作为该结点的类标记,返回T: 若A为空集,即没有特征作为划 ...
- 特性(attribute)
一.什么是特性? 特性(attribute)是被指定给某一声明的一则附加的声明性信息. 在C#中,有一个小的预定义特性集合.在学习如何建立我们自己的定制特性(custom attributes)之前, ...
- sysctl-p报错:error: "net.bridge.bridge-nf-call-ip6ta
1.刚配置完sysctl,加载时报错:[root@itpux1 yum.repos.d]# sysctl -pnet.ipv4.ip_forward = 0net.ipv4.conf.default. ...
- C#设计模式(2)——简单工厂模式(Factory )
我们通过 Factory 创建对象不同的对象. 例如:如果创建一个汽车的接口,通过 工厂Factory 创建实现接口的对象,根据我们的选择来创建不同的对象. 创建汽车接口 /// <summar ...
- stm32 HAL库笔记(一)——普通IO口
今天介HAL库操作普通IO口,就是输入/输出. 如果用CubeMX配置io工程,打开以后可以看到如下代码: GPIO_InitTypeDef GPIO_Initure; __HAL_RCC_GPIOB ...
- Rhythmk 一步一步学 JAVA(6): JSP 语法学习笔记
1.修改JSP页面模版: 找到MyEclips安装目录,搜索“Jsp.vtl”,找到该文件修改编码,以及一些不需要用到的代码. 2.查找项目生成的Servlet文件路径: 查看当前项目父级目录搜索 . ...
- __module__ 和 __class__
__module__ 查看当前方法来之于那个文件 __class__ 查看当前方法来之于那个类
- 利用nginx添加账号密码验证
server { listen ; server_name xxx.com; location / { proxy_pass http://10.10.10.10:5601; proxy_redire ...