1. 程式人生 > >Android 郵件傳送,支援附加檔案,抄送、密送多人接收

Android 郵件傳送,支援附加檔案,抄送、密送多人接收

      上一篇寫了一個java傳送郵件的工具,原本想用到Android中,但是java工程中的jar包與Android中使用的jar是不一樣的。用法也有所不同,其實也一樣,稍微有點變化。

    比較懶得我就不喜歡定義什麼物件類來控制訊息的傳送了,之間將訊息塞進去很實在。

    直接看程式碼:

package com.sai.library.email;

import android.util.Log;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.*;

public class SendEmail {

    public  interface Callback {
        void success(String s);

        void error(String s, Exception e);
    }

    public static final String DATA_TYPE_HTML = "text/html;charset=utf-8";
    private Callback callback;  //資訊回撥介面
    private Properties properties;//系統屬性物件
    private String mailAccount;   //傳送郵箱地址
    private String mailPassword;  //驗證密碼
    private Session session;      //郵件會話物件
    private String myNickName;    //暱稱,傳送時自己的暱稱
    private boolean debug = false;//debug模式
    private boolean isSaveEmail = false;
    private String pathName = "exc.eml";//郵件儲存時的

    public SendEmail(String mailAccount, String mailPassword) {
        this.mailAccount = mailAccount;
        this.mailPassword = mailPassword;
    }

    public SendEmail setSaveEmail(String pathName) {
        isSaveEmail = true;
        this.pathName = pathName;
        return this;
    }

    private List<String> recipientT0List = new ArrayList<>();//收件地址
    private List<String> recipientCCList = new ArrayList<>();//密送地址
    private List<String> recipientBCCList = new ArrayList<>();//抄送地址
    private List<String> filePath = new ArrayList<>();//附件

    public SendEmail setDebug(boolean sessionDebug) {
        debug = sessionDebug;
        return this;
    }

    /*** 設定多人收件人地址 */
    public SendEmail addRecipientT0(String address) {
        recipientT0List.add(address);
        return this;
    }

    public SendEmail addRecipientCC(String address) {
        recipientCCList.add(address);
        return this;
    }

    public SendEmail addRecipientBCC(String address) {
        recipientBCCList.add(address);
        return this;
    }

    public SendEmail addRecipientT0(List<String> address) {
        recipientT0List.addAll(address);
        return this;
    }

    public SendEmail addRecipientCC(List<String> address) {
        recipientCCList.addAll(address);
        return this;
    }

    public SendEmail addRecipientBCC(List<String> address) {
        recipientBCCList.addAll(address);
        return this;
    }

    /***新增檔案***/
    public SendEmail addFile(String filePath) {
        this.filePath.add(filePath);
        return this;
    }

    public SendEmail addFile(List<String> list) {
        this.filePath.addAll(list);
        return this;
    }

    /****暱稱設定**/
    public SendEmail setMyNickName(String name) {
        myNickName = name;
        return this;
    }

    private MimeMessage message;

