728x90
반응형
IMAP COMMAND 정리
1. 접속
telnet XXX.XXX.XXX.XXX 143
2. 로그인
확인할 사용자 확인
a LOGIN [사용자] 0000
3. 박스 선택하기
a SELECT INBOX
4. 리스트 보기
a FETCH 0:[최대UID|*] (UID RFC822.SIZE FLAGS BODY[HEADER.FIELDS (FROM TO SUBJECT DATE MESSAGE-ID)])
5. 메시지 가져오기
a UID FETCH [해당 UID] BODY.PEEK[]
유용한 COMMAND
1. 전체 메시지의 X-MMS-MESSAGE-ID 출력
  a fetch 0:* (BODY[HEADER.FIELDS (X-MMS-MESSAGE-ID)])
2. 특정 X-MMS-MESSAGE-ID를 가진 UID 검색
a search HEADER "X-MMS-MESSAGE-ID" "검색하려고 하는값"
3. 메일 삭제
a store [UID] +flags (\deleted)
  a expunge
4. 첨부 컨텐츠만 확인
  a fetch [UID] rfc822.text
5. 메일의 모든 헤더값 출력
  a fetch [UID] BODY[HEADER]

1.       SELECT Command

A.      설명

메일 박스를 선택 한다. ( <-> CLOSE )

B.      사용예

A1 SELECT INBOX

<-> A1 CLOSE

2.       EXAMINE Command

A.      설명

SELECT 명령과 같다그러나 the selected mailbox is identified as read-only.

B.      사용예

A1 EXAMINE INBOX

3.       CREATE Command

A.      설명

메일 박스를 생성 한다.

B.      사용예

A1 CREATE OUTBOX1

4.       DELETE Command

A.      설명

메일 박스를 삭제 한다.

B.      사용예

A1 DELETE OUTBOX1

5.       RENAME Command

A.      설명

메일박스의 이름을 변경한다.

B.      사용예

A1 RENAME OUTBOX1 OUTBOX3

6.       SUBSCRIBE Command

A.      설명

LSUB Command에 의해 리턴되는 메일박스의 서버측 세팅인 ACTIVE, SUBSCRIBED 명시된 메일박스의 이름을 이 명령으로 추가 한다. (등록)

B.      사용예

A1 SUBSCRIBE OUTBOX1

7.       UNSUBSCRIBE Command

A.      설명

SUBSCRIBE의 반대 작업 (등록해제).

B.      사용예

A1 UNSUBSCRIBE OUTBOX1

8.       LIST Command

A.      설명

리스팅 기능.

B.      사용예

A1 LIST “” *

9.       LSUB Command

A.      설명

LIST와 기능이 비슷함

B.      사용예

a1 lsub "#news." "comp.mail.*"

a1 OK LSUB completed

10.   STATUS Command

A.      설명

메일박스의 상태 정보를 리턴 함.

Parameter

MESSAGES : 메일박스에 메세지의 수를 리턴    

RECENT : 최근에 등록된 메시지의 수 리턴

UIDNEXT : 새로운 메시지에 부여될 UID의 번호 리턴

UIDVALIDITY : 메일박스에서 unique identifier validity value 리턴

UNSEEN : The number of messages which do not have the \Seen flag set.

B.      사용예

A1 STATUS INBOX (MESSAGES)

A1 STATUS INBOX (MESSAGES UIDNEXT UIDVALIDITY)

11.   APPEND Command

A.      설명

명시된 메일박스의 끝에 새로운 메시지를 추가 할 수 있는 명령이다.

B.      사용예

A003 APPEND outbox1 (\Seen) {310}

Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST)

From: Fred Foobar

Subject: afternoon meeting

To: sjjung@mdminc.net

Message-Id:

MIME-Version: 1.0

Content-Type: TEXT/PLAIN; CHARSET=US-ASCII

C:

Hello Joe, do you think we can meet at 3:30 tomorrow?

C:

C:

C:

S: A003 OK APPEND completed

12.   CHECK Command

A.      설명

현재 선택된 메일박스의 체크포인트를 요구 한다.

B.      사용예

a1 check

a1 OK CHECK completed

13.   CLOSE Command

A.      설명 (좀더 읽어 봐야 함)

현재 선택된 메일박스의 close, 메시지중 \Deleted flag 로 세팅 되어 있는 것들은 영구적으로 삭제 해버린다.

B.      사용예

a1 close

