Android 发送邮件以及定时发送邮件的实现

本文以腾讯企业邮箱为例,展示如何发送邮件 及相关问题  选择腾讯企业邮箱是因为腾讯企业邮箱一般都是开启了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

Android 发送邮件以及定时发送邮件的实现的相关文章

Spring整合Quartz定时发送邮件

功能描述:刚开始接触Quartz,试着用Quartz整合spring实现每隔一分钟发送一封邮件连续发送10次 核心jar: 邮件发送:commons-email-1.2.jar mail.jar(必须的) quartz:quartz-all-1.8.3.jar quartz-all-1.8.3/lib/下所有jar spring:spring-context-support.ajr(必须的) 只贴出核心代码: Email发送:使用apache commons-email跟mail package

python (18)在linux中如何实现定时发送邮件

最近要用到,定时发送邮件功能: 如何定时,当然要用到linux中crontab了 目前代码只能发邮件,能发送附件的还在学习中,稍后补上 1 #!/usr/bin/env python 2 3 import smtplib 4 from email.mime.text import MIMEText 5 import threading 6 import time, datetime 7 8 mailto_list=[""] #里面是对方的邮箱 9 #-----------QQ邮箱发送设

java实现qq邮箱每天定时发送邮件

本周四的时候去学校的某机构值班,主要工作是帮老师送文件,干一些杂活.那天没有什么活儿,于是想起用Java实现发送邮件和接收邮件的功能.前几天接触过一点quartz框架,用来实现定时开始任务的功能.于是,这里把他们结合起来了,实现定时发送邮件,向暗恋的女神表白的用处(yiyin). 我没有研究过quartz框架,这里主要是从实用的角度讲一下.在使用时,需要编写任务类和触发器类两部分的代码.任务类是你想实现的功能部分,需要实现Job接口.触发器类设置任务的定时执行时间. 在java实现email中,

Android 使用 Gmail 来发送邮件

1. [代码]SendMail.java package org.apache.android.mail; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; public class SendMail extend

VBS实现定时发送邮件

原理:建立CDO.Message对象,设置好参数后直接Send就可以了 代码如下: NameSpace = "http://schemas.microsoft.com/cdo/configuration/" Set Email = CreateObject("CDO.Message") Email.From = "你的Email地址" Email.To = "接收方的Email地址" Email.Subject = "

在采集程序中增加定时发送邮件以及关机处理的实现

我们在采集特定数据的时候,往往需要耗费较长的时间,有时候因为一些事情,不可能长久的在电脑前等待结果,那么需要程序在一段时间后自动给我们发送邮件等通知,以及执行退出程序或者关机等处理善后工作,以节省资源或者电源,那么需要实现这个过程是如何的呢.本篇随笔基于这个采集程序的基础上增加这些功能的实现,介绍其中的一些处理技巧. 1.邮件配置 如果我们需要实现发送邮件.或者发送短信等通知途径,那么我们就需要把这些处理过程涉及到的参数提前录入到系统里面,是在不行硬编码也行,不过为了可扩展性,我倾向于使用配置界

Infomatica自动监控定时发送邮件需求

一.需求 对Infomatica中全部Workflow进行监控,对CIF和SCV任何表进行监控. 二.完成情况 到2015年7月29日,基本功能已经可以实现. 在130机器上通过crontab定时调度来实现每天定时监控状态并发送邮件. 三.功能说明 在/home/infor/...../bin/sh 目录下创建一个shell脚本,包括以下流程 1.访问SCV数据库,将etl_date_status的结果生成csv文件. 2.访问Informatica数据库,将监控CDC的结果生成CSV文件. 3

定时发送邮件

工作中有时需要定时执行某些操作(比如发邮件),我们一般有下面4种方法 1.C#自带Timer定时控件 操作流程:进入项目的Global.asax.cs文件的Application_Start函数,添加SendEmail功能即可. 评价:IIS 7应用程序池自动回收,这样就需要有人访问站点才能再次执行定时任务.虽然也有其它补救办法,但是不优雅,放弃. 2.Windows 计划任务+Web Service 操作流程:1.单独写一个WebService发邮件程序,生成exe. 2.创建一个Window

基于Quartz实现简单的定时发送邮件

一.什么是Quartz Quartz 是一个轻量级任务调度框架,只需要做些简单的配置就可以使用:它可以支持持久化的任务存储,即使是任务中断或服务重启后,仍可以继续运行.Quartz既可以做为独立的应用提供服务,也可以和其他应用集成一起使用. 核心概念: 1.Job 表示一个工作,要执行的具体内容.此接口中只有一个方法 void execute(JobExecutionContext context) 2.JobDetail JobDetail表示一个具体的可执行的调度程序,Job是这个可执行程调