javamail_메일 수신_pop3 수신 메일 디코딩 문제

6218 단어 javamail
javaMail 기본:
Session 클래스는 메일 서버와의 Session 요청(연결)을 대표하며, Session과 메일 서버의 관계는 JDBC의 Connection 클래스와 데이터베이스 시스템의 관계와 유사하다.모든 JavaMail 기반 응용 프로그램에는 최소한 하나의 Session이 있지만 임의의 Session이 있을 수 있습니다.Session 객체는 처리할 SMTP 서버와 POP 서버를 알아야 합니다.
메시지 클래스: 이 클래스는 우리의 우편함에 있는 전자 우편 정보와 일일이 대응하는 속성을 봉인합니다.
Transport 클래스, Store 클래스: 정보를 보내는 클래스로 Store 클래스와 어떤 의미에서 보면 상반된다.이 종류가 가장 많이 쓰이는 것은send 방법이다.메시지 대상을 설정한 후send(메시지)를 호출하면 메일을 보내는 기능을 실현할 수 있습니다.Store 클래스는 특정 메일 프로토콜의 읽기와 쓰기 감시 검색을 실현합니다.javax를 통해.mail.Store 클래스는javax에 접근할 수 있습니다.mail.Folder 클래스.이 클래스에서 자주 사용하는 방법은connect () 방법으로 메일 서버를 연결하고, getFolder () 로 작업할 폴더 대상을 얻는 것입니다.
 
javaMail에서 메일을 받는 동작은 다음과 같습니다. 1.Pop3 메일 서버에 연결 2.메일 대상 그룹 얻기 3.지정한 메일에 대한 정보 보기 4.메일을 삭제하다.
 
javamail은 pop3를 통해 보낸 사람의 디코딩 문제를 수신합니다.
  
메일 발송자의 형식: 이름 + < 메일 주소 >
 
일부 메일은 이름이 없고 바로 <메일 주소>입니다.그것을 문자열로 볼 수 있으며, 이 문자열은 먼저 인코딩을 거친 후에 암호화될 수 있다.이메일의 규범 때문에 smtp 전송에서 중국어 문자를 사용할 수 없습니다.따라서 내장 클래스의 MimeUtility 방법인 encodeText를 사용하여 수신자, 발송자의 이름을 인코딩하면 됩니다.인코딩 방식은 두 가지가 있는데 "B"는 Base64, "Q"는 QP(quoted-printable) 방식이다.
 
문자열의 인코딩 방식: 한 바이트는 8bits이고 한 글자는 16bit이며 인코딩 방식의 차이는 몇 bit로 한 문자를 표시하는지에 나타난다.문자열은 문자열로 구성되어 있으며, 인코딩에 따라 완전히 달라집니다.이것이 바로 중국어 난자 문제의 소재다.자바의 String에는 getBytes()가 플랫폼의 기본 문자 집합을 사용하여 이String를byte 시퀀스로 인코딩하고 결과를 새로운byte 그룹에 저장합니다.getBytes(Charset charset)는 주어진 charset을 사용하여 이 String를byte 서열에 인코딩하고 결과를 새로운byte 그룹에 저장합니다.getBytes(String charsetName)는 지정한 문자 집합을 사용하여 이 String를byte 서열로 인코딩하고 결과를 새로운byte 그룹에 저장합니다.암호화가 필요하면 이byte 그룹을 암호화합니다.
 
나는 163의pop3 서버에서 내 메일을 읽고 발송자를 출력했다.중국어에 난자가 생겼다.수신자 문자열 형식은utf-8,gbk,gb2312,gb18030입니다.
암호화 형식은 "B"가 Base64를 나타냅니다. 예: =?gb2312?B?1sfBqtXQxrj=?="를 통해 알 수 있듯이 이 문자열의 인코딩 형식은 gb2312이고 base64 암호화를 사용합니다. Q표 QP(quoted-printable) 방식: =?utf-8?Q?E4=B8=ADE5=8D=8E8=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")을 사용하고, 자바의 기본 인코딩은 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;
    }
}

 
 

좋은 웹페이지 즐겨찾기