14.   EXPUNGE Command

A.      설명

현재 선택된 메일박스의 메시지중 \Deleted flag 로 세팅 되어 있는 것들은 영구적으로 삭제 해버린다.

B.      사용예

a1 expunge

15.   SEARCH Command

A.      설명 (argument가 많음 다시 읽어 보기)

메일박스에서 given searching criteria 를 찾는다.

Searching criteria consist of one or more search keys.

B.      사용예

A282 SEARCH FLAGGED SINCE 1-Feb-1994 NOT FROM "Smith"

16.   FETCH Command

A.      설명

fetch 명령은 메일박스안의 메시지에 첨부된 데이터를 가져온다.

Fetch data single atom 또는 parenthesized list 로 할 수 있다.

사용해본 결과 아래와 같이도 됨

* 7 FETCH (FLAGS (\Seen) BODY[HEADER.FIELDS ("DATE" "FROM" "SUBJECT")] {118}

Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST)

From: Fred Foobar

Subject: afternoon meeting

B.      사용예

A654 FETCH 2:4 (FLAGS BODY[HEADER.FIELDS (DATE FROM)])

A654 FETCH 1:7 (FLAGS BODY[HEADER.FIELDS (DATE FROM)])

A654 FETCH 1:7 (FLAGS BODY[HEADER.FIELDS (DATE FROM SUBJECT)])

17.   STORE Command

A.      설명

메일박스안의 메시지에 첨부된 데이터를 바꾼다.

STORE가 플래그의 설정을 할 수 있음

B.      사용예

A003 STORE 2:4 +FLAGS (\Deleted)

18.   COPY Command

A.      설명

명시된 목적지 메일박스의 끝에 명시된 메시지를 복사 할 수 있다.

Flag  internal date는 복사본 에서도 유지 된다.

B.      사용예

A003 COPY 2:4 inbox

19.   UID Command

A.      설명

UID는 두개의 폼을 가지고 있다.

첫번째

복합 명령을 위해 적당한 argument copy, fetch, store 명령과 함께 쓸수 있다그러나 message set argument 의 수는 message sequence numbers 대신에 유일하게 인식 한다.

두번째

search 폼과 같이 쓸 수 있다. Argument의 해석은 SEARCH 명령과 같다그러나 UID SEARCH command를 위해 SEARCH 응답안데 돌려 보내는 수는 message sequence numbers 대신에 유일하게 인식 한다.

For example, the command UID SEARCH

1:100 UID 443:557 returns the unique identifiers corresponding to

the intersection of the message sequence number set 1:100 and the

UID set 443:557.

B.      사용예

A999 UID FETCH 2:6 FLAGS

* 1 FETCH (UID 4 FLAGS (\Seen))

A999 OK UID FETCH completed


/* (0) call login - Login ID, Login Password, Login Prompt */
cmd_struct tel_login[] = {
{"* OK", "login login %s %s", NULL, NULL},
{"login OK", "~", NULL, NULL},
};

/* (1) call logout*/
cmd_struct tel_logout[] = {
{"~", "logout logout", NULL, NULL},
{"logout OK", "~", NULL, NULL},
};

/* (2) close message sequence of MMBox */
cmd_struct close_mmbox_cmd_list[] = {
{"~", "MMBox close", NULL, NULL},
{"MMBox ", "~", NULL, parse_error_detect},
};

/* (3) noop MMBox */
cmd_struct noop_mmbox_cmd_list[] = {
{"~", "MMBox noop", NULL, NULL},
{"MMBox ", "~", NULL, parse_error_detect},
};

/* (4) create MMBox */
cmd_struct create_mmbox_cmd_list[] = {
{"~", "MMBox create %s", NULL, NULL},
{"MMBox ", "~", NULL, parse_error_detect},
};

/* (5) remove MMBox */
cmd_struct remove_mmbox_cmd_list[] = {
{"~", "MMBox delete %s", NULL, NULL},
{"MMBox ", "~", NULL, parse_error_detect},
};

/* (6) upload MMBox */
cmd_struct upload_mmbox_cmd_list[] = {
{"~", "MMBox append %s (\\Seen) {%s}", NULL, NULL},
{"+ OK", "%s", append_proc, NULL},
// {"+ Ready", "%s", append_proc, NULL},
{"MMBox ", "~", NULL, parse_error_detect},
};

