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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM