1. 程式人生 > >javamail接收郵件pop3(接收郵件亂碼問題)

javamail接收郵件pop3(接收郵件亂碼問題)

javaMail基礎:

Session類,它代表與郵件伺服器的Session請求(連線),Session和郵件伺服器的關係類似於JDBC中的Connection類和資料庫系統的關係。每一個基於JavaMail的應用程式至少有一個Session,但可以有任意多個SessionSession物件需要知道用來處理的SMTP伺服器和POP伺服器。

Message類:這個類封裝了和我們信箱中的電子郵件資訊一一對應的屬性。

Transport類,Store類:用來發送資訊的類,它與Store類從某種意義上說是相反。該類用得最多的是send方法。把Message物件設定完畢後,呼叫sendMessage

)就可以實現發郵件的功能。Store類實現特定郵件協議的讀寫監視查詢等操作。通過javax.mail.Store類可以訪問javax.mail.Folder類。該類常用的方法是:connect()方法來連線郵件伺服器,getFolder()來得到待操作的Folder物件。

javaMail收郵件的操作是:1.連線到Pop3郵件伺服器2.得到郵件物件陣列3.檢視指定郵件的資訊4.刪除郵件。

javamail通過pop3接收到發件人的亂碼問題:

郵件發件人的格式為:姓名+<郵件地址>

而有些郵件沒姓名,直接是<郵件地址> 。可以把它看成一個字串,這個字串先經過編碼,然後可以被加密。由於

Email的規範,在smtp傳輸中不可使用中文字元。所以可以使用內建類的MimeUtility方法encodeText將收件人、發件人名字編碼即可。編碼方式有兩種:"B"代表Base64"Q"代表QPquoted-printable)方式。

字串的編碼方式:一個位元組為8bits,一個字為16bit,編碼方式的不同體現在用多少bit表示一個字元。字串由字元組成,按照不同的編碼顯示會完全不同。這就是中文亂碼問題的所在。JavaString中有()使用平臺的預設字符集將此String編碼為 byte 序列,並將結果儲存到一個新的 byte 陣列中。使用給定的將此String編碼到 byte

序列,並將結果儲存到新的 byte 陣列。(String charsetName)使用指定的字符集將此String編碼為 byte 序列,並將結果儲存到一個新的 byte 陣列中。如果需要加密,就對此byte陣列加密。

我從163pop3的伺服器上讀取我的郵件,並輸出發件人。中文出現了亂碼。收件人字串格式有:utf-8gbkgb2312gb18030。加密形式有"B"代表Base64如:=?gb2312?B?1sfBqtXQxrj=?= <[email protected]>",可以看出,這個字串的編碼格式是:gb2312,而採用了base64加密。QQPquoted-printable)方式:=?utf-8?Q?=E4=B8=AD=E5=8D=8E=E8=8B=B1=E6=89=8D=E7=BD=91?= [email protected]可以看出這個字串採用的編碼格式是:utf-8,而採用了quoted-printable加密。

對於沒有加密的字串,直接用rtnStr=new String(str.getBytes("iso-8859-1"));就能正確顯示。對於加密的字串,需要用rtnStr=MimeUtility.decodeText(str);就能解決

我們需要取出郵件地址+發件人名字,發件人名字有些是沒有的,這給處理帶來了難度,用正則表示式分組可以解決這個問題。也就是說名字可以沒有,但是發件人的郵件地址是一定有的。

將得到的收件人字串通過如下的方法:

通過正則表示式可以將發件人的名字和地址分別取出。

 //用匹配=?.*?[B|Q]的加密形式,工作過程是:首先對字串編碼,然後加密:"B"代表Base64、"Q"代表QP(quoted-printable)方式
 //對於加密的形式需要進行解密。
 
    private static Pattern p=Pattern.compile("((=//?.*//?[B|Q])(.*))([<](.*)[>]$)",Pattern.CASE_INSENSITIVE);
   
    //對於沒有加密的編碼,直接用new String(str.getBytes("iso-8859-1")),java中預設的編碼是GBK.
    private static Pattern p1=Pattern.compile(".*",Pattern.CASE_INSENSITIVE);
    private static Matcher m=null;
    private static Matcher m1=null;

    public static String getChinese(String str){
     String rtnStr="";
     m=p.matcher(str);
     m1=p1.matcher(str);
     try {
      if (m.find()) {
       if (m.group(1)!=null) {
        rtnStr=MimeUtility.decodeText(m.group(0));
        
    }else if (m.group(5)!=null){
       //rtnStr="為定義的名字";
        rtnStr=new String(m.group(0).getBytes("iso-8859-1"));
    }
       }else if(m1.find()){
        //System.out.println(m1.find());
     
      rtnStr=new String(m1.group().getBytes("iso-8859-1"));
     
      
   }           
  } catch (Exception e) {
   rtnStr=str;
   e.printStackTrace();
  }
  System.out.println(rtnStr);
  return rtnStr;
    }

 得到郵件主題的亂碼問題:

郵件主題的亂碼不是很複雜,和收件人一樣。編碼後加密,當然有的也不加密。我們可以對得到的字串先進行new String(str.getBytes("iso-8859-1")),然後再判斷有無? = Q等特殊字元,有的話用MimeUtility.decodeText()就可以解決了。程式碼如下:

  public static String getSubChinese(String str){
     String rtnStr="";
     try {
      rtnStr=new String(str.getBytes("iso-8859-1"));
      
      if (rtnStr.contains("=")) {
       rtnStr=MimeUtility.decodeText(str);
   }
   
  } catch (UnsupportedEncodingException e) {
   rtnStr=str;
   e.printStackTrace();
  }
  System.out.println(rtnStr);
  return rtnStr;
    }
}

相關推薦

javamail接收郵件pop3接收郵件亂碼問題

javaMail基礎: Session類,它代表與郵件伺服器的Session請求(連線),Session和郵件伺服器的關係類似於JDBC中的Connection類和資料庫系統的關係。每一個基於JavaM

基礎郵件原理MUA,MTA,MDA

pop3 客戶端 fill 客戶 觀察 工作 目的 重復 包括 電子郵件基本概念: MUA(Mail User Agent)接收郵件所使用的郵件客戶端,使用IMAP或POP3協議與服務器通信; MTA(Mail Transfer Agent) 通過SMTP協

簡單操作Zabbix安裝配置與郵件報警centos 7.4

zabbix 監控 學習 Zabbix官網下載地址:https://www.zabbix.com/download 實驗拓撲:zabbix server端: 192.168.80.101 公網環境 centos 7.4 LAMP架構zabbix angent端: 1

centos7搭建postfix郵件伺服器騰訊雲

用騰訊雲的先去開啟25埠,在控制檯頁面使用者名稱下面,,,我被坑了好久,,,,   在使用qq等郵件伺服器廠商提供的郵件服務後,發現他們的郵件傳送數量是有限制的,隨著公司的業務的需求下,我們需要搭建一個郵件伺服器,郵件伺服器可以幫助我們在一些提醒方面和訊息推送方面起到幫助。

使用php發郵件郵件流程