/* (7) move Mail in MMBox to other MMBox */
cmd_struct move_mmbox_cmd_list[] = {
{"~", "MMBox select %s", NULL, NULL},
{"MMBox ", "MMBox search HEADER Message-ID %s", NULL, parse_error_detect},
{"MMBox ", "MMBox copy %s %s", NULL, parse_search_sqn},
{"MMBox ", "MMBox store %s +FLAGS (\\Deleted)",
  NULL, parse_error_ignore},
{"MMBox ", "MMBox expunge", NULL, NULL},
{"MMBox ", "MMBox close", NULL, NULL},
{"MMBox ", "~", NULL, parse_error_detect},
};

/* (8) copy Mail in MMBox to other MMBox */
cmd_struct copy_mmbox_cmd_list[] = {
{"~", "MMBox select %s", NULL, NULL},
{"MMBox ", "MMBox search HEADER Message-ID %s", NULL, parse_error_detect},
{"MMBox ", "MMBox copy %s %s", NULL, parse_search_sqn},
{"MMBox ", "MMBox close", NULL, parse_error_ignore},
{"MMBox ", "~", NULL, parse_error_detect},
};

/* (9) del Mail in MMBox */
cmd_struct del_mmbox_cmd_list[] = {
{"~", "MMBox select %s", NULL, NULL},
{"MMBox ", "MMBox search HEADER Message-ID %s", NULL, parse_error_detect},
{"MMBox ", "MMBox store %s +FLAGS (\\Deleted)",
  NULL, parse_search_sqn},
{"MMBox ", "MMBox expunge", NULL, NULL},
{"MMBox ", "MMBox close", NULL, NULL},
{"MMBox ", "~", NULL, parse_error_detect},
};

/* (10) get Mail in MMBox */
cmd_struct get_mmbox_cmd_list[] = {
{"~", "MMBox select %s", NULL, NULL},
{"MMBox ", "MMBox search HEADER Message-ID %s", NULL, parse_error_detect},
{"MMBox ", "MMBox fetch %s RFC822.TEXT", NULL, parse_search_sqn},
{"MMBox ", "MMBox close", NULL, parse_get_mm},
{"MMBox ", "~", NULL, parse_error_detect},
};

/* (11) get Mail header in MMBox */
cmd_struct get_header_cmd_list[] = {
{"~", "MMBox select %s", NULL, NULL},
{"MMBox ", "MMBox search HEADER Message-ID %s", NULL, parse_error_detect},
{"MMBox ", "MMBox fetch %s BODY[HEADER]", NULL, parse_search_sqn},
{"MMBox ", "MMBox close", NULL, parse_get_mm},
{"MMBox ", "~", NULL, parse_error_detect},
};

/* (12) view Mail list in MMBox */
cmd_struct view_mmbox_cmd_list[] = {
{"~", "MMBox select %s", NULL, NULL},
{"MMBox ", "MMBox fetch 1:* (FLAGS BODY[HEADER])", NULL, parse_error_detect}, /* UID FETCH 1:* (FLAGS) */
{"MMBox ", "MMBox close", NULL, parse_fetch_mmbox_list},
{"MMBox ", "~", NULL, parse_error_detect},
};

/* (13) status MMBox */
cmd_struct status_mmbox_cmd_list[] = {
{"~", "MMBox status %s (MESSAGES)", NULL, NULL},
{"MMBox ", "~", NULL, parse_error_detect},
};

/* (14) store flags of MM of MMBox */
cmd_struct set_status_mmbox_cmd_list[] = {
{"~", "MMBox select %s", NULL, NULL},
{"MMBox ", "MMBox search HEADER Message-ID %s", NULL, parse_error_detect},
{"MMBox ", "MMBox store %s flags %s", NULL, parse_search_sqn},
{"MMBox ", "MMBox close", NULL, parse_error_detect},
{"MMBox ", "~", NULL, parse_error_detect},
};



출처 : http://blog.naver.com/neptune4781/90002644797

728x90
반응형
728x90
반응형

파일 존재여부확인하여 시퀀스번호를 붙이는 유틸


파일 을 복사하여 사용자에게 zip 으로 묶어주는 프로그램을 만들던중 동일한 파일명을 가진 파일에 대한 처리가 필요하여 만들어본 유틸이다.

작업중인 디렉토리에 동일한 파일명이 존재한다면 recursive 하게 메서드를 호출하여 _1,_2,_3 ... 같이 파일명뒤에 시퀀스를 카운트해준다.


