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 -*- ...
随机推荐
- C++类中一个构造函数调用另一个构造函数
class A { int a; int b; int c; public: A(int aa, int bb) : a(aa), b(bb),c(0) { cout << "a ...
- [JAVA]JAVA遍历Map的几种方式
//遍历key for (String key : dic.keySet() ) { System.out.println(key + dic.get(key)); } //遍历values for ...
- redis 5.0.3 讲解、集群搭建
REDIS 一 .redis 介绍 不管你是从事Python.Java.Go.PHP.Ruby等等... Redis都应该是一个比较熟悉的中间件.而大部分经常写业务代码的程序员,实际工作中或许只用到了 ...
- 协议并发测试工具 BoHexTest
BoHexTest V1.0.3 1.添加连接LOG打印2.优化代理及并发策略 大小: 1074688 字节修改时间: 2017年10月3日, 10:24:26MD5: EBAE5A17F7F5ED0 ...
- Lepus监控之安装部署
PHP和Python都是跨平台的语言,所以理论上系统应该可以支持在不同的平台上运行.但是由于时间和精力以及资源有限,目前天兔系统只测试完善了Centos/RedHat系统的支持.我们目前提供的技术支持 ...
- MySQL安全机制 DDL DCL
一.MySQL用户管理 1. 修改用户密码 ===root修改自己密码=== 方法一: # mysqladmin -uroot -p'123' password 'new_password' //12 ...
- matplotlib绘图总结《转》
本文作为学习过程中对matplotlib一些常用知识点的整理,方便查找. 类MATLAB API 最简单的入门是从类 MATLAB API 开始,它被设计成兼容 MATLAB 绘图函数. from p ...
- k8s学习笔记之一:kubernetes简介
一.虚拟化技术 1.什么是虚拟化技术 虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机.在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立 ...
- first*php*self*
要完成一个简单的php程序,首先就是要分析一下要完成所需要实现哪些功能,以及页面的整体布局,以及会涉及到的一部分数据库的函数以及SQL语句. 今天自己简要做了一个php程序,拿到手后就开始创建所能用到 ...
- 虚拟机安装centOs+网络配置(完整说明)
1.新建虚拟机(标准) 选择 (我以后下安装操作系统) 选择Linux 操作系统 版本为CentOS(32位) 虚拟机的名称和位置任意 磁盘容量如下即可 设 ...