傳送郵件過程: 1、配置好你的郵箱服務(qq郵箱為例) 2、使用socket連線,建立一個套接字$fp=fsockopen($hostname,$port,$errno,$errmsg,30) 3、向對方郵件伺服器發出的標識自己的身份的命令fputs($fp,"EHLO ki\r\

callable介面配合ExecutorService實現多執行緒處理資料,並接收返回值2018-08-23

/** * @author chenzhen * Created by chenzhen on 2018/8/22. */ @Data public class QuickPullGit implements Callable<ArrayList&l

CNN英文垃圾郵件分類資料預處理

整理自唐宇迪老師的視訊課程,感謝他! 本文最後會貼出所有的原始碼檔案,下文只是針對每個小點貼出程式碼進行註釋說明,可以略過。 1.思路 關於利用CNN做文字分類,其主要思想通過下面這幅圖就能夠一目瞭然。 本文主要記錄了利用CNN來分類英文垃圾郵件的全

C# 帶附件郵件傳送支援多附件

工作需要用到了多附件傳送功能,現在貼出來,有需要的共享一下。 //帶附件傳送,支援多個附件        public bool sendMailFile(string from, string to, string subject, string body,string

第三方郵件客戶端收取163郵件問題郵件NO Select Unsafe Login. Please contact kefu解決辦法

 問題描述:         第三方郵件客戶端如心藍郵件批量管理助手使用IMAP收網易郵件提示:NO Select Unsafe Login. Please contact [email protected] for help,同時網頁登入郵箱檢視會收到一封標

使用 FCM 關於推送無法接收的問題Firebase 推送

 問題:當 app 處於後臺和關閉時,無法接收 pushmessage 當app 處於後臺的無法收到push message的解決方法:我也不知道,後面是老大說配置錯了,然後改了之後,就可以接收了。 當 app 關閉的時候無法接收 push message 的解決方法:官方

Flask-mail 發郵件即使異步

app sta 每一個 current ssa () rec class .com Flask-mail 發郵件慢(即使異步) 一開始,按照狗書上的代碼異步發郵件,但是發現原本響應只需要150ms的頁面加了郵件發送就變成了5s響應(這怕不是假異步) 狗書的異步發郵件代碼:

向API 介面傳送和接收json資料php,js

PHP 1. 傳送json資料,POST private function https_request($url, $data) { $curl = curl_init(); curl_setopt($curl, CU

jstl標籤forEach用法小結,後臺接收表單字串和陣列

對於在頁面上顯示大量資料庫查詢出來的內容時,有必要使用jstl的迴圈語句forEach。 先從後臺查詢:List<Map<String,Object>> systemNameList = sendPowerService.getAllSystemNa

java呼叫命令提示符並返回結果中文無亂碼

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import

node——6-響應資料型別 Content-Type解決中文亂碼

在服務端預設傳送的資料,其實是 utf-8 編碼的內容,但是瀏覽器不知道你是 utf-8 編碼的內容 瀏覽器在不知道伺服器響應內容的編碼的情況下會按照當前作業系統的預設編碼去解析 中文作業系統預設解析是 gbk 解決方法就是正確的告訴瀏覽器傳送的編碼格式,在 h

Ubuntu中文輸入法崩潰問題候選框亂碼

1.刪除.config資料夾下的配置檔案 cd ~/.config rm -rf SogouPY SogouPY.user sogou-qimpanel 檢查一下 確保刪乾淨了 重啟電腦 2.重啟fcitx killall fcitx killall sogou-qimpanel

JAVA+ibatis+DB2:blob型別欄位如何處理解決中文亂碼

(一)JAVA類 將資料庫中blob型別對映為JAVA中的byte[]型別 (二)XXXDAO.xml XXXDAO.xml中的<resultMap>節點寫法如下: <result property="remark1" column="REMARK_1"

SSM框架轉發處理跨域問題,流讀取的時候部分中文亂碼的解決中英文交界處亂碼

    今天又碰到一個奇葩的問題,曲折的過程就不說了。     內容:            朋友做一個別人的後臺對接專案,但是後臺是用aspx寫的,為了安全性的目的,不給跨域許可權。           因此朋友在本地用ssm 框架搭建一個轉發的中轉請求。  莫名其妙

java 重定向引數中文亂碼

            java在servlet中使用重定向response.sendRedirect時,連結中的引數列表為中文時將會獲取不到引數資料。 解決方案為:將引數轉化為iso-8859-1編

android 文字檔案的正確寫入防止中文亂碼

android文字檔案寫入流程 1,寫入檔案的路徑 2,獲取寫入流 3,寫入資料,記得轉換格式(UFT-8在android不能用,只能用gbk) 開始寫程式碼: 首先根據檔案地址判斷檔案是否存