테스트 케이스는 아래와 같다. 

test_ - 복사본.txt

test_.txt

test.txt

test_1.txt

_test_1.txt

_.txt

_1.txt

위 와 같은 테스트 형식의 파일이 들어올경우에 대해서도 테스트 가 끝난 코드이므로 일반적인 예에서의 버그는 적을꺼라 보긴하나

추가적으로 버그가 리포팅된다면 소스도 변경하도록하겠다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
    /**
     * 동일한 파일명의 파일이 존재하는지 확인하여 존재한다면 파일명 뒤에 "_숫자" 를 
     * 붙이고 "_숫자"가 존재한다면 "_숫자" +1 을 더한값을 재귀적으로 카운트
     * @author digimon1740
     * */
    public static String appendSuffixName(String orgFileName, int seq) {
        String retFileName = "";
        // 파일이 존재하는지 확인한다.
        if (new File(orgFileName).exists()) {
            int plusSeq = 1;
 
            String seqStr = "_" + seq;
            String firstFileName = orgFileName.substring(0,
                    orgFileName.lastIndexOf("."));
            String extName = orgFileName
                    .substring(orgFileName.lastIndexOf("."));
 
            // 만약 파일명에 _숫자가 들어간경우라면..
            if (orgFileName.lastIndexOf("_") != -1
                    && !firstFileName.endsWith("_")) {
                String numStr = orgFileName.substring(
                        orgFileName.lastIndexOf("_") + 1,
                        orgFileName.lastIndexOf(extName));
                try {
                    plusSeq = Integer.parseInt(numStr);
                    plusSeq = plusSeq + 1;
                    
                    retFileName = firstFileName.substring(0,
                            firstFileName.lastIndexOf("_"))
                            + "_" + plusSeq + extName;
                } catch (NumberFormatException e) {
                    retFileName = firstFileName + seqStr + extName;
                    return appendSuffixName(retFileName, ++plusSeq);
                }
                
            } else {
                retFileName = firstFileName + seqStr + extName;
            }
            // 재귀
            return appendSuffixName(retFileName, ++plusSeq);
        } else {
            return orgFileName;
        }
    }


728x90
반응형
728x90
반응형

SWING 개발시 클립보드에 내용을 복사하기 


JAVA 의 Swing 을 이용한 GUI 어플리케이션 개발시 아래의 소스를 응용해 클립보드에 지정한 문자열의 복사가 가능하다


String str = "복사할 문자열";

Toolkit toolkit = Toolkit.getDefaultToolkit();

Clipboard clipboard = toolkit.getSystemClipboard();

StringSelection strSel = new StringSelection(str);

clipboard.setContents(strSel, null);


나같은 경우는 "클립보드에 복사" 라는 버튼을 만들어 그 버튼이 눌렸을 경우에 위의 소스가 동작하게 하였다.

728x90
반응형
728x90
반응형

Runtime 클래스를 이용한 외부파일 실행

개발 업무를 진행하다 보면 특정 배치 모듈이나 버튼을 웹에서 눌렀을때 데몬등이 수행되게 해달라는 요청이 들어올때가 있다.

이때 간단하게 Runtime클래스를 사용하여 외부파일을 실행할수있다.

아래와 같이 커맨드를 인자로 하고 exec() 메서드를 수행하면 외부파일이 실행된다.


1
2
3
4
5
6
7
8
9
10
11
12
  public class {
    public static void main(String arg[]) {
            String[] cmd = new String[2];
             cmd[0] = "sh";
             cmd[1] = "/usr/local/bin/start.sh";
 
           Process p = Runtime.getRuntime().exec(cmd);
    }
  }


몇가지 주의할점이 있다면 외부인자를 받아서 (예: request에 명령어를 담는다던가) 하는 프로그램을 작성하게되면 보안상 취약해질수있으므로 명령커맨드는 하드코딩이나 별도 설정파일로 따로 관리하도록 해야하며 현재 프로그램이 수행중인 

시스템계정으로 작동하기 때문에 리눅스나 유닉스같이 권한에 대한 관리를 하는 OS의 경우 권한이 맞지않으면 

예외가 발생할 수 있다. 

추가로  exec() 메서드의 리턴 타입은 Process 인데 이 를 활용하여 출력된 스트림을 가져올수도 있고 여러가지 

처리가 가능하다.

 

728x90
반응형

+ Recent posts