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檢視硬碟的