    /**
     * @param title 主題
     * @param datas 內容
     * @param type  內容格式型別 text/html;charset=utf-8
     * @return s
     */
    public SendEmail createMail(String title, String datas, String type) {
        if (mailAccount.length() == 0 || mailAccount.equals(null)) {
            System.err.println("發件地址不存在!");
            return this;
        }
        if (myNickName == null) {
            myNickName = mailAccount;
        }
        properties = getProperties();
        if (!sync) return this;
        try {
            MyAuthenticator authenticator = null;
            authenticator = new MyAuthenticator(mailAccount, mailPassword);
            session = Session.getDefaultInstance(properties, authenticator);
//            session.setDebug(debug);
            // 根據session建立一個郵件訊息
            message = new MimeMessage(session);
            // 設定傳送郵件地址,param1 代表傳送地址 param2 代表傳送的名稱(任意的) param3 代表名稱編碼方式
            message.setFrom(new InternetAddress(mailAccount, myNickName, "utf-8"));

            setRecipientT0();   //新增接收人地址
            setRecipientCC();   //新增抄送接收人地址
            setRecipientBCC();  //新增密送接收人地址

            BodyPart messageBodyPart = new MimeBodyPart();  // 建立訊息部分
            messageBodyPart.setContent(datas, type);        // 訊息內容
            // 建立容器描述資料關係
            MimeMultipart multipart = new MimeMultipart();
            multipart.addBodyPart(messageBodyPart);         // 設定文字訊息部分
            /***新增附件****/
            if (filePath.size() >0){
                for (int i = 0; i < filePath.size(); i++) {
                    MimeBodyPart attach = new MimeBodyPart();
                    // 選擇出每一個附件名
                    String pathName = filePath.get(i);
                    System.out.println("新增附件 ====>" + pathName);
                    // 得到資料來源
                    FileDataSource fds = new FileDataSource(pathName);
                    // 得到附件本身並至入BodyPart
                    attach.setDataHandler(new DataHandler(fds));
                    //採用這去除中文亂碼
                    attach.setFileName(MimeUtility.encodeText(fds.getName()));
                    multipart.addBodyPart(attach);
                    multipart.setSubType("mixed");
                }
            }
            /*****************************/
            // 傳送完整訊息
            message.setContent(multipart);
            message.setSubject(title);              // 設定郵件主題
            message.setSentDate(new Date());        // 設定傳送時間
            message.saveChanges();                  // 儲存上面的編輯內容
            // 將上面建立的物件寫入本地
//            saveEmail(title);
        } catch (Exception e) {
            if (callback != null)
                callback.error("message error ", e);
            sync = false;
        }
        return this;
    }

    public void sendEmail(Callback callback) {
        this.callback = callback;
        if (!sync) {
            Log.e("email", "sendEmail:sync false ");
            return;
        }
        try {
            // 傳送資訊
            Transport.send(message);
            // 關閉連結
            if (callback != null)
                callback.success("傳送完成");
        } catch (Exception e) {
            if (callback != null)
                callback.error("傳送異常", e);
        }
    }

    private void saveEmail(String title) throws IOException, MessagingException {
        OutputStream out = null;
        if (isSaveEmail) {
            if (pathName.length() == 0 || pathName.equals(null)) {

                out = new FileOutputStream(title + ".eml");
            } else {
                String path[] = pathName.split("\\.");
                out = new FileOutputStream(path[0] + title + ".eml");
            }
        }
        message.writeTo(out);
        out.flush();
        out.close();
    }

    /*** 設定收件人地址資訊*/
    private void setRecipientT0() throws MessagingException, UnsupportedEncodingException {
        if (recipientT0List.size() > 0) {
            InternetAddress[] sendTo = new InternetAddress[recipientT0List.size()];
            for (int i = 0; i < recipientT0List.size(); i++) {
                System.out.println("傳送到:" + recipientT0List.get(i));
                sendTo[i] = new InternetAddress(recipientT0List.get(i), "", "UTF-8");
            }
            message.addRecipients(MimeMessage.RecipientType.TO, sendTo);
        }
    }

    /***設定密送地址**/
    private void setRecipientCC() throws MessagingException, UnsupportedEncodingException {
        if (recipientCCList.size() > 0) {
            InternetAddress[] sendTo = new InternetAddress[recipientCCList.size()];
            for (int i = 0; i < recipientCCList.size(); i++) {
                System.out.println("傳送到:" + recipientCCList.get(i));
                sendTo[i] = new InternetAddress(recipientCCList.get(i), "", "UTF-8");
            }
            message.addRecipients(MimeMessage.RecipientType.CC, sendTo);
        }
    }

