Android 發送郵件以及定時發送郵件的實現

       本文以騰訊企業郵箱爲例,展現如何發送郵件 及相關問題  選擇騰訊企業郵箱是由於騰訊企業郵箱通常都是開啓了smtp服務html

 

       項目地址:https://gitee.com/bimingcong/MySendEmailjava

具體的smtp服務開啓方式以下: 設置----》客戶端設置----》記住紅色框內的發送服務器地址smtp.exmail.qq.com 以及要用到的SSL端口號465android

   首先用android系統發送郵件的話  須要用到針對android的郵件發送包 在此咱們能夠在Gradlegit

裏邊加入所需的依賴庫 重點是紅色部分的內容安全

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的格式session

 

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+="    一、"+ firstContent+"<br><br>" ; } if(secondContent.length()!=0){ preString+="    二、"+ secondContent+"<br><br>" ; } if(thirdContent.length()!=0){ preString+="    三、"+ thirdContent+"<br><br>" ; } preString+= "■今日工做內容和實施狀態<br><br>"; if(firstProcess.length()!=0){ preString+="    一、"+ firstContent+"-------------------------- "+firstProcess +"%<br><br>" ; } if(secondProcess.length()!=0){ preString+="    二、"+ secondContent+"-------------------------- "+secondProcess +"%<br><br>" ; } if(thirdProcess.length()!=0){ preString+="    三、"+ 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系統中發送郵件是網絡操做  屬於耗時操做  因此咱們發送的時候要在子線程中去發送app

 @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(); }

 如此,填上對應的參數就能夠實現郵件的發送,打開目標郵箱就能夠看到效果socket

 

         

 

當咱們須要定時發送郵件的時候能夠後臺啓動一個服務在服務裏邊開一個定時器,實現定時發送郵件

針對服務能夠開啓兩個服務,故障檢測對方是否存活,若是不存活,另外一個去從新救活,提升服務的存活率

 

項目地址:https://gitee.com/bimingcong/MySendEmail

        嚴禁盜版    

   轉載請註明出處:https://www.cnblogs.com/bimingcong/p/9215398.html

相關文章
相關標籤/搜索