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 -*- ...
随机推荐
- find查找文件的时间问题
很多细节方面的东西没有到真正用的时候,是觉察不出来的,因为这个时间的问题出了问题,现在好好理一下,这个find的时间很容易就搞混了,一段时间不用,也忘了,也反映出来了自己的基础知识不是很牢固啊 f ...
- Ubuntu 14.10 下Hive配置
1 系统环境 Ubuntu 14.10 JDK-7 Hadoop 2.6.0 2 安装步骤 2.1 下载Hive 我第一次安装的时候,下载的是Hive-1.2.1,配置好之后,总是报错 [ERROR] ...
- react使用ant-design组件库
新建项目并引入组件 1,全局安装脚手架 npm install -g create-react-app 2,新建项目 create-react-app reactantd 3,安装组件 npm ins ...
- 转载--无弹窗APT渗透实验
转载--无弹窗APT渗透实验 文章作者:亚信安全,转载自 FreeBuf.COM APT攻击方式花样繁多,我研究最近的流行的APT攻击方式,在本地搭建环境模拟一次简单的APT攻击,在模拟攻击过程中发现 ...
- 涂抹mysql笔记-mysql复制特性
<>mysql复制特性:既可以实现整个服务(all databases)级别的复制,也可以只复制某个数据库或某个数据库中的某个指定的表对象.即可以实现A复制到B(主从单向复制),B再复制到 ...
- lecune入门示例
注意:本示例中的lucene版本需在jdk7以上使用. 一.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" ...
- python-web微信实现
1.url from django.conf.urls import url from django.contrib import admin from web import views urlpat ...
- python字符串前面的r/u/b的意义 (笔记)
u/U:表示unicode字符串 : 不是仅仅是针对中文, 可以针对任何的字符串,代表是对字符串进行unicode编码. r/R:非转义的原始字符串: 与普通字符相比,其他相对特殊的字符,其中可能包含 ...
- win10 64位,家庭版,C++,ini配置说明
#include<windows.h> #include<iostream> #include <atlstr.h> using namespace std; ...
- git自定义项目钩子和全局钩子
钩子介绍 自定义钩子分为:项目钩子和全局钩子 自定义全局钩子: 全局钩子目录结构: (注意:excludes目录结构是我们自定义的目录,规则逻辑在update.d/update.py脚本里实现的,非g ...