    /***設定抄送郵件地址**/
    private void setRecipientBCC() throws MessagingException, UnsupportedEncodingException {
        if (recipientBCCList.size() > 0) {
            InternetAddress[] sendTo = new InternetAddress[recipientBCCList.size()];
            for (int i = 0; i < recipientBCCList.size(); i++) {
                System.out.println("傳送到:" + recipientBCCList.get(i));
                sendTo[i] = new InternetAddress(recipientBCCList.get(i), "", "UTF-8");
            }
            message.addRecipients(MimeMessage.RecipientType.BCC, sendTo);
        }
    }

    private boolean sync = true;

    /**
     * 規定設定 傳輸協議為smtp  根據輸入的郵箱地址自動匹配smtp伺服器地址與smtp伺服器地址埠
     */
    private Properties getProperties() {
        String account[] = mailAccount.split("@");
        String mailTpye = "";
        try {
            mailTpye = account[1];
        } catch (Exception e) {
            System.err.println("不正確的郵箱地址!");
            sync = false;
            return null;
        }
        String SMTPHost = "";//smtp伺服器地址
        String SMTPPort = "";//smtp伺服器地址埠
        switch (mailTpye) {
            case "qq.com":
            case "foxmail.com":
                SMTPHost = "smtp.qq.com";
                SMTPPort = "25";
                break;
            case "sina.com":
                SMTPHost = "smtp.sina.com";
                SMTPPort = "25";
                break;
            case "sina.cn":
                SMTPHost = "smtp.sina.cn";
                SMTPPort = "25";
                break;
            case "139.com":
                SMTPHost = "smtp.139.com";
                SMTPPort = "465";
                break;
            case "163.com":
                SMTPHost = "smtp.163.com";
                SMTPPort = "25";
                break;
            case "188.com":
                SMTPHost = "smtp.188.com";
                SMTPPort = "25";
                break;
            case "126.com":
                SMTPHost = "smtp.126.com";
                SMTPPort = "25";
                break;
            case "gmail.com":
                SMTPHost = "smtp.gmail.com";
                SMTPPort = "465";
                break;
            case "outlook.com":
                SMTPHost = "smtp.outlook.com";
                SMTPPort = "465";
                break;
            default:
                System.err.println("暫時不支援此賬號作為服務賬號傳送郵件!");
                return null;
        }
        Properties prop = new Properties();
        prop.setProperty("mail.transport.protocol", "smtp"); // 設定郵件傳輸採用的協議smtp
        prop.setProperty("mail.smtp.host", SMTPHost);// 設定傳送人郵件伺服器的smtp地址
        prop.setProperty("mail.smtp.port", SMTPPort);// SMTP 伺服器的埠 (非 SSL 連線的埠一般預設為 25, 可以不新增, 如果開啟了 SSL 連線,
        prop.setProperty("mail.smtp.auth", "true");     // 設定驗證機制
        prop.setProperty("mail.smtp.starttls.enable", "true");     // 設定驗證機制

//        prop.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
//        prop.setProperty("mail.smtp.socketFactory.fallback", "false");
//        prop.setProperty("mail.smtp.socketFactory.port", SMTPPort);

        return prop;

    }


}

使用到的使用者密碼驗證物件。

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

public class MyAuthenticator extends Authenticator {
    String userName = null;
    String password = null;

    public MyAuthenticator() {

    }

    public MyAuthenticator(String username, String password) {
        this.userName = username;
        this.password = password;
    }

    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(userName, password);
    }
}

使用

new SendEmail("30****@qq.com", "jnzj***dgaa")
                        .addRecipientT0("251**[email protected]")
                        .addRecipientT0("942**[email protected]")
                        .setMyNickName("標題暱稱")//顯示直接的暱稱
                        .addFile(files)//新增檔案附件
                        .createMail("建議反饋", data, SendEmail.DATA_TYPE_HTML)//穿件郵件訊息
                        .sendEmail(new SendEmail.Callback() {//傳送郵件,這裡接收發送完成後的返回資訊,可根據傳送結果提示使用者
                            @Override
                            public void success(String s) {
                                Log.e(TAG, "success: 郵件傳送成功");
                                runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        dismissLoadingDialog();
                                        toast_short("傳送成功");
                                    }
                                });
                            }

                            @Override
                            public void error(String s, Exception e) {
                                Log.e(TAG, "error: 傳送失敗");
                                runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        dismissLoadingDialog();
                                        toast_short("傳送失敗");
                                    }
                                });

                            }
                        });

由於傳送郵件需要網路,這裡就不能直接在安卓主執行緒中直接傳送了。這裡就不做過多執行緒非同步處理了。

相關推薦

Android 郵件傳送支援附加檔案抄送接收

      上一篇寫了一個java傳送郵件的工具,原本想用到Android中,但是java工程中的jar包與Android中使用的jar是不一樣的。用法也有所不同,其實也一樣,稍微有點變化。    比較懶得我就不喜歡定義什麼物件類來控制訊息的傳送了,之間將訊息塞進去很實在。 

egg-ueditor基於egg的UEditor百度編輯器後端實現支援圖片/檔案上傳列表及圖片遠端抓取

egg-ueditor 基於egg的UEditor百度編輯器後端實現,支援圖片/檔案上傳、列表及圖片遠端抓取 原始碼:https://github.com/inmyjs/egg-ueditor 安裝 npm install egg-ueditor --save 使用方

java 傳送附件1是檔案附件2是圖片內容含有圖片的郵件

package com.common; import java.io.File; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.DataSource; impor

android 獲取指定路徑下所有檔案檔案從一個目錄copy到另一個目錄執行linux命令

/** * 複製整個資料夾內容 ,可以從data/data/包名下 拷貝到 data/data/包名下。也可以copy到 /sdcard 下 * @param oldPath String 原檔案路徑 如:c:/fqf

(Python)利用SMTP傳送郵件終極篇抄送

在利用SMTP傳送郵件進階篇,傳送混合格式郵件一文中我解釋瞭如何傳送各種內容的郵件,但是收件人都是主送,沒有抄送和暗送。 文中相關程式碼如下: msg['from'] = user msg['to'] = ','.join(to_list) #注意,不是分號 msg[

android原始碼下加入替換鈴聲檔案及設定預設鈴聲

系統鈴聲檔案的路徑在frameworks/base/data/sounds資料夾 有四個主要資料夾alarms ,notifications,ringtones,effects,分別對應系統的鬧鐘鈴聲,通知鈴聲,來電鈴聲,音效 如果需要新增鈴聲檔案,只需把鈴聲放入對應的資料

Java通用的Excel檔案生成工具類支援生成檔案和瀏覽器直接下載

<span style="font-size:14px;">java通用的Excel檔案建立方法,支援同文件多tab頁建立。只需要呼叫靜態方法,傳遞List<String>表頭和List<Map>資料集合等,即可生成Excel檔案。 p

SpringBoot實現簡單的郵件傳送(收件人可選擇郵件內容可編輯)

1.配置專案檔案目錄,我配置的是這樣的: 2:配置pom.xml 參照對比新增包依賴 <dependency> <groupId>org.springframework.boot</groupId>

Android 自定義ScrollView 支援慣性滑動慣性回彈效果。支援上拉載入更

先講下原理: ScrollView的子View 主要分為3部分:head頭部,滾動內容,fooder底部 我們實現慣性滑動,以及回彈,都是靠超過head或者fooder 就重新滾動到  ,內容的頂部或者底部。 之前看了Pulltorefresh 他是通過不斷改變 head或

android反編譯APK後是smali檔案能反編譯成dex檔案

我也面臨相同的問題,但目前還沒找到類似反編譯smali檔案的方法,一般得到dex檔案只需要用WinRAR或其他壓縮軟體開啟apk檔案就能得到。但也有例外好像,技術先進了,今天遇到個apk用WinRAR開啟異常,沒有dex檔案,所以得到原始碼的計劃就泡影了,至少用目前常規的方

IDEA編寫wordcount讀取hdfs檔案執行在Spark叢集例子

前期:已安裝好hadoop叢集和spark叢集,hadoop2.6.5,spark2.3.1,jdk1.8. scala2.1.0 第一步:在idea編寫scala程式,並且要打包(pom檔案的build標籤中配置好maven打包程式碼,可以定義主類也可以在提交的時候再定義){補充:可以在s

C語言 檔案大小分配空間讀入檔案寫入檔案實現複製的功能

首先通過兩種方法得到檔案的大小,位元組為單位,根據這個大小使用malloc分配固定的空間buffer,二進位制流讀入檔案,把二進位制流寫入buffer中,buffer輸出寫入到新的檔案。 原始檔1.txt,輸出檔案1.txt.txt 環境為Ubuntu 16.04,gcc #incl

【Unity】用Shader實現圖片的區域遮罩支援半透明實現地圖動態上色功能

一個專案,做世界地圖時,希望未開啟的地塊是線稿,新地塊開啟時,做一個上色處理。 想到的方案就是:上了色的彩圖蓋線上稿上,然後用mask 控制彩圖的區域性顯隱。 網上找了一個,可以半透明遮罩的shader:https://www.jianshu.com/p/1d9d439c28fa 要控制不同區塊

Okam(奧卡姆):小程式開發框架支援百度小程式微信小程式支付寶小程式

Okam(奧卡姆):小程式開發框架,支援百度小程式、微信小程式、支付寶小程式 Okam 是什麼 `Okam` 一個面向小程式開發的開發框架,開發體驗類 `Vue`。詳情 Okam 對各小程式的支援情況 支援 百度小程式 支援 微信小程式 支援 支付寶小程式 Okam 提供

python 自己實現列表的sort函式支援逆序可以排序任意型別的資料。 實現列表的排序要求支援逆序和指定標準(key)

def paixv(lt,reverse = None): for i in range(len(lt) - 1): for j in range(i+1,len(lt)): if reverse : if

Java開發公眾號系列教程(三):微信js-sdk圖片上傳支援預覽刪除

用過微信的人都知道,日常發表朋友圈圖文動態時,可以選擇多圖片,圖片右上角有個灰色的刪除圖示,可以對即將要發表的照片資訊進行預覽和刪除。今天筆者通過微信js-sdk介面給大家把這個實現過程分享出來。 一、主體思路 微信js-sdk上傳介面支援單次最多選擇9張圖片,我們要實現的就是跟微

企業官網製作支援個性化定製企業管理系統開發

我們專注於網站建設、微商城、APP開發、企業官網、電商平臺、三級分銷微信、程式開發。我們的服務:高階定製:網站建設,品牌官網,定製網站和系統品牌網站:企業品牌網站、公司官網開發商城開發:B2B、B2C、B2B2C商城開發移動開發:微信網站,微商城,三級分銷微商城、WAP網站專案方案:專業需求分析師,專屬專案經

C#如何操控FTP獲取FTP檔案或資料夾列表獲取FTP檔案大小FTP上傳FTP刪除檔案FTP新建資料夾刪除資料夾

C#如何操控FTP 出處:http://www.cnblogs.com/rond/archive/2012/07/30/2611295.html,http://www.cnblogs.com/rond   關於FTP的應用免不了要對FTP進行增刪查改什麼的。通過搜尋,整理和修改

redis安裝修改配置檔案例項部署 redis-server

redis 安裝 解壓: [[email protected] software]# tar -xvf redis-3.2.11.tar.gz 進入redis根目錄: [[email protected] software]# cd redis-3.2.11/ 編譯安裝: [[

ubuntu 掛載硬碟時只能讀取檔案不能寫入的解決辦法

最近用自己的硬碟當做儲存工具,突然發生了問題,就是隻能看硬盤裡的資料卻無法修改或者複製內容,查了好多辦法都不行,最後看到我掛載硬碟時,硬碟資料夾出現×號,這才想起來可能由於許可權問題,被設定為只讀模式,所以解決辦法自然就是給許可權啊: 1    pwd檢視硬碟的