"한메일" 메일 리턴 해결 (E-Mail Delivery Failed (441 4.4.1 temporay dns failed))

--------------------------------------------------------------------------

Your mail was returned
Reason :E-Mail Delivery Failed (441 4.4.1 temporay dns failed)

<Returned mail>
--------------------------------------------------------------------------
 From    : XXX@yurieasset.co.kr
 To      : XXXX@hanmail.net
 Subject :  XXXXX
[파이어월 로그검색]-------------------------------------------------------

# 정보키보드 검색: 송신자 이메일

# 검색방향: '최근시간부터검색'

[파이어월 dns 변경]-------------------------------------------------------

# 파이어월의 smtp 게이트웨이를 거쳐서 메일이 발송되기 때문에 F/W DNS도 점검
   해야함.

- TELNET 접속 후

plus# more resolv.conf
nameserver      210.104.1.3
#nameserver     164.124.101.2

 

[참고]---------------------------------------------------------------------

다음과 같은 오류로다음이나네이버 메일에송신되지 않는 경우 확인 해 볼 사항.
 
ERR-441 4.4.1 temporay dns failed
553 5.5.4 Host name(hanmail.net) is not match with your ip(211.47.65.108), maybe it's bogus
 
ERR-421 4.5.4 Specified HELO domain is invalid.
 
위 두개는 한메일 에러이고 아래 하나는 네이버메일 입니다.
 
최근 스팸메일 극성으로 인해 여러 메일업체들이 스팸메일 차단기를 장착하여 스팸 차단 강화를 정책으로 하고 있습니다.
기본적인 필터링, IP 차단등의 방법에 덧붙여,  IP와 도메인을 역 추적하여 매치하는 시스템을 사용하여 발생되는 오류입니다.
 
메일은 송신 시 여러 통신 명령을 거쳐 메일을 송신하게 됩니다.
명령어는 HELO 혹은 EHLO 명령으로 시작하는데, 이때 
 
HELO domainname 
 
이런 형식으로 HELO 뒤에 도메인을 적어줍니다.
이 도메인의  DNS에서 찾은 IP 정보와 보내는 서버의 IP (접속IP) 를 비교하여
일치하지 않으면 위와 같은 에러메시지를 내고 있습니다.
즉, DNS 상에 존재하지 않으니 정상적인 메일서버라 볼 수 없거나 릴레이당하여 보내는 것이라고 생각하는 것입니다.
이렇게 될 경우 DNS 상에 존재하지 않는 IP나 ADSL 등의 유동IP에서 보내는 메일은 송신할 수 없으며, 위와 같은 에러를 접하게 됩니다.
 
한메일의 경우에는 DNS 의 MX 레코드 (메일교환기 레코드) 를검색하여 IP 매치 여부를 판단합니다.
네이버메일의 경우 최근 붙인것 같은데, MX 가 아닌 A 레코드(일반 호스트레코드) 를 검색하는 것 같습니다. (사실 이렇게 하면 안됩니다. 메일 IP 와 호스트 IP는 도메인이 같더라도 다르게 세팅할 수 있습니다. 이부분은 네이버 측과지속적으로 협의하겠습니다.)
 
그러므로 메일을 송신하기 위해서는
 
현재 메일서버의 IP 와 기본도메인의 MX, A 레코드 의 IP 를 일치 시켜주십시오.
 
네이버 참고 사이트 :http://realip.naver.com/realip.py/main
다음 참고 사이트 :http://hmm.daum.net/nospam/nospamtop.html
네이트 참고 사이트 :http://mail.nate.com/help/antispam/index.html
 
많은 참고바랍니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 때찌1

SMTP 에러코드

 

▶ SERVER REPLY: 501 Denied domain name

  ; 도메인주소를 잘못 입력 or 수신측에서 도메인을 수신거부한 경우

 

▶ 421 Server too busy.

 ; 수신측 서버의 응답지연. 수신서버의 트래픽등으로 메일을 수신 받지 못하는 상황에서 발송자에게 리턴 메일을 보냄.

 

▶ 421-Microsoft ESMTP MAIL Service, Version: 5.0.2195.5600 ready at  Service not available, closing transmission channel

; MS사의 smtp 서버의 장애로 인해 메일을 수신받지 못하는 상황에서 리턴된 메시지.

 

▶ 421 4.3.2 Your IP(218.236.206.104) is filtered and this connection will be closed. You must register your IP tospammaster@hanafos.comBy SpaceLee, the Lord of mail server.

; 우리쪽 (mail.hanafos.com) 서버로 메일을 발송시 필터링 조건에 위배되어 스패머로 인식되고 필터링 되어 발신자에게 리턴되는 메시지.

 

▶ 441 4.4.1 No answer from host

; 수신측 서버의 응답이 없어서 리턴된 메시지.

 

▶ 451 4.4.0 DNS resolving error

; 수신측 서버의 도메인을 못찾아 리턴된 메시지.

 

▶ 451 4.3.0 Other or undefined mail system status

; 수신측 메일 시스템의 프로토콜이 틀리거나 수신 smtp 서버가 아닐경우

리턴되는 메시지.

 

▶ 451 4.3.0 Temporary system failure. Please try again later.

; 수신 서버의 일시적인 장애로 인해 메일을 수신받지 못해 리턴된 메시지.

 

▶ 451 4.4.2 Bad connection (io timeout)

; 수신 서버의 응답이 없어서 응답시간이 초과 되어 리턴된 메시지.

 

▶ 451 Relay Server Not Ready.

  ; 수신측 서버에서 릴레이 기능이 안돼어 리턴된 메시지.

 

▶ 452 4.4.5 Insufficient disk space; try again later

  ; 수신서버의 디스크용량이 부족하여 메일을 수신받지 못해 리턴된 메시지.

 

▶ 452 4.4.5 <leo@buffgame.com>... Insufficient disk space; try again later

  ; 수신자(leo@buffgame.com)의 메일함 용량이 부족하여 메일을 수신받지 못해 리턴된 메시지

 

▶ 500 Syntax Error, Command Unrecognized EHLO mo02.hanafos.com

 ; 발송자의 메일 발송기(아웃룩, 유도라 등등)에서 메일발송시 수신측 메일 서버에서

 SMTP 명령어를 인식하지 못해 리턴된 메시지.

 

▶ 500 5.5.1 Command unrecognized: "XXXX mo02.hanafos.com"

 ; 수신서버가 SMTP 명령어를 인식 하지 못함. (위와 동일).

 

▶ 501 5.1.8 Sender domain must exist(honorstech.com)

 ; 수신측 도메인(honorstech.com) 이 존재 하지 않아 리턴된 메시지.

 

▶ 502 Not implemented

 ; 수신측 서버가 smtp 명령어를 인식 하지 못해 리턴된 메시지.

 

▶ 505 Authentication required

 ; 수신측 서버가 릴레이 인증 등을 허용하지 않아 리턴된 메시지.

 

▶ 512 5.1.2 Bad destination system address

 ; 수신 서버의 장애나 네트웍 트래픽등으로 인헤 수신서버가 응답이 없을 때 리턴된 메시지.

 

▶ 550 5.1.1 Suspended user <barksunyoung@lycos.co.kr

; 수신자의 사용자의 계정이 중단 상태.

 

▶ 550 5.1.2 <smcho46@yahoo.net>... Unsupported mail destination

; 수신 서버가 응답이 지연되어 리턴된 메시지.

 

▶ 550 5.7.1 <gyunu@chollian.net>... Access

denied.(211.202.13.144) <gyunu@chollian.net>

; 수신자(gyunu@chollian.net)가 발신자의 메일주소를 수신 거부한 상태.

 

▶ 550 5.7.1 <smlee@mbestek.co.kr>... Relaying denied. IP name lookup failed [211.202.13.144]

 ; 수신 서버에서 발신자의 IP에 대해 릴레이 거부를 하여 메일을 보내지 못해 리턴된 메시지.

 

▶ 550 Requested action not taken: mailbox unavailable

 ; 수신자의 메일함을 찾지 못해 리턴된 메시지.

 

▶ 550 Mail is reject ( filtering reject )

 ; 수신 서버에서 발신자의 메일 주소나 IP를 필터링 하여 거부되어 리턴된 메시지.

 

▶ 550 5.1.1 <hkaprk@jeill.co.kr>... User unknown

 ; 수신자 (hkaprk@jeill.co.kr)계정을 찾지 못해 리턴된 메시지.

 

▶ 550 5.7.1 Unable to relay forlyc410@hanafos.net

 ; 수신 서버에서 릴레이 거부를 하여 리턴된 메시지.

 

▶ 550 Invalid recipientlobster@fernand.com

 ; 수신자 계정을 찾지 못해 리턴된 메시지 .

 

▶ 550 RCPT <hghwe@kornet.net> ERROR. Mailbox doesn't exist

 ; 수신자 메일함이 존재 하지 않아서 리턴된 메시지.

 

▶ 553 5.3.0 <samuelhy@hananet.net>... spam

 ; 발송자의 계정이 수신서버 상에서 스패머로 등록이 되어 메일 수신 거부를 해서 리턴된 메시지

 

▶ 553 sorry, your envelope sender is in my badmailfrom list

 ; 발신자의 메일 주소가 수신서버상에서 블랙리스트에 올라 거부되어 리턴됨.

 

▶ 553 sorry, that domain isn't in my list of allowed rcpt hosts

 ; 발신자의 메일 도메인주소 자체가 수신 서버에서 차단되어 리턴된 메시지.

 

▶ 553 5.1.8 <uni@honorstech.com>... Domain of sender addressuni@honorstech.comdoes not exist

 ; 발신자의 도메인에 대해 수신서버에서 체크 하여 없는 도메인일 경우 리턴시킨 메시지.

 

▶ 553 5.0.0 We do not accept mail from spammers - If you have questions,please emailadmin@www.narun.net.

 ; 발신자의 메일 계정이 스패머로 수신서버에서 등록이 되어 리턴된 메시지.

 

▶ 553 5.0.0 Your message may contain the Win32.Klez worm!!- If you have questions,please emailpostmaster@ecweb-1.blueweb.co.kr.

 ; 발신자의 메일에서 Win32.Klez 라는 웜바이러스가 발견되어 리턴된 메시지.

 

▶ 553 sorry, your envelope sender is enlisted as spammer.

 ; 발신자의 메일 주소가 수신서버상의 스패머 리스트에 등록 되어 리턴된 메시지.

 

▶ 553-This target address is not our MX service

 ; 수신자의 주소가 수신서버에서 서비스 안하는 도메인일 경우 리턴된 메시지.

 

▶ 554 5.3.2 Rejected by mailbox host. REPLY:(250 <ahnmin@thinknet.or.kr>... Sender ok)

 ; 수신자가 발송자의 메일 계정에 대해 수신 거부를 하여 리턴된 메시지 .

 

▶ 554 5.3.0 Mail have traversed Too many hops. Reject it.

 ; 발신자가 메일을 보낼 때 동보메일로 수신자의 메일 계정을 수신서버의 제한량 이상 넣어 보내어 리턴된 메시지.

 

▶ 554 5.3.2 Rejected by mailbox host. REPLY:(550 5.1.1 unknown or illegal alias:kgng_h_w@samsung.com)

 ; 수신자가 발송자의 메일 계정에 대해 수신거부를 설정하여 리턴된 메시지.

 

▶ 554 1048035239.13309.hanmir accept failed. [code=-1]

 ; hanmir 서버에서 응답이 안돼어 리턴된 메시지.

 

▶ 554 delivery error: dd Sorry, your message tobk6218@yahoo.co.krcannot be delivered.  This account is over quota. - mta111.mail.yahoo.co.kr

 ; 수신자의 메일함 용량 초과로 인해 리턴된 메시지.

 

▶ 554 5.1.0 Sender Denied

 ; 발신자의 계정을 수신서버에서 수신 거부함.

 

▶ 554 <jhbaek@st.com>: Recipient address rejected: Access denied

 ; 수신자가 발신자의 계정에 대해 수신 거부를 설정함.

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 때찌1

헤더는 매우 다양한 구성요소가 있습니다. 메시지를 전달하기 위해 반드시 필요한 것도 있고 꼭 필요하지 않은 것도 있습니다. 또 어떤 헤더는 여러분이 입력하지 않아도 자동으로 입력되는 것도 있습니다. 자동으로 입력되는 헤더는 다시 메일/뉴스 프로그램이 직접 기록하는 것과 서버에서 직접 기록하는 것이 있습니다.

자신이 직접 입력할 수 있는 헤더

자신이 직접 입력할 수 있는 헤더는 주로 메일 프로그램에서 새 메시지를 작성할 때 입력할 수 있는 항목과 프로그램의 설정 항목에서 작성한 내용입니다. 프로그램의 설정 항목에 기록한 내용은 이메일을 보낼때마다 자동으로 헤더에 첨부됩니다. 자신의 소속, 이메일 주소, 진짜 이름등등은 이메일을 보낼때마다 매번 기록할 필요가 없을 것입니다. 그래서 그런 것들은 프로그램 설정 항목에 기록하도록 해서 자동으로 입력할 수 있도록 하는 것입니다. 그러나 받는 사람, 제목, 참조, 숨은 참조등은 이메일을 보낼때마다 매번 바뀌는 항목이라서 매번 새롭게 입력해야 합니다.

1. 받은 사람
헤더 - To:

메시지를 보내려면 당연히 받는 사람의 주소를 적어야겠지요. To: 헤더에 아무것도 입력하지 않으면 메시지를 보낼 수 없습니다. 메일 서버는 이곳에 있는 주소로 여러분의 메시지를 보냅니다. 프로그램에서 "수신인" 또는 "받는 사람" 입력창에 입력한 내용이 To: 헤더에 기록됩니다.

2. 참조
헤더 - Cc:

Cc는 "Carbon Copy"의 약자로써 원본 메시지를 참조하는 것을 말합니다. 참조는 어떤 메시지를 여러 사람에게 보낼 때 원본 메시지와는 별도로 다른 사람이 그 메시지를 참조삼아 읽으라고 보내는 경우에 사용합니다. A라는 사람에게 보내는 메시지를 B와 C가 참조할 필요가 있다고 생각한다면 A를 받는 사람으로 지정하고 B와 C는 참조로 지정하여 메시지를 보내면 됩니다. 참조형식으로 보낸 메시지의 헤더에는 Cc: 부분에 받는 사람의 주소가 모두 표시됩니다.

3. 숨은 참조
헤더 - Bcc:

Bcc는 "Blind Carbon Copy"의 약자인데, 숨은 참조라고 합니다. 숨은 참조는 여러 사람에게 메시지를 보낼 때 누구에게 그 메시지를 보냈는지 알 수 없도록 참조인의 주소를 숨길 때 사용합니다. 참조를 나타내는 Cc: 헤더와는 달리 숨은 참조란에 기록한 주소는 헤더에 표시되지 않습니다. 100명에게 메시지를 보낼 때 참조를 이용하는 것은 좋지 못합니다. 100명은 자신에게 필요하지 않은 99명의 이메일 주소가 헤더에 포함된 이메일을 받아야할 것이니까요.

4. 제목
헤더 - Subject:

보낼 메시지의 제목을 나타내는 헤더입니다. 설령 여러분이 제목을 적지 않고 이메일을 보냈더라도 헤더는 표시됩니다. 제목을 "안녕"이라고 적었다면 "Subject: 안녕"이라고 될 것이고 제목을 적지 않았다면 단지 "Subject:"라고만 헤더에 표시될 것입니다.

프로그램의 설정 메뉴에서 기록하는 헤더

사용하는 이메일 프로그램의 설정 메뉴에서 기록한 정보는 보내는 이메일 메시지의 헤더에 자동으로 기록됩니다. 이런 정보는 늘 입력할 필요가 없는 고정된 정보입니다. 이메일을 보내며 매번 자신의 이메일 주소와 이름, 소속, 답신받을 주소를 입력할 필요는 없을 것입니다. 그런 것들은 자동으로 입력하도록 설정해 두는 것이 훨씬 편할 것입니다.

 

1. 전자 우편 주소
헤더 - From:

자신의 주소가 없다면 보낸 메시지가 잘못되었을 때 어디로 반송되어 올지 알 수 없을 것입니다. 자신의 이메일 주소를 적지 않으면 메시지를 작성할 수 없습니다. 정 주소를 밝히기 싫다면 가짜 주소라도 적어야 합니다. somebody@nonono.com 처럼 정체불명의 주소라도 적지 않으면 메시지를 작성할 수 없습니다. 아웃룩 익스프레스에서 From: 헤더를 설정하는 곳은 [계정] 메뉴에서 사용자 정보 입력창입니다. [전자 우편 주소]라는 곳에 입력한 정보가 From: 헤더에 기록됩니다.

2. 이름
헤더 - From:


자신의 이름을 적는 곳입니다. 이곳을 비워두면 메시지를 작성할 수 없습니다. 자기 이름을 입력해도 좋고, 이름을 밝히기 싫다면 가짜 이름 - 'SkyHawk'와 같은 별명이나 가짜 이름을 적어도 무방합니다. 여기에 적은 이름은 From: 헤더에 기록되어 다음과 같이 나타납니다.

From: "Lee JunYoung"
leejuy@hyowon.pusan.ac.kr

3. 회신 주소
헤더 - Reply-To:


상대방이 여러분의 이메일에 대해 회신하기 위해 이메일 프로그램의 회신 기능을 사용할 때 이곳에 적어둔 주소로 답신이 보내집니다. 회신 주소 입력창에 굳이 주소를 적지 않아도 괜찮습니다. Reply-To 헤더가 없을 경우 '전자 우편 주소'로 답신이 보내지게 됩니다.

Reply-To: "Lee JunYoung" <leejuy@hyowon.pusan.ac.kr>

자동으로 붙는 헤더

여러분이 받은 이메일의 헤더를 잘 살펴 보십시오. 그곳에는 여러분이 설정할 수 없는 헤더들이 있을 것입니다. 이런 헤더들은 대부분 센드메일에서 이메일을 주고 받으며 붙인 헤더나 여러분이 사용중인 메일 프로그램에서 붙인 헤더입니다. 이런 헤더는 여러분이 어떻게 조정할 수 없는 것들입니다.

 

1. 메일이 전달된 경로
헤더 - Received:

여러분의 편지함에 도착한 메일이 어디를 거쳐서 왔는지 표시하는 헤더입니다. [from A by B for C]라는 문장으로 이루어져 있습니다. "B라는 메일 서버를 통해 A라는 메일 서버로 전송된 이메일이다. 그리고 그것은 C에게 전달되었다."라는 내용을 담고 있습니다. 이 부분의 헤더를 잘 살펴보면 메일이 어디를 거쳐서 여러분에게 전달되었는지 잘 알 수 있습니다. 여기에 그 사람이 사용하는 컴퓨터의 이름이 표시되기도 하고, 메일 서버로 어떤 프로그램을 사용하는지, 센드메일의 버전등이 표시 됩니다. 아래는 제가 받은 메일에 포함된 Received: 헤더입니다. 이것을 잘 분석해 보십시오.

Received: from hyowon.cc.pusan.ac.kr (hyowon.cc.pusan.ac.kr [164.125.9.3])
by bora.dacom.co.kr (8.8.6/8.8.6) with SMTP id BAA11063
for <social91@bora.dacom.co.kr>; Fri, 30 Jan 1998 01:47:06 +0900 (KST)

첫 라인에서 메일이 hyowon.cc.pusan.ac.kr이라는 서버에서 보내진 것임을 알 수 있습니다. 이곳의 IP 주소는 164.125.9.3이구요. 두 번째 라인에서 메일이 bora.dacom.co.kr이라는 서버로 전달되었음을 알 수 있습니다. 그리고 이 서버는 SMTP 서버로군요. 그리고, 세 번째 라인에서 1998년 1월 30일, 금요일 오전 1시 47분에 social91@bora.dacom.co.kr이라는 사용자에게 전달되었음을 알 수 있습니다. 날짜는 여러분의 메일 서버로 메일이 도착한 시간을 의미합니다. 뒤에 얘기할 Date: 헤더는 상대방이 메일을 보낸 시간을 의미하는데 이것을 보고 메일 서버간의 전달 시간을 체크해 볼 수 있습니다. "+0900 (KST)"는 한국 표준 시각을 말합니다. 그리니치 표준시보다 9시간 빠르다는 뜻이죠?

가끔 Received: 헤더가 여러개 포함된 메시지를 발견할 수 있습니다. 곧장 자신에게 전달된 메시지가 아니라 다른 몇 개의 서버를 거쳐 전달된 경우 Received: 헤더에는 거쳐온 메일 서버들이 모두 표시됩니다. 맨 아래의 Received: 헤더가 제일 처음 메일이 발송된 곳이고 그곳에서 차례대로 위쪽으로 지나온 것입니다. 제가 구독중인 온라인 잡지인 People에서 보내온 메일의 Received: 헤더를 보십시오.

(1) Received: from hyowon.cc.pusan.ac.kr (hyowon.cc.pusan.ac.kr [164.125.9.3])
by bora.dacom.co.kr (8.8.6/8.8.6) with SMTP id CAA13191
for <social91@bora.dacom.co.kr>; Fri, 30 Jan 1998 02:10:40 +0900 (KST)

(2) Received: from listserv.pathfinder.com ([204.71.242.6]) by hyowon.cc.pusan.ac.kr (8.6.11/8.6.8)
with ESMTP id CAA14694 for <leejuy@HYOWON.PUSAN.AC.KR>;
Fri, 30 Jan 1998 02:10:39 +0900

(3) Received: (from daemon@localhost) by pathfinder.com (*private*/SMI-SVR4) id
LAA21552 for peopledaily-text@listserv.pathfinder.com; Thu, 29 Jan
1998 11:44:40 -0500 (EST)

3개의 Received: 헤더가 있습니다. 여러분은 이것을 보고 어떤 정보를 얻을 수 있습니까?

(3) 의 Received: 헤더를 보세요. pathfinder.com이라는 컴퓨터에서 listserv.pathfinder.com이라는 컴퓨터에게 메일을 보내도록 지시했음을 알 수 있습니다. pathfinder.com이라는 컴퓨터는 People지의 메인 컴퓨터입니다. 여기서 온라인 신문을 구독하는 사람들을 위해 신문을 작성합니다. 그리고 실제로 메일을 보내는 컴퓨터인 listserv.pathfinder.com이라는 컴퓨터로 메시지를 보내면 이 컴퓨터가 메일 발송작업을 하는 것입니다. 메일은 미국 동부 표준시(EST) 1998년 1월 29일 오전 11시 44분에 전세계 온라인 People 구독자에게 발송되었습니다.

(2) 의 Received: 헤더에서 이 메시지가 한국 시각 1월 30일 오전 2시 10분 39초에 hyowon.pusan.ac.kr이라는 컴퓨터로 도착했음을 알 수 있습니다. 이 컴퓨터는 제가 학교에서 사용하는 계정이 있는 컴퓨터입니다. 이 주소로 도착한 메일은 즉시 bora.dacom.co.kr이라는 컴퓨터로 돌려 보내도록 설정해 두었죠.

(3)의 Received: 헤더에서 한국 시각 1월 30일 오전 2시 10분 40초에 bora.dacom.co.kr로 메시지가 도착했음을 알 수 있습니다.

메일을 보내고 받은 시각은 센드 메일에서 그리니치 표준시로 계산합니다. +0900 (KST)는 한국 표준 시각이 그리니치 표준시보다 9시간 빠르다는 말입니다. 결국 메일이 미국 동부의 People 메인 컴퓨터에서 social91@bora.dacom.co.kr까지 전달되는데 약 26분이 걸린 것을 알 수 있습니다.

Received: 헤더를 통해 여러분은 이렇게 메일이 전달되는 경로를 알 수 있을 뿐만 아니라 메일의 전달과정에 문제가 생겼을 때 도움을 받기도 합니다. 만약 메일이 전달되는 과정에서 매우 시간이 많이 걸렸거나 또는 데이터의 손실이 발생했다면 Received: 헤더를 참조하여 중간에 어떤 메일 서버를 경유했는지 확인할 수 있습니다. 그리고 그 메일 서버가 문제가 있는지 조사해 보거나 서버 담당자에게 문의할 수 있습니다. 만약 여러분이 메일을 주고 받는 메일 서버의 센드메일 버전이 너무 낮아 메일이 깨지는 문제가 발생한다면 다른 곳으로 서비스를 옮기는 것을 고려할수도 있습니다.

2. 메시지 아이디
헤더 - Message-ID

이 헤더는 메일 서버에서 메시지를 외부로 보내며 붙이는 일련번호입니다. 메시지 아이디는 다음과 같이 표시됩니다.

Message-ID: <199801291644.LAA21552@pathfinder.com>

여러분은 이것을 통해 단지 그 메시지가 어떤 컴퓨터에서 보내졌는지 알 수 있습니다. 그러나, '@' 앞에 적혀있는 이상한 문자열은 여러분을 위한 것이 아니라 컴퓨터가 그 메시지에 임의로 붙인 번호표입니다.

3. 보낸 날짜
헤더 - Date

메일을 보낸 날짜를 표시하며 다음과 같은 형식으로 표시됩니다.

Date: Thu, 29 Jan 1998 02:37:50 -0800 (PST)

시간을 표기하는 방식은 24시간 표기방식으로 마지막에 그리니치 표준시를 표시합니다. 이것을 보고 그 컴퓨터가 위치한 지역을 대략 예상해 볼 수 있습니다. 예문에 제시된 PST(Pacific Standard Timezone)는 태평양 표준시로써 미국과 캐나다에서 사용하는 표준 시간대를 의미합니다. Date: 헤더는 서버에서 직접 붙이는 경우가 있고, 사용자의 컴퓨터 시간을 따르는 경우가 있습니다. 계정에 접속하여 PINE을 통해 메일을 보내면 Date 헤더에 서버의 시계에 맞춰서 Date: 헤더가 붙습니다. 그러나, 아웃룩 익스프레스를 이용하여 메일을 보낼 경우 사용자의 컴퓨터에 있는 시계에 맞춰서 Date 헤더가 붙게 됩니다.

Received: 헤더에 나와있는 시각이 실제로 서버에 메일이 도착한 시간이라면 Date: 헤더는 메일 프로그램에서 메일이 보내진 시각을 의미합니다.

4. MIME 헤더

MIME이란 멀티미디어 메일을 위한 인터넷 표준 규약입니다. 여러분이 MIME 표준을 지원하는 메일 프로그램을 사용하며 'MIME을 사용하여 메일 보내기' 옵션을 설정하면 다음과 같은 헤더를 볼 수 있습니다.

가) MIME-Version: 1.0
MIME의 버전을 나타냅니다.

나) Content-Type:

Content-Type: 헤더는 메일 본문이 어떤 형식인지 알려 줍니다.
text/plain - 일반 문자열을 사용한 본문
multipart/ - 일반 문자열과 다른 여러 가지 인코딩 방식이 섞여 있을 경우 multipart/mixed는 일반 텍스트에 파일을 첨부했을 경우에 사용합니다. multipart/alternative는 똑같은 내용이 일반 텍스트와 html로 반복되어 있어서 둘 중 하나를 선택해서 읽을 수 있을 경우에 사용합니다. multipart/related 는 HTML 형식의 메시지를 보내며 배경그림을 첨부했을 때 사용됩니다.

다) charset="euc-kr"
charset= 부분은 본문이 어떤 언어로 작성되었는지를 나타냅니다. Content-Type 헤더에 함께 나타납니다. 한글 메일의 경우 euc-kr이란 문자셋이 표시되어야 합니다.

라) Content-Transfer-Encoding:
본문이 인코딩된 방식을 표시합니다. 한글 메시지에 8비트라고 표시되어 있으면 인코딩없이 본문을 그대로 보낸 것입니다. BASE64라든가 Quoted Printable라고 적혀 있으면 그런 방식으로 인코딩을 했다는 의미입니다.

제 멋대로 붙인 헤더

헤더는 철저히 규칙에 맞게 붙여야 합니다. 만약 헤더를 마음대로 붙인다면 컴퓨터간에 메시지 전송이 이루어질 수 없기 때문입니다. 어떤 컴퓨터는 O.K를 '좋다'는 뜻으로 이해하는데 다른 컴퓨터는 O.K를 '엉망이다'라는 뜻으로 이해하면 어떻게 되겠습니까?

그런데, 이런 엄격한 규칙을 가진 헤더지만 제 멋대로 붙일 수 있는 헤더도 있습니다. 'X-'라는 문자열로 시작하는 헤더가 그런 경우입니다. 이런 헤더는 메일 서버에서 신경을 쓰지 않고 그냥 넘겨 버립니다. 신경을 쓰지 않기 때문에 이런 헤더에 무슨 내용을 쓰더라도 메일의 전송에 영향을 끼치지 않습니다. 아웃룩 익스프레스를 사용하여 보낸 메일에는 이런 'X-'가 붙은 헤더를 몇 개 볼 수 있습니다.

X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook Express 4.72.2106.4
X-MimeOLE: Produced By Microsoft MimeOLE V4.72.2106.4

이 헤더들은 아웃룩 익스프레스라는 프로그램이 임의로 붙인 헤더입니다. 이런 헤더들은 인터넷의 표준이 아닐뿐더러 표준으로 인정받을 필요도 없습니다. 그렇기 때문에 'X-'라는 헤더를 사용한 것이죠.

'X-' 헤더는 매우 다양한 목적으로 사용될 수 있는데, 예문에서 볼 수 있듯이 메일 프로그램을 헤더에 표시하는데 사용되기도 합니다. X-Mailer: 헤더를 통해 메일이 어떤 프로그램을 사용하여 보내졌는지 표시하고 있습니다. X-MimeOLE: 는 메일에 포함된 바이너리 파일을 윈도우의 OLE와 연결시키는 것에 대한 헤더입니다.

또는 그 메일 프로그램이 제공하는 특별한 기능을 표시하기 위해 사용되기도 합니다. 예문에 있는 X-Priority: 헤더와 X-MSMail-Priority: 헤더는 아웃룩 익스프레스를 사용하는 메일에만 붙습니다. 이것은 메일의 보내며 중요도를 설정할 때 나타납니다.

중요도 설정에 따라 헤더의 내용이 달라집니다.

중요도X-MSMail-PriorityX-Priority
높 음High1
보 통Normal3
낮 음Low5

중요도가 높게 설정된 메시지를 받으면 메시지 표시 창에 느낌표(!)가 표시되어 그 메시지가 중요한 것임을 표시합니다. 이것은 단지 아웃룩 익스프레스에서 제공하는 특별한 기능일 뿐 메일 암호화라든가 보안문제를 해결하는 기능은 아닙니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 때찌1
Major JavaMail API Components



*Message Class

Message 클래스는 mail message의 내용과 attribute의 집합으로 정의된 abstract class이다.

사용자 삽입 이미지


이 클래스의 attribute로는 content type을 포함하는 content를 정의하고 메일주소에 관련된

정보를 명시하고 있다.

content는 실제데이터를 감싸고 있는 DataHandler object에 의해 표현되어지며,

이 Message class는 Super class인 Part interface를 구현하고 있다.

이 Part 인터페이스는 Message object를 전달하기 위한 형태와 속성들이 정의되어져 있는 클래스이며,

Message클래스에는 From, To, Subject, Reply-To와 다른 속성들을 추가할수 있다

Message의 내용은 byte의 집합 또는 byte집합을 참조하는 Message object안에서 추상화되는데

사실 JavaMail은 message 내용에 대한 어떤 형태나 정보도 가지고 있지 않기 때문에 Message object를

사용하여  중간계층(intermediate layer- 즉 JavaBeans Activation Framework(JAF))과 통신을 하게 된다.

또한 JavaMail API에서는 multipart Message 객체들을 지원하기 위해여 자신만의 attribute와 content를

정의할수 있는 BodyPart클래스를 지원하고 있다.


메시지의 저장과 검색

일반적으로 메시지는 Folder객체 안에 저장되게 된다. Folder객체는 메시지 뿐만 아니라 트리구조와
 
같은 subfolder들을 포함하고 있다.

Folder 클래스는 메시지를 fetch(가져오기), append(추가하기), copy(복사하기), delete(삭제하기)를
 
할수 있는 메소드를 제공하며 컴포넌트로 event를 보낼수도 있으며, 
 
event listener를 등록시킬수도 있는 특성을 가지고 있다.

Store클래스는 folder안에 저장되어있는 메시지들을 검색하고 folder를 access할수 있는

access protocol을 명시하고 있다.

이 클래스는 또한 데이터베이스 (메일저장소)와 연결하고, 메시지를 fetch하며,
 
연결(connection)을 끊을 수 있는 메소드들을 제공하고 있다.

Mail Service Provider들은 이 Store클래스를 subclassing함으로서 메시지를 읽어낼수 있는

프로토콜(IMAP4, POP3등등)들을 구현할수 있게 만들고 있다.


*메시지의 조합과 전달

클라이언트는 Message를 적절하게 subclassing한후 객체화에 의하여 새로운 메시지를 생성하도록 한다.

그 클래스로 하여금 Message객체로 수신인주소, 제목, 내용 등의 속성값들을 세팅시키도록 한다음

Transport.send()메소드를 호출함으로서 조합된 메시지의 내용을 수신인에게 전달하도록 한다.

Transport 클래스는 목적지 주소로 메시지를 전달하기 위한

transport agent(전달을 위임한)로서 만들어진다.

이 클래스는 여러명의 수신인에게 메시지를 보내기 위한 메소드를 제공하고 있는데,

Transport클래스의 send메소드가 그 역할을 한다.


* Session 클래스

Session클래스는 network과 메일을 사용할수 있는 클라이언트사이의 인터페이스를 전역적이며 사용자

각각에 맞게 특성(property)을 정의한 클래스이다.

이 Session객체는 JavaMail 컴포넌트에서는 없어서는 안되며, 어떤 특수한 속성값들을 세팅시키거나

얻어오기 위해여 이 Session객체를 사용한다.

Session클래스는 또한 세션객체(사용자)를 인증한다거나 desktop application을 공유할수 있게 할수도 있다.

그리고 이 클래스는 final concrete클래스로서 subclass시킬수 없다는 특성을 가지고 있다.


*JavaMail Event Model

JavaMail event모델은 JavaBeans 스펙에 정의된 JDK1.1 event모델 스펙을 따르고 있다.

(왜냐면 앞서 언급했던봐야 같이 JDK1.1.X버전이후 사용가능하기 때문이다)

JavaBean 스펙에서는 naming event, event methods, event listener등록에 대한

desing pattern을 정의하고 있다.

모든 JavaMail event는 MailEvent로부터 상속을 받고 있다. 클라이언트는 자신을 위하여 event를 위한

listener를 등록시킴으로서 event를 기다릴수 있다.

Event는 세션이 진행되면서 변하는 상태를 listener측으로 알리도록 하고 있다.

JavaMail에서는 Store, Folder 그리고 Transport클래스들이 그러한 event 소스들이다.

Session/Message/Address Class* Session Class세션클래스는 자바메일 기본에 정의된 클래스이다. 이 세션을 통해서 많은 일을 할수 있는데,해당 객체는 메일서버, 사용자 정보, 패스워드 등의 정보를 java.util.Properties클래스에 의해 얻어올 수가 있다. Properties클래스의 내용과 사용법은 자바기본의 Property사용법에 대하여 참조하라.클래스의 생성자는 private형태로 되어있으며(즉 singlton pattern이란 이야기겠죠?) 하나의 기본세션을 getDefaultInstance()메소드에 의하여 공유할수 있게된다.세션을 얻어내는 예를 들어보면 Properties props = new Properties();Session session = Session.getDefaultInstance(props, null); 처럼 사용할수도 있으며, 하나의 유일한 세션을 생성한다면 getInstance()메소드를   사용할수도 있을것이다.Properties props = new Properties();// fill props with any informationSession session = Session.getInstance(props, null);getInstance(prop, null)에서 두번째 parameter인 null은 javax.mail.Authenticator 클래스를 지칭하는데 null값을 사용한다면 인증을 사용하지 않겠다는 이야기로 보면 된다. Authenticator는 나중에 알아보도록 하자.*Message Class세션이 생성되었다면 이제 메일을 보내기 위해 메시지를 생성할 시점이 된것이다.Message클래스의 형태를 살펴보면, 전편에서도 이야기 했듯이 abstact class로 되어 있으며, 대부분의 경우 javax.mail.internet.MimeMessage를 subclassing하여 사용한다.MimeMessage는 서로 다른 RFC프로토콜 상에서 정의되는 MIME타입과 header를 인식할수 있는 email message를 가르킨다.메시지의 헤더정보는 반드시 US-ASCII코드로 제한되어 있으므로 non-ASCII(한글표현의 경우)의 경우에는 헤더필드에 포함되어 있는 내용을 encode하여야 메시지를 제대로 볼수 있다.Message를 생성할때는 MimeMessage의 생성자에 session객체가 argument로 들어가게 된다.MimeMessage message = new MimeMessage(session);위의 것 이외의 다른 생성자에는 RFC-822 형태로 된 input stream으로부터 MimeMessage를 생성할 수도 있다.이제 순서에 따라 메시지를 생성하게 되면, 해당 객체를 이용하여 메시지 각각의 부분을 세팅할수 있는 준비가 다 된것이다. 했던 얘기 계속 또 나오는 것이지만 Message는 Part를 구현한 클래스이고,MimeMessage는 MimePart를 구현한 클래스라고 설명했다.기본적인 방법은 content를 위한 argument와 mime type을 setContent()메소드를 아래처럼 사용하여 세팅시키는 일이다.message.setContent("Hello", "text/plain");위의 형태처럼 content를 조합할수도 있겠지만 setText()메소드를 사용해도 무방하다. 왜냐하면 Message에서 기본 MIMIE type은 text/plain을 따르고 있기 때문이다.사용법을 보자.message.setText("Hello"); // equals ->message.setContent("Hello", "text/plain");content를 세팅시킨후에는 제목을 넣어야 할것인데 그것은 아래의 메소드를 사용하여 만들수 있다.message.setSubject("First");!!!!!!!!!!!!!!!!!!자 이제 제목까지 넣었으면 다음에 무엇을 해야 할까??누구에게 메일을 보낼것인가~~!메일 받는 사람을 세팅시켜야 할것이다.*Address Class위의 순서에 따라 세팅이 되어 있을것이다.Session의 생성 --> Message의 생성Message클래스처럼 Address클래스도 abstract클래스이다. 여러분이 메일을 보내기 위해서는javax.mail.internet.InternetAddress class를 사용해야 한다.주소를 생성하기 위해 해당 InternetAddress클래스에 email address만 argument로 세팅해도 된다.Address address = new InternetAddress("president@chungwadae.go.kr");만약 email주소와 받는 사람의 이름까지 명시하고 싶다면 다음과 같이 생성하면 될 것이다.Address address = new InternetAddress("president@chungwadae.go.kr", "노무현");위 경우처럼 받을 사람의 주소값이 생성이 되었다면 그 내용을 두 가지 방법을 통하여 전달시킬수가 있는데, 그 메소드는 setFrom() 과 setReplyTo() method이다.message.setFrom(address)만약에 여러사람에 메시지를 보내고 싶다면 주소의 배열객체를 만들어 addFrom() 메소드를 이용하여 message객체에 값을 세팅시킬 수도 있다.Address address[] = {"ienvyou@orgio.net", "febkang@orgio.net","specular@netsgo.com"};message.addFrom(address);이렇게 메시지에 대한 수취인이 정해졌다면 addRecipient() method를 사용할수 있는데 이 메소드는 주소값옆에서 Message.RecipientType 을 명시하여야 한다.message.addRecipient(type, address)해당 수취인의 Type에는 세가지가 있으며 아래와 같다.Message.RecipientType.TO Message.RecipientType.CC Message.RecipientType.BCC Address toAddress = new InternetAddress("president@chungwadae.go.kr");Address ccAddress = new InternetAddress("first.lady@chungwadae.go.kr");message.addRecipient(Message.RecipientType.TO, toAddress);message.addRecipient(Message.RecipientType.CC, ccAddress);자바메일은 email 주소가 유효한지를 체크하는 메커니즘이 없다. 만약 체크를 하고 싶다면 프로그램을 짜는 여러분이 메소드를 만들어서 문법에 맞는 email 주소인지를 체크해내야 할것이다.
Authenticatorjava.net 패키지에도 Authenticator도 있다. JavaMail API는 java.net패키지처럼 사용자이름과 패스워드정보등을 통해 자원에 접근하게 하는 장점도 가지고 있다.여기서 말하는 자원(resource)는 즉 메일 서버를 말하는 것인데, Authenticator는javax.mail 패키지에 정의되어 있다(당근 java.net패키지와는 다르다)Authenticator를 사용하기 위해서는 해당 Authenticator클래스를 상속한 PasswordAuthenticator클래스로부터 인스턴스를 생성하고 getPasswordAuthentication() 메소드를 리턴시켜야 한다.Authenticator를 사용하기 위해서는 반드시 세션을 생성하여 사용해야 하며, 인증이 필요한경우 해당 세션이 Authenticator에게 인증시도를 통보하게 된다.인증시에는 환경설정파일에 저장되어 있는 username과 password 또는 윈도우의 팝업창을 띄움으로서 해당값을 입력받게 되고, PasswordAuthentication의 객체를 리턴할수 있도록 한다.Properties props = new Properties(); // 프로퍼티 생성Authenticator auth = new MyAuthenticator();  // Authenticator를 상속받은 클래스객체의 생성Session session = Session.getDefaultInstance(props, auth); //세션생성class MyAuthentication extends Authenticator {    PasswordAuthentication pa;    public MyAuthentication(){        pa = new PasswordAuthentication("your_id","your_password");    }    public PasswordAuthentication getPasswordAuthentication() {        return pa;    }}위의 내용이 필요할 경우 세션객체에 인증을 해야된다는 걸 시스템측으로 통지하기 위해 props.put("mail.smtp.auth","true");라인이 반드시 들어가 있어야 한다.자.. 예전에 했던 msgsendsample클래스를 local smtp가 아닌 외부 smtp서버에 인증을 시도함으로서 사용하도록 해보겠다.
import java.util.*;import java.io.*;import javax.mail.*;import javax.mail.internet.*;import javax.activation.*;public class msgsendsample {  static String msgText = "This is a message body.\nHere's the second line.";public msgsendsample() {   String arg [] ={"ienvyou@orgio.net","ienvyou@openitech.co.kr", "openitech.co.kr", "true"};    System.out.println();     String to = arg[0];   String from = arg[1];   String host = arg[2];   System.out.println("babo!!");   boolean debug = Boolean.valueOf(arg[3]).booleanValue();    // create some properties and get the default Session    Properties props = new Properties();    props.put("mail.smtp.host", host);      // 반드시 프로퍼티에 세팅되어 있어야 한다. 아니면 인증을 시도하지 않는다.    props.put("mail.smtp.auth","true");       Authenticator auth = new MyAuthentication();      if (debug) props.put("mail.debug", arg[3]);    Session session = Session.getDefaultInstance(props, auth);    session.setDebug(debug);      try {    // create a message        Message msg = new MimeMessage(session);        msg.setFrom(new InternetAddress(from));        InternetAddress[] address = {new InternetAddress(arg[0])};        msg.setRecipients(Message.RecipientType.TO, address);        msg.setSubject("JavaMail APIs Test");        msg.setSentDate(new Date());        // If the desired charset is known, you can use        // setText(text, charset)        msg.setText(msgText);        Transport.send(msg);    } catch (MessagingException mex) {        System.out.println("\n--Exception handling in msgsendsample.java");        mex.printStackTrace();        System.out.println();        Exception ex = mex;        do {                if (ex instanceof SendFailedException) {                    SendFailedException sfex = (SendFailedException)ex;                    Address[] invalid = sfex.getInvalidAddresses();                    if (invalid != null) {                        System.out.println("    ** Invalid Addresses");                        if (invalid != null) {                                for (int i = 0; i < invalid.length; i++)                                 System.out.println("         " + invalid[i]);                        }                }                    Address[] validUnsent = sfex.getValidUnsentAddresses();                if (validUnsent != null) {                    System.out.println("    ** ValidUnsent Addresses");                    if (validUnsent != null) {                        for (int i = 0; i < validUnsent.length; i++)                             System.out.println("         "+validUnsent[i]);                    }                }                Address[] validSent = sfex.getValidSentAddresses();                if (validSent != null) {                    System.out.println("    ** ValidSent Addresses");                    if (validSent != null) {                        for (int i = 0; i < validSent.length; i++)                             System.out.println("         "+validSent[i]);                    }                }            }                System.out.println();                if (ex instanceof MessagingException)                  ex = ((MessagingException)ex).getNextException();               else                    ex = null;            } while (ex != null);        }    }       public static void main(String[] args) {            new msgsendsample();        }    private static void usage() {        System.out.println("usage: java msgsendsample <to> <from> <smtp> true|false");    }}class MyAuthentication extends Authenticator {    PasswordAuthentication pa;    public MyAuthentication(){        pa = new PasswordAuthentication("your_id","your_password");      // 여러분들이 사용하고 있는 smtp server의 아이디와 패스워드를 입력한다.} // 아래의 메소드는 시스템측에서 사용하는 메소드이다.    public PasswordAuthentication getPasswordAuthentication() {        return pa;    }}
Transport Class* Transport자.  지난시간까지 메일보내기에 집중하여 했는데, 오늘 뒷부분부터는 메일을 받아오는 부분에 대하여 설명을 하게 될 것이다.우선 저번 시간에 다 살펴보지 못했던 메일보내기의 Transport클래스에 대하여 살펴보도록 하자.자바메일보내기로 메일을 전송할때 가장 마지막으로 사용되는 클래스가 바로 Transport클래스이다. 이 클래스는 메시지를 보내기 위해 특정프로토콜과 대화하도록 한다.(일반적으로 SMTP) 이클래스는 추상클래스이며, Session클래스와 비슷한 일을 한다. Default는 static메소드는 send()를 이용하여 메시지를 보내게 되는데 아래와 같다Transport.send(message);위의 방법말고도 프로토콜을 위해 username, password에 관한 정보를 세션으로부터 인스턴스를 얻어와 메시지를 보내고 connection을 close()시킬수도 있는데 사용법은 아래와 같다.message.saveChanges(); // implicit with send()Transport transport = session.getTransport("smtp");transport.connect(host, username, password);transport.sendMessage(message, message.getAllRecipients());transport.close();현재 multiple메시지를 보낼때는 위의 방법이 가장 이상적이다.왜냐하면 send() static메소드의 경우 각각의 메시지를 보낼때 서버측에 매번 connection을 맺게끔 만들지만 위의 경우처럼 프로그램을 짜게 되면 하나의 Connection을 연결시켜 놓고, 메일의 메시지를 모두 보낼때까지 연결을 지속시키게 되는 장점을 가지고 있다.tip> 메일전송시 도스창에 상태를 보기 위한다면 디버그용인 session.setDebug(true)를 쓰기 바란다.아래는 위의 예제코드를 삽입시켜 만든 메일보내기 예제이다.
import java.util.Properties;import javax.mail.*;import javax.mail.internet.*;public class MailExample {  public static void main (String args[]) throws Exception {    String host = "openitech.co.kr";    String from = "ienvyou@openitech.co.kr";    String to = "ienvyou@orgio.net";    // Get system properties    Properties props = System.getProperties();    // Setup mail server    props.put("mail.smtp.host", host);props.put("mail.smtp.auth", "true");// Get session    Session session = Session.getDefaultInstance(props, null); session.setDebug(true);    // Define message    MimeMessage message = new MimeMessage(session);    // Set the from address    message.setFrom(new InternetAddress(from));    // Set the to address    message.addRecipient(Message.RecipientType.TO,       new InternetAddress(to));    // Set the subject    message.setSubject("Hello JavaMail");    // Set the content    message.setText("Welcome to 자바메일");    // Send messagemessage.saveChanges(); // implicit with send()    Transport transport = session.getTransport("smtp");    transport.connect(host, "ienvyou", "0000");    transport.sendMessage(message, message.getAllRecipients());    transport.close();}}
빨간 글씨로 코딩된 부분이 실질적인 Transport클래스의 서버인증부분이며property값에 auth플래그가 true값으로 설정되어 있어야 하는것은 예전부터 누누히 강조했던 부분이다.
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 때찌1
Prolog

요즘 자바기술을 이용하여 굉장히 많은 일들이 벌어지고 있다.

Mobile쪽을 비롯하여 일반 application 및 대형 Enterprise환경까지 자바가 미치는 범위는 정말 광대하다.

여기서 시작되는 연재는 현재 J2EE(Java 2 Enterprise Edition)의 JavaMail을 다룰 것이다.

이번 연재에서 자바의 역사가 이렇다 저렇다 할수 있는 상황은 아닌것 같다.

이글을 읽는 사람은 OOP(Object Oriented Programming)의 개념을 정확히 알고 있어야 할것이다.

J2EE쪽 환경이라면 우선 기본적인 지식을 갖추어야 하지만 본 내용은 소스코드를 복사하여

여러분들의 편집기에 붙여넣고 컴파일한후 실행시켜도 돌아갈수 있게끔 만들었다.

장황한 설명은 하지 않겠다. 이제 interface의 진수를 맛보도록 하자.


Content(1부)

  1. Mail Attachment


  2. 첨부파일 메일보내기 소스보내기


  3. 첨부된 내용가져오기


  4. HTML이 포함된 메일 및 이미지 첨부하여 보내기






#######################################################
# Java Mail API 1.2를 이용한 웹메일 시스템의 구현.  #
#######################################################

▶파일 첨부하여 보내기(한글깨짐 처리)

파일첨부는 일반 텍스트파일, 이미지등을 메일의 메시지와 같이 조합하여 보내는 방법이다.

일반적인 Eudora나 pine같은 프로그램처럼 JavaMail API또한 메시지에 파일을 첨부하여 보낼수

있는 기능을 제공한다.

1. 파일 보내기

파일보내는 것도 메시지를 보내는 것과 마찬가지로 Part인터페이스들을 사용한다.

각각의 첨부를 조합하기 위해여 DataHandler인터페이스를 사용하여 다른 part부분에 첨가시켜야 한다.

만약 메일에 파일을 첨부하고자 한다면 FileDataSource 클래스를 사용하여 메일에 첨부하여야 할것이다.

또한 URL을 사용하고자 한다면 URLDataSource를 사용하도록 한다.

우선 BodyPart객체를 생성한 후에 DataSource객체를 생성하도록 한다.

DataSource를 객체로 가지게 되었다면, 그 DataSource 객체를 DataHandler의 생성자에

argument값으로 값을 넘기게 하여야 하고, BodyPart객체의 setDataHandler()메소드를

사용하여 DataHandler를 넘기도록 한다.

마지막으로 할일은 BodyPart의 setFileName()메소드를 이용해서 원래 보내고자하는

파일의 이름을 명시하도록 세팅시키면 된다. 모든 순서코드의 내용은 아래와 같다.

// 보낼 메시지의 선언.
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO,
  new InternetAddress(to));
message.setSubject("Hello JavaMail Attachment");

// 첫번째 Message BodyPart의 생성
BodyPart messageBodyPart = new MimeBodyPart();

// 보낼 내용의 세팅
messageBodyPart.setText("Pardon Ideas");

// 첫번째 메시지 내용의 부분을 multiPart에 첨가한다.
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);

// 두번째 부분의 결합(파일 첨부코드)
messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
multipart.addBodyPart(messageBodyPart);

// 결합된 두개의 part를 메시지의 content에 세팅하도록 한다.
message.setContent(multipart);

//메시지 보내기
Transport.send(message);


만약 파일보내기 예제를 서블릿 프로그램으로 코딩하게 된다면 파일을 업로드할수 있는

html태그인 multipart/form-data를 사용할수 있다.

<FORM ENCTYPE="multipart/form-data" method=post action="/myservlet">
  <INPUT TYPE="file" NAME="thefile">
  <INPUT TYPE="submit" VALUE="Upload">
</FORM>

NOTE>메시지의 크기는 JavaMail API가 아닌 SMTP서버의 한계값이 기준이다.

아래의 프로그램은서버에 자신의 아이디와 패스워드를 인증하는

부분에서 또 다른 방법을 보여준다.


ConnectionListener라는 것과 TransportListener라는 인터페이스를 상속받아 사용하는 것을 보여주고 있다.

여러분들에게 optional하게 보여주기 위해 만든 코드이니 참조하기 바라며

중간에 한글파일첨부시 파일이름이 깨지는 문제를 해결한 코드를 집어넣었다.

File Attatchment Mail Source Code
Source Code :
import java.util.*;import java.io.*;import javax.mail.*;import javax.mail.internet.*;import javax.activation.*;import javax.mail.event.*;public class sendfile  implements ConnectionListener, TransportListener{    public static void main(String[] args) {            if (args.length != 5) {                System.out.println("usage: java sendfile <to> <from> <smtp> <file> true|false");                System.exit(1);            }            String to = args[0];            String from = args[1];            String host = args[2];            String filename = args[3];            String bcc = "ienvyou@javapattern.info";            boolean debug = Boolean.valueOf(args[4]).booleanValue();            String msgText1 = "보내졌습니까?\n";            String subject = "파일보내기 예제";                        // create some properties and get the default Session            Properties props = System.getProperties();            props.put("mail.smtp.host", host);            props.put("mail.smtp.auth" , "true"); //아주 중요 없으면 인증을 시도할수가 없다.                        Session session = Session.getDefaultInstance(props, null);            session.setDebug(debug);                        sendfile sf = new sendfile();            sf.go(session, to, bcc, from, subject, msgText1, filename );    }    public void go(Session session,                         String to,                         String bccc,                         String from,                         String subject,                         String msgText1,                         String filename){            Transport trans = null;            try {                // create a message                MimeMessage msg = new MimeMessage(session);                msg.setFrom(new InternetAddress(from));                InternetAddress[] address = {new InternetAddress(to)};                InternetAddress [] cc = {new InternetAddress("ienvyou@javapattern.info")};                InternetAddress [] bcc = {new InternetAddress("ienvyou@javapattern.info")};                msg.setRecipients(Message.RecipientType.TO, address);                msg.setRecipients(Message.RecipientType.CC, cc);                msg.setRecipients(Message.RecipientType.BCC, bcc);                msg.setSubject(subject);                // create and fill the first message part                MimeBodyPart mbp1 = new MimeBodyPart();                mbp1.setText(msgText1);                // create the second message part                MimeBodyPart mbp2 = new MimeBodyPart();                    // attach the file to the message                FileDataSource fds = new FileDataSource(filename);                mbp2.setDataHandler(new DataHandler(fds));            // 헤더에 파일이름을 세팅할때 base64형태로 반드시.                mbp2.setFileName(MimeUtility.encodeText(fds.getName(), "euc-kr","B"));                  // create the Multipart and its parts to it                Multipart mp = new MimeMultipart();                mp.addBodyPart(mbp1);                mp.addBodyPart(mbp2);                // add the Multipart to the message                msg.setContent(mp);                // set the Date: header                msg.setSentDate(new Date());                        /************** Carouser Adding *************************************/                msg.saveChanges(); // msg객체에서 데이터를 보낼수 있도록 속성변경                // 인증을 시도하도록 한다.                trans = session.getTransport(address[0]);                // register ourselves as listener for ConnectionEvents                 // and TransportEvents                trans.addConnectionListener(this);                trans.addTransportListener(this);                 // connect the transport                trans.connect("openitech.co.kr","ienvyou","0000");                               // send the message                //Transport.send(msg);                trans.sendMessage(msg, address);                            } catch (Exception mex) {                mex.printStackTrace();                            } finally {                try{                    trans.close();                }catch(MessagingException e){}            }    }     // implement ConnectionListener interface    public void opened(ConnectionEvent e) {        System.out.println(">>> ConnectionListener.opened()");    }    public void disconnected(ConnectionEvent e) {}    public void closed(ConnectionEvent e) {        System.out.println(">>> ConnectionListener.closed()");    }    // implement TransportListener interface    public void messageDelivered(TransportEvent e) {        System.out.print(">>> TransportListener.messageDelivered().");        System.out.println(" Valid Addresses:");        Address[] valid = e.getValidSentAddresses();        if (valid != null) {            for (int i = 0; i < valid.length; i++)             System.out.println("    " + valid[i]);        }    }    public void messageNotDelivered(TransportEvent e) {        System.out.print(">>> TransportListener.messageNotDelivered().");        System.out.println(" Invalid Addresses:");        Address[] invalid = e.getInvalidAddresses();        if (invalid != null) {            for (int i = 0; i < invalid.length; i++)             System.out.println("    " + invalid[i]);        }    }    public void messagePartiallyDelivered(TransportEvent e) {    // SMTPTransport doesn't partially deliver msgs    }}
mbp2.setFileName(MimeUtility.encodeText(fds.getName(), "euc-kr","B")); // 헤더에 파일이름을 세팅할때 base64형태로 반드시 파일이름을 변환시켜준다.
Get Attatchment##################################################### Java Mail API 1.2를 이용한 웹메일 시스템의 구현.  #####################################################첨부된 내용 가져오기메시지와 함께 첨부되어 있는 내용들을 가져오는 것은 보낼때처럼 일반적인 MIME의 개념으로 생각해서는 안된다. 메시지의 내용부분이 첨부된 내용들을 가지고 있을때 Multipart 객체를 사용해야 하는데 이 때 각각에 대하여 메시지의 내용과 첨부(attachement)에 대한 서로 다른 프로세스를 정의해줘야 한다.만약 어떤 첨부된 내용이 있다면 각각의 Part들은  part.getDispostion()메소드로부터 Part.ATTACHMENT의 속성을 가지고 있어야 한다. 어쨌든 첨부되는 내용은 또한 non-text MIME형태일수도 있고, Part.INLINE형태일수도 있다.결국 INLINE형태나 ATTACHMENT를 Part가 가지고 있다면 getFileName()과 getInputStream()을 이용하여 파일의 내용을 빼내어야 할것이다아래쪽의 코드를 한번 보도록 하자.Content의 내용을 Multipart로 가져온 후 여러개의 part가 메시지의 content에 포함되어져 있다면 각각의 bodyPart들 part인터페이스의 형태로 담도록 한다.그리고 각각의 part에 대하여 getDisposition()메소드를 호출하여, ATTACHMENT속성이나 INLINE속성을 가지고 있다면 파일의 내용을 빼낼수 있도록 코딩하면 된다.Multipart mp = (Multipart)message.getContent();for (int i=0, n=multipart.getCount(); i < n; i++) {  Part part = multipart.getBodyPart(i));  String disposition = part.getDisposition();  if ((disposition != null) &&       ((disposition.equals(Part.ATTACHMENT) ||        (disposition.equals(Part.INLINE))) {    saveFile(part.getFileName(), part.getInputStream());  }}saveFile()메소드는 파일이름과 스트림으로부터 byte들을 읽는 코드를 넣으면 된다.만약 해당 파일이 이미 존재한다면 파일이름의 끝에 숫자를 붙여서 변환시키게 된다.//  saveFile()코드File file = new File(filename);for (int i=0; file.exists(); i++) {  file = new File(filename+i);}위의 코드같은 경우는 단순히 message part들의 플래그 값이 타당했을 경우만 사용되어 질수 있는데, 모든 경우를 따진다면 아래의 코드처럼 disposition이 null일 경우와 handle에 따라서 part의 MIME타입을 얻어야 한다.if (disposition == null) {  // Check if plain  MimeBodyPart mbp = (MimeBodyPart)part;  if (mbp.isMimeType("text/plain")) {    // Handle plain  } else {    // Special non-attachment cases here of image/gif, text/html, ...  }...}
Sending HTML / Image MailHTML메시지 및 Image보내기HTML을 메시지로 보내는 것은 text 메시지를 보내는 것보다 조금 더 간단하게 이루어 낼수 있다. 특정값만 세팅하면 되기 때문인데, 받는 쪽에서 해당되는 contentType에 따라 메시지를 html로 해석할지 아니면 일반 text로 해석할지를 결정하기 때문에 보내는 쪽에서 message의 setContent() 메소드로 원하는 타입만 세팅하면 그만이다.예> String htmlText = "<H1>Hello</H1>" +   "<img src=\"http://www.jguru.com/images/logo.gif\">"; message.setContent(htmlText, "text/html"));메시지를 수신하는 측에서 모두 받았을때, JavaMail API는 HTML메시지를 표현하기 위하여 아무런 일을 하지 않아도 된다. 단순히 보기 위해 Swing의 JEditorPane이나 HTML을 볼수 있는third-Party 컴포넌트만 있으면 되기 때문이다.예로서 JEditorPane예제를 메일에 포함시켜 놓은 코드이다.if (message.getContentType().equals("text/html")) {  String content = (String)message.getContent();  JFrame frame = new JFrame();  JEditorPane text = new JEditorPane("text/html", content);  text.setEditable(false);  JScrollPane pane = new JScrollPane(text);  frame.getContentPane().add(pane);  frame.setSize(300, 300);  frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);  frame.show();}================================이번에는 메일이 이미지를 포함시켜 전송하는 방법에 대하여 알아보자.HTML을 이용하여 메시지를 모두 보냈다면 사실 궁금한 것이 이미지를 어떻게 메시지내용안에 포함시켜 전송해야 할것인가에 대한 것인데, 이러한 이미지의 전송은 cid URL, 즉 image를 첨부할때 content-ID header를 참조하는 특별한 태그에 의해서 이미지를 조작하여 보낼수 있는 기능을 제공한다.이미지 첨부에 대한 처리는 메시지에 파일을 포함하는 것과 비슷하며, 단지 다른 것이라고는 MimeMultiPart의 생성자들에게 subType들이 세팅되어지고 img태그를 사용해서 이미지가 Content-ID header에 세팅되어진다는것을 반드시 알려야 한다. 아래의 코드가 바로 그것을 구현해 놓은 코드이다.String file = ...;// Create the messageMessage message = new MimeMessage(session);// Fill its headersmessage.setSubject("Embedded Image");message.setFrom(new InternetAddress(from));message.addRecipient(Message.RecipientType.TO,   new InternetAddress(to));// message part를 생성한다.BodyPart messageBodyPart = new MimeBodyPart();String htmlText = "<H1>Hello</H1>" +   "<img src=\"cid:memememe\">";messageBodyPart.setContent(htmlText, "text/html");// Multipart를 생성한다.MimeMultipart multipart = new MimeMultipart("related");multipart.addBodyPart(messageBodyPart);// 이미지를 위한 part를 생성한다.messageBodyPart = new MimeBodyPart();// 이미지를 가져와 part에 포함시킨다.DataSource fds = new FileDataSource(file);messageBodyPart.setDataHandler(new DataHandler(fds));messageBodyPart.setHeader("Content-ID","memememe");//  multi-part에 추가시킨다.multipart.addBodyPart(messageBodyPart);// 메시지와 multipart를 결합시킨다.message.setContent(multipart);아래는 소스코드이다.
import java.util.Properties;import javax.mail.*;import javax.mail.internet.*;import javax.activation.*;public class HtmlImageExample {  public static void main (String args[]) throws Exception {   new HtmlImageExample();  }  public HtmlImageExample() throws Exception {    String host = "orgio.net";    String from = "ienvyou@javapattern.info";    String to = "specular@netsgo.com";    String file = "logo.gif";    // Get system properties    Properties props = System.getProperties();    // Setup mail server    props.put("mail.smtp.host", host);  props.put("mail.smtp.auth","true"); Authenticator auth = new MyAuthentication();    // Get session    Session session = Session.getDefaultInstance(props, auth); session.setDebug(true);    // Create the message    Message message = new MimeMessage(session);    // Fill its headers    message.setSubject("Embedded Image");    message.setFrom(new InternetAddress(from));    message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));    // Create your new message part    BodyPart messageBodyPart = new MimeBodyPart();    // Set the HTML content, be sure it references the attachment    String htmlText = "<H1>Hello</H1>" +       "<img src=\"cid:memememe\">";    // Set the content of the body part    messageBodyPart.setContent(htmlText, "text/html");    // Create a related multi-part to combine the parts    MimeMultipart multipart = new MimeMultipart("related");    // Add body part to multipart    multipart.addBodyPart(messageBodyPart);    // Create part for the image    messageBodyPart = new MimeBodyPart();    // Fetch the image and associate to part    DataSource fds = new FileDataSource(file);    messageBodyPart.setDataHandler(new DataHandler(fds));    // Add a header to connect to the HTML    messageBodyPart.setHeader("Content-ID","memememe");    // Add part to multi-part    multipart.addBodyPart(messageBodyPart);    // Associate multi-part with message    message.setContent(multipart);    // Send message Transport.send(message);  }}class MyAuthentication extends Authenticator { PasswordAuthentication pa; public MyAuthentication(){  pa = new PasswordAuthentication("ienvyou","0000"); } public PasswordAuthentication getPasswordAuthentication() {  return pa; }}
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 때찌1
Session/Store Class

원래 순서상으로 File Attachment부분부터 해야 하지만 사실 그쪽은 javax.activation패키지에

관련된 내용이라 그부분들에 대해서는 추후에 다루겠다.

* Store class & Folder class


메시지를 받아오는 것은 세션을 사용하여 메시지를 보내는 것과 거의 유사하다고 보면 된다.

어찌됐든 세션을 얻어온후에, Store객체로 서버에 접속한후

Authenticator클래스를 통해 접속하면 되기 때문이다.

Transport 클래스처럼 Store클래스를 통해서 서버에 접속할수 있는 코딩을 아래와 같이 할수 있다.

IMAP or POP3를 이용하는 경우를 세션을 통해서 모두 보여준다.

// Store store = session.getStore("imap");
Store store = session.getStore("pop3");
store.connect(host, username, password);

Store클래스를 통해 서버로 접속후Folder클래스를

통해 메시지를 얻어올수 있는데, 여기서 주의할점은 메시지를 얻어내기 전에

반드시 폴더 클래스가 열려있어야 한다.

아래는 해당 서버의 메시지를 얻어내는 방법을 코딩으로서 보여준다.

Folder folder = store.getFolder("INBOX"); // POP3의 경우 INBOX폴더 만을 가지고 있다.

folder.open(Folder.READ_ONLY);  // 읽기전용으로 폴더를 연다.

Message message[] = folder.getMessages();  // 폴더안의 메시지들을 얻어온다.

POP3를 위해 사용하는 것은 단지 INBOX폴터 뿐이다.

만약 IMAP을 사용한다면 여러개의 폴더를 얻어올수가 있다.

메시지를 읽기 위해서는 getContent()메소드를 사용하거나 writeTo()메소드를 이용하여

스트림에 content를 쓸수도 있다.

getContent()메소드는 단순히 메시지의 내용만을 꺼내오는 역할을 하지만,

writeTo()메소드는  header를 포함 내용을 얻어내는 역할을 한다.

System.out.println(((MimeMessage)message).getContent());

프로그래밍시 메일을 모두 읽었다면, folder와 store를 모두 닫아주는 내용을 아래와 같이 작성하여 한다.

folder.close(aBoolean);
store.close();

기본적으로 지금까지 설명한 7개의 클래스를 이해하는 것이 JavaMailAPI의 거의

전부라 해도 과언이 아니다. 7개 이외의 클래스들은 단지 파일첨부, 검색 등등 관련된 것인데

나중에 그것들에 대하여 알아보도록 하자.

아래의 코드는 메시지를 얻어오는 프로그램을 작성하기 위한 기본골격코드이다.
import java.io.*;import java.util.Properties;import javax.mail.*;import javax.mail.internet.*;public class GetMessageExample {  public static void main (String args[]) throws Exception {    String host = args[0];    String username = args[1];    String password = args[2];    // Create empty properties    // Get session    // Get the store    // Connect to store    // Get folder    // Open read-only    BufferedReader reader = new BufferedReader (      new InputStreamReader(System.in));    // Get directory    for (int i=0, n=message.length; i < n; i++) {       // Display from field and subject      System.out.println("Do you want to read message? [YES to read/QUIT to end]");      String line = reader.readLine();      if ("YES".equals(line)) {        // Display message      } else if ("QUIT".equals(line)) {        break;      }    }    // Close connection   }}


위의 순서를 보고서 채워넣을 수 있다면 API를 잘 활용한 코딩이 될것이다.

문제가 가까운 코딩이 아닐까?

자.. 이제 위 골격코드의 소스코드를 보도록 하자.
import java.io.*;import java.util.Properties;import javax.mail.*;import javax.mail.internet.*;public class GetMessageExample {  public static void main (String args[]) throws Exception {    String host = args[0];    String username = args[1];    String password = args[2];    // Create empty properties    Properties props = new Properties();    // Get session    Session session = Session.getDefaultInstance(props, null);    // Get the store    Store store = session.getStore("pop3");    // Connect to store    store.connect(host, username, password); //단순히 이 내용만으로도 서버로 접속한다.    // Get folder    Folder folder = store.getFolder("INBOX");// INBOX폴더로 접근한다.    // Open read-only    folder.open(Folder.READ_ONLY); // 당근읽으려면 폴더를 오픈해야 한다.    BufferedReader reader = new BufferedReader (      new InputStreamReader(System.in));    // Get directory    Message message[] = folder.getMessages(); // 폴더의 메시지를 담아온다.    for (int i=0, n=message.length; i < n; i++) {       // Display from field and subject       System.out.println(i + ": " + message[i].getFrom()[0]          + "\t" + message[i].getSubject());      System.out.println("Do you want to read message? [YES to read/QUIT to end]");      String line = reader.readLine();   //YES를 누르게 되면 해당되는 메일이 내용을 가져온다.   // 아래의 경우 POP3 INBOX폴더의 내용을 다운하지 않고 계속 가지고 있게 된다.      if ("YES".equals(line)) {        // Display message content        System.out.println(message[i].getContent());      } else if ("QUIT".equals(line)) {        break;      }    }    // Close connection     folder.close(false);    store.close();  }}


아고아고.. 쉽지 않은가?? 이제 7개 클래스에 대하여 모두 알아봤다.

이젠 무엇을 할것인가?

아직도 많이 많이 남았다.

Delete/Reply Message* Deleting Messages and Flags메시지를 삭제하는 작업은 메시지들과 연관된 플래그값을 조정함으로서 이루어진다.메시지들을 위해 서로다른 상태를 위한 각각의 플래그들이 존재하는데, 여기에는 몇가지 시스템정의 상태와 사용자정의 상태로 나눌수 있다.  미리 정의된 플래그는 inner class인 Flags.Flag클래스안에 정의되어 있다.플래그들의 리스트는 아래와 같다.Flags.Flag.ANSWERED Flags.Flag.DELETED Flags.Flag.DRAFT Flags.Flag.FLAGGED Flags.Flag.RECENT Flags.Flag.SEEN Flags.Flag.USER 위의 플래그값들은 모든 메일서버또는 provider가 제공해주지는 않는다. 예를 들면 메시지를 삭제하는 측면에서 POP프로토콜은 그러한 플래그값들을 제공해주지 않기때문이다. 새로운 메일을 체크하는 것은 POP task가 아니라 하나의 메일클라이언트이기 때문이다.만약 플래그값을 지원하는 지 알아보려면 folder클래스의getPermanentFlags()메소드를 사용하여 값을 얻어보면 된다.이제 실질적인 메시지들을 삭제하기 위해서는 DELETED플래그가 아래처럼 세팅되어져 있어야 한다.message.setFlag(Flags.Flag.DELETED, true);위의 경우처럼 하기 위해서는 당연히 folder가 READ_WRITE형태로 오픈되어 있어야 함은 물론이다.folder.open(Folder.READ_WRITE);모든 메시지에 대한 처리가 끝났다면 다시 폴더를 닫아주는 일을 처리해야 할것이다.folder.close(true);Folder의 expunge()메소드를 메시지를 삭제하기 위하여 유용하게 사용된다.(Sun의 POP3 provider는 제공하지 않는다.)플래그값을 해제시킬때에는 setFlag()메소드에 false값만 세팅시키면 된다.현재 플래그의 세팅값을 알아보려면 isSet()메소드를 사용하여 알아보면 된다.* Reply MessageMessage클래스는 reply()라는 메소드를 포함하고 있는데, 새로운 메시지를 수신자, 제목에 "Re:"를 포함하게 한다. 여기에는 메시지를 위해 어떠한 content도 추가되지 않으며, 단지 새로운 수신자를 위한 reply-to헤더 또는 from(발신인)의 정보만 복사하게 된다.  이 메소드는 true또는 false값을 가질수 있는 모든 사람에게 reply할경우에는 true값을 세팅하며, 단지 보낸 한 사람에게 reply할경우에는 false값을 세팅하면 된다. 아래의 보기이다.MimeMessage reply = (MimeMessage)message.reply(false);reply.setFrom(new InternetAddress("president@chungwadae.go.kr"));reply.setText("Thanks");Transport.send(reply);메시지를 보낼때  reply-to주소를 설정하는것은 setReplyTo()메소드를 사용하면 된다.아래는 핵심골격코드이다.. 주석으로 막아논 부분이 Reply시킬때 사용하는 부분이며, 회신하기 위해서는 폴더의 메시지들을 가져와야 하는것은 당연하다.
import java.io.*;import java.util.Properties;import javax.mail.*;import javax.mail.internet.*;public class ReplyExample {  public static void main (String args[]) throws Exception {    String host = args[0];    String sendHost = args[1];    String username = args[2];    String password = args[3];    String from = args[4];    // Create empty properties    Properties props = System.getProperties();    props.put("mail.smtp.host", sendHost);    // Get session    Session session = Session.getDefaultInstance(props, null);    // Get the store    Store store = session.getStore("pop3");    store.connect(host, username, password);    // Get folder    Folder folder = store.getFolder("INBOX");    folder.open(Folder.READ_ONLY);    BufferedReader reader = new BufferedReader (      new InputStreamReader(System.in));    // Get directory    Message message[] = folder.getMessages();    for (int i=0, n=message.length; i < n; i++) {       System.out.println(i + ": " + message[i].getFrom()[0]          + "\t" + message[i].getSubject());      System.out.println("Do you want to reply to the message? [YES to reply/QUIT to end]");      String line = reader.readLine();      if ("YES".equals(line)) {        // Create a reply message        // Set the from field        // Create the reply content, copying over the original if text        // Set the content        // Send the message      } else if ("QUIT".equals(line)) {        break;      }    }    // Close connection     folder.close(false);    store.close();  }}
아래는 store인증 및 send인증을 모두 결합한 코드이며 현재 가지고 있는 놀새계정으로 테스트해볼수 있으며, 복사만 하여도 돌아가게끔 만들었다.모두 테스트해보기 바란다.
import java.io.*;import java.util.Properties;import javax.mail.*;import javax.mail.internet.*;public class ReplyExample {  public static void main (String args[]) throws Exception {    String host = "openitech.co.kr";    String sendHost = "openitech.co.kr";    String username = "ienvyou";    String password = "0000";    String from = "ienvyou@orgio.net";    // Create empty properties    Properties props = System.getProperties();    props.put("mail.smtp.host", sendHost); props.put("mail.smtp.auth","true"); Authenticator auth = new MyAuthentication();    // Get session    Session session = Session.getDefaultInstance(props, auth); session.setDebug(true);    // Get the store    Store store = session.getStore("pop3");    store.connect(host, username, password);    // Get folder    Folder folder = store.getFolder("INBOX");    folder.open(Folder.READ_ONLY);    BufferedReader reader = new BufferedReader (      new InputStreamReader(System.in));    // Get directory    Message message[] = folder.getMessages();    for (int i=0, n=message.length; i < n; i++) {       System.out.println(i + ": " + message[i].getFrom()[0]          + "\t" + message[i].getSubject());      System.out.println("Do you want to reply to the message? [YES to reply/QUIT to end]");      String line = reader.readLine();      if ("YES".equals(line)) {        // Create a reply message        MimeMessage reply = (MimeMessage)message[i].reply(false);        // Set the from field        reply.setFrom(new InternetAddress(from));        // Create the reply content, copying over the original if text        MimeMessage orig = (MimeMessage)message[i];        StringBuffer buffer = new StringBuffer("Thanks\n\n");        if (orig.isMimeType("text/plain")) {          String content = (String)orig.getContent();          StringReader contentReader = new StringReader(content);          BufferedReader br = new BufferedReader(contentReader);          String contentLine;          while ((contentLine = br.readLine()) != null) {            buffer.append("> ");            buffer.append(contentLine);            buffer.append("\r\n");          }        }        // Set the content        reply.setText(buffer.toString());        // Send the message        Transport.send(reply);      } else if ("QUIT".equals(line)) {        break;      }    }    // Close connection     folder.close(false);    store.close();  }}class MyAuthentication extends Authenticator { PasswordAuthentication pa; public MyAuthentication(){  pa = new PasswordAuthentication("ienvyou","0000"); } public PasswordAuthentication getPasswordAuthentication() {  return pa; }}
다음편에는 메시지포워딩에 대해 알아보겠다.
Forwarding Messages
메시지를 포워딩시키는 것은 조금만 더 신경쓰면 될것이다. 호출을 위해 어떤 메소드도 존재하지 않으며, 메시지를 만드는 것은 단순히 part들은 조작함으로서 만들어낼수 있을것이다.메일 메시지를 multiple parts(메일은 Part인터페이스부터 시작한다고 말했었다.) 만듦으로서 가능한데, 각각의 part는 BodyPart, 즉 조금더 구체적으로 말하면 MIME message를 조작할 때의 MimeBodyPar부분이라고 할수 있다.서로 다른 part를 위해 컨테이너가 Multipart, MimeMultipart를 호출함으로써 메시지가 구성되어 질수 있다.메시지를 포워딩시키기 위해서는 메시지의 텍스트에 하나의 part를 생성한후 , 두번째 part를 생성하고, 두 part를 조합하기 위해서 값들을 multipart안으로 집어넣으면 된다. 그런 후에는 메시지를 보낼 곳의 정확한 주소를 입력한 후 보내기만 하면  된다.
// 포워딩할 메시지를 생성한다.Message forward = new MimeMessage(session);// 헤더에 값을 입력한다.(수취인 정보및 보낸이 정보등등)forward.setSubject("Fwd: " + message.getSubject());forward.setFrom(new InternetAddress(from));forward.addRecipient(Message.RecipientType.TO,   new InternetAddress(to));// 새로운 MessagePart를 생성한다.//사실 일반적인 메시지를 보낼때는 Message msg = new MimiMessage()를 사용했었다.BodyPart messageBodyPart = new MimeBodyPart();messageBodyPart.setText(  "Here you go with the original message:\n\n");// part들을 조합하기 위해 MultiPart를 생성한다Multipart multipart = new MimeMultipart();multipart.addBodyPart(messageBodyPart);// 포워딩되는 내용을 위해 part를 생성하고, 값을 채운다.messageBodyPart = new MimeBodyPart();// folder에서 얻어온 값(message)messageBodyPart.setDataHandler(message.getDataHandler()); // multi part에 Part를 추가한다.multipart.addBodyPart(messageBodyPart);// 메시지를 multi-part에 결합시킨다.forward.setContent(multipart);// 메시지를 보낸다.Transport.send(forward);
요번편에서는 간략하게 메시지를 포워딩시키는 방법에 대하여 알아보았고,다음편에서는 파일첨부하는 소스코드를 이용하여 파일을 전송하여 보자.
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 때찌1
요즘 자바기술을 이용하여 굉장히 많은 일들이 벌어지고 있다. Mobile쪽을 비롯하여 일반 application 및 대형 Enterprise환경까지 자바가 미치는 범위는 정말 광대하다. 여기서 시작되는 연재는 현재 J2EE(Java 2 Enterprise Edition)의 JavaMail을 다룰 것이다. 이번 연재에서 자바의 역사가 이렇다 저렇다 할수 있는 상황은 아닌것 같다. 이글을 읽는 사람은 OOP(Object Oriented Programming)의 개념을 정확히 알고 있어야 할것이다. J2EE쪽 환경이라면 우선 기본적인 지식을 갖추어야 하지만 본 내용은 소스코드를 복사하여 여러분들의 편집기에 붙여넣고 컴파일한후 실행시켜도 돌아갈수 있게끔 만들었다. 장황한 설명은 하지 않겠다. 이제 interface의 진수를 맛보도록 하자. Content(1부) 자바메일(JavaMail)이란? Windows 2000환경에서 smtp의 세팅법 localhost smtp를 이용한 메일보내기 Major JavaMail API Components/JavaMail Event Model Session/Message/Address Class Authenticator Class Transport Class Store class & Folder class Delete/Reply Message Fowarding Message * Java Mail이란? Sun Microsystems의 J2EE의 하나로 지원하고 있는 package이다. 또한 자바기술기반의 Messaging or Mail 애플리케이션으로 구성되어, 플랫폼 독립적이고 protocol에 독립적인 framework을 제공해주는 MailAPI로 구성되어 있다. MailAPI는 또한 JDK1.1.6 또는 그 이상에서 작동시킬수 있으며, 일반적으로 J2EE 의 일부분으로서 동작한다. Java mail reference에 대한 구현은 core JavaMail packages와 IMAP, POP3, SMTP service provider가 포함되어져 있다. * 어디서 구할수 있는가? 기본적으로 Java Mail을 구현하기 위해서는 J2SDK가 있어야 하는데, 위에서 언급했던바와 마찬가지로 JDK1.1.6이상의 VM이 설치되어야 한다. JDK download http://java.sun.com/products/j2se/ Java Mail download http://java.sun.com/products/javamail/ 또한 Java메일은 Data Content Handling을 하기 위해 JavaBeans Activation Framework이란 것이 필요하다. JAF download http://java.sun.com/beans/glasgow/jaf.html JDK를 설치한후 나머지 java mail API와 jaf는 zip 포맷형태로 다운로드 받으며, 해당 디렉토리에 압축을 풀도록 한다. 이전 Mail 1.1.3에서는 각각의 프로토콜에 관련된 패키지가 따로 설정되어 있어, 각각을 시스템의 classpath에 추가시키도록 한다. 압축을 푼후 classpath에 mail.jar, imap.jar, pop3.jar, smtp.jar와 activation.jar를 추가시키도록 한다. * more info IMAP is defined by RFC2060. For more information, see http://www.imap.org/ SMTP, MIME, POP3 등에 관련된 프로토콜은 http://www.imc.org/에서 해당 프로토콜에 대한 자세한 설명을 하고 있다. * Windows 2000에서의 SMTP설치 이번 편에서는 Windows 2000환경에서 smtp의 세팅법에 대하여 알아보도록 하자 요즘 대다수의 환경은 Windows 2000 Professional이상 혹은 Linux운영체제를 가지고 있을것이다. 이러한 optional하게 SMTP(Simple Mail Transfer Protocol)을 지원하고 있다. 대부분 설치시에 물어보게 되는데, Linux의 경우 전체 설치또는 서버설치를 하게 되면, 해당 시스템 커널에 SMTP daemon이 init시점에 뜨게 된다. inux는 기본 SMTP를 사용하도록 하며, 여기서는 Windows 2000의 환경에서 테스트를 시도해보도록 하자. 우선 Windows 2000의 환경설정인데, Server급같은 경우 인터넷서비스 관리자가 자동으로 운영체제 인스톨시에 설치되게 되는데, Professional같은 경우는 그렇지가 않다. 2000의 설치CD를 이용하여 구성요소 -> 인터넷서비스관리자를 추가하도록 한다. 자. 이제 다 설치가 끝이 났는가? 그러면 시작 - > 설정 -> 제어판 -> 관리도구 -> 인터넷서비스관리자 로 가본다. 그곳으로 들어가면 최상단 Root에 해당 컴퓨터의 이름이 나오게 되고, 하위디렉토리를 보면 기본 FTP 사이트, 기본 WEB 사이트, 기본 SMTP가상서버가 있을것이다. 기본SMTP가상 서버에 마우스를 클릭하여 등록정보로 들어가보도록 한다. Pane에 기본, 액세스, 배달, 메시지, 라우팅, 보안등의 항목이 있을것이다. 그곳에서 액세스를 클릭하면 몇가지 항목이 나오는데 맨 아래쪽에 릴레이제한이란 메뉴가 있다. 릴레이버튼을 클릭하면 가상서버를 통해 릴레이할 컴퓨터를 선택할수 있는데 그곳에 loopback IP Address(127.0.0.1)를 입력하도록 한다. 아래목록만 또는 아래목록만 제외라는 option버튼이 있는데 아래목록만에 체크를 하도록 하고 확인을 누르면 설정이 끝나게 된다. 이 가상서버를 통해서는 Outlook등의 smtp를 localhost로 잡고, 메일을 보낼수 있는 준비가 다 된것이다. 여기까지 다 따라했으리라 본다. 자.. 이제 여러분들은 JDK1.1.6 이상 Java Mail API 1.2가 여러분들 컴퓨터에 세팅되어 있고, localhost의 smtp를 구동시켰다.
우선 중요한 클래스들부터 살펴보도록 하자.
사용자 삽입 이미지
Major Java Mail API Component를 보면 interface와 해당 클래스를 extends받은 클래스들로 정의된다. 최상위 interface Part가 존재하며 javax.mail.internet.MimePart interface가 이 클래스를 extends받아 사용한다. Part 인터페이스는 Message와 BodyPart에 의해 implements되어진다. 또한 MimePart는 MimeMessage와 MimeBodyPart에 의해 implements되어진다. 위의 클래스들을 상속받은 많은 클래스들이 core API를 구성하고 있으며, service provider에 의한 확장이 용이해지는 장점을 가지고 있다. 메시지를 보낼때는 Message클래스와 Transport클래스에 의한 구현을 할수 있으며, 메시지를 받을때는 Store클래스와 Folder클래스를 통하여 해당 시스템의 메일박스(보통 INBOX)를 통해 Message타입의 데이터를 우리 눈으로 볼수 있는 결과가 된다.
사용자 삽입 이미지
위의 형태로 메시지를 전달할수 가 있다. 여러분들이 중요하게 봐야 할 클래스는 Message와 Transport, Store, Folder, Session 클래스들이다. 또한 Data Handling을 위해서는 javax.activation패키지의 클래스들을 유심히 봐야할 것이다. 사실상 메일은 위 클래스의 메소드를 유효적절하게만 활용을 해도 전달 또는 메일시스템을 구축할수 있다. 자 이제 SMTP를 사용하여 간단한 메일을 전송하여 보도록 하자. 일반적으로 arguments값을 외부로부터 입력받아 사용해야 하지만 바쁜 관계로 String의 배열안에 모두 입력한후 처리하였다. 사실 눈여겨 볼부분은 몇줄 안되며 catch블록이하는 Exception을 처리하기 위한 부분이다. 소스코드를 보도록 하자.
import java.util.*; import java.io.*; import javax.mail.*; import javax.mail.internet.*; import javax.activation.*; public class msgsendsample { static String msgText = "This is a message body.\nHere's the second line."; public static void main(String[] args) { // 스트링의 배열값으로 보낼 property값들을 세팅한다. String arg [] ={"ienvyou@orgio.net","ienvyou@javapattern.info", "localhost", "true"}; System.out.println(); String to = arg[0]; // 보낼 사람의 주소이다. String from = arg[1]; // 보내는 사람의 주소이다. String host = arg[2]; // SMTP서버가 돌고 있는 곳의 주소이다. boolean debug = Boolean.valueOf(arg[3]).booleanValue(); // Properties props = new Properties(); props.put("mail.smtp.host", host); // 메일을 보낼때 디버깅코드를 화면에 보여줄지를 세팅한다. if (debug) props.put("mail.debug", arg[3]); Session session = Session.getDefaultInstance(props, null); session.setDebug(debug); // 해당 세션클래스의 디버깅 옵션을 argument값으로 설정한다. try { // create a message /** * MimeMessage는 Message를 extends받고 있으며 메일을 보낼때 필요한 핵심 메소드들을 * abstract method 또는 * general method형태로 가지고 있다. // MimeMessage객체를 생성하여 javax.mail.Message타입에 넣는다 */ Message msg = new MimeMessage(session); . msg.setFrom(new InternetAddress(from)); // 보낼 사람의 주소를 InternetAddress형태의 배열로 변환한다. //(수신자가 여러명될수 있으므로..); InternetAddress[] address = {new InternetAddress(arg[0])}; // 수신인을 Message에 세팅한다. msg.setRecipients(Message.RecipientType.TO, address); msg.setSubject("JavaMail APIs Test"); msg.setSentDate(new Date()); // If the desired charset is known, you can use // setText(text, charset) msg.setText(msgText); // 아래의 static메소드에 의해 메일발송 Transport.send(msg); } catch (MessagingException mex) { System.out.println("\n--Exception handling in msgsendsample.java"); mex.printStackTrace(); System.out.println(); Exception ex = mex; do { if (ex instanceof SendFailedException) { SendFailedException sfex = (SendFailedException)ex; Address[] invalid = sfex.getInvalidAddresses(); if (invalid != null) { System.out.println(" ** Invalid Addresses"); if (invalid != null) { for (int i = 0; i < invalid.length; i++) System.out.println(" " + invalid[i]); } } Address[] validUnsent = sfex.getValidUnsentAddresses(); if (validUnsent != null) { System.out.println(" ** ValidUnsent Addresses"); if (validUnsent != null) { for (int i = 0; i < validUnsent.length; i++) System.out.println(" "+validUnsent[i]); } } Address[] validSent = sfex.getValidSentAddresses(); if (validSent != null) { System.out.println(" ** ValidSent Addresses"); if (validSent != null) { for (int i = 0; i < validSent.length; i++) System.out.println(" "+validSent[i]); } } } System.out.println(); if (ex instanceof MessagingException) ex = ((MessagingException)ex).getNextException(); else ex = null; } while (ex != null); } } private static void usage() { System.out.println("usage: java msgsendsample <to> <from> <smtp> true|false"); } }
위의 코드에서 잘 살펴보아야 할부분은 MimeMessage를 생성한후 정보를 세팅하는 일들이다. setXXX메소들에 의해 세팅되어 지며, Transport클래스의 메소들에 의해 실질적인 network infrastructure를 통해 메일이 발송되어 지게 된다. 유심히 본 사람은 Properties클래스가 존재하는데, 왜 있을까? 라는 궁금증이 생길것이다.. 원래 보는 사람들이 후편을 기다리게 만들어야 만드는 사람도 재미있지 않을까? 다음 시간에는 Properties의 역할과 SMTP가 local에 없을경우(orgio나 chollian같은 곳의 smtp)를 인증을 통하여 사용하고 싶을때의 JavaMail에 대하여 이야기할 것이다..
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 때찌1
Windows에 James 메일서버 설치하기

1. James 메일서버 실행

James 가 설치된 폴더의 bin 밑에 있는 run.bat 를 실행시킨다.

2. James 가 정상적으로 작동하지 않을 경우

윈도우즈 탐색기에서 run.bat를 더블클릭하여 실행시킨경우 환경설정상의 문제가 있으면 실행도중 도스창이 닫혀버린다. 이때에는 도스창을 미리 실행시켜서(cmd) 도스창에서 run.bat를 실행시키면 발생한 오류에 대해서 확인을 할 수 있다.

3. SMTP 가 정상적으로 실행되지 않을 경우

일반적으로 OS를 설치할때 IIS를 설치하면 SMTP가 함께 설치된다. 관리도구의 인터넷 정보 서비스에서 해당 SMTP 서비스를 중지하거나 관리도구의 서비스에서 SMTP 서비스를 중지 시킨 후 James를 실행시켜 본다.

4. POP3가 정상적으로 실행되지 않을 경우

일부 바이러스 백신 프로그램에서 POP3 서비스를 감시하는 기능을 지원할 경우 POP3 포트가 사용중이라는 메시지와 함께 James가 실행되지 않는 경우가 있는데 이때에는 백신 프로그램의 POP3 감시 기능을 중지 시키도록 한다.

5. James의 환경설정

설치폴더의 apps\james\SAR-INF\config.xml 에서 James 설정 관련 내용을 수정할 수 있다. 최초 James를 설치(압축해제)했을 경우 위의 파일이 존재하지 않는데 이때에는 bin\run.bat 를 먼저 한번은 실행시켜 줘야 해당 폴더가 자동 생성된다.

6. James와 Database 의 연결

James를 기본설치한 경우 메일서버는 하드디스크에 사용자별 메일 폴더를 생성한다. James의 경우 이외에도 Database와 연동할 수 있는 기능을 제공하고 있다. Database와 연동하기 위해서는 5번에서 설명한 config.xml 파일을 수정한다. 수정할 부분은 file://val/ 로 시작하는 부분을 db://maildb/ 로 변경한다. ① 65~67 -> 75~77로 변경 ② 258 -> 261로 변경 ③ 315 -> 318 변경 ④ 383 -> 390 변경 ⑤ 411 -> 414 변경 ⑥ 437 -> 440 변경 ⑦ 717 주석처리 ⑧ 730 주석처리 ⑨ 749~751 -> 755~757 변경 ⑩ 790~792 -> 802~804 변경 ⑪ 847~853 주석처리 해제 및 mySQL 관련 내용으로 변경 James와 Database 의 연결설정이 정상적인 경우 James 를 실행시킬때 deadletter, inbox, spool, users 의 4개의 테이블이 자동 생성된다.

7. Outlook과 연결하여 메일 받기

James를 기본설치한 경우 local 에서는Outlook 을 통해서 James 메일서버에서 메일을 읽어 올 수 있다. 그러나 다른 PC에서 Outlook 을 통해 James 메일서버에 접속을 하려면 config.xml 파일을 수정해 주어야 한다. 307 라인을 보면 RemoteAddrNotInNetwork=127.0.0.1 로 되어 있는 부분이 있는데 이 곳에 Outlook 을 통해서 접속하고자 하는 IP를 등록시켜 준다. RemoteAddrNotInNetwork=127.0.0.1, xxx.xxx.xxx.*, xxx.xxx.*.* 와 같이 IP의 범위를 지정할 수 도 있다.

8. Outlook과 연결하여 메일 보내기

7번에서 설정한 내용은 Outlook을 이용하여 메일을 받아보는 설정을 하는 부분이다. Outlook을 통해서 메일을 발송하기 위해서는 config.xml 575 라인을 수정해 주어야한다. 이때 설정하는 방식은 307 라인의 xxx.xxx.xxx.* 와 같이 IP만 설정하는 방식이 아니라 IP와 서브넷 마스크를 동시에 설정해 줘야 한다. 주석내용을 보면 127.*, 127.0.0.0/8, 127.0.0.0/255.0.0.0, and localhost/8 이 모두 같은 내용이라고 되어 있다. 127.0.0.0/255.0.0.0의 내용은 좌측은 IP, 우측은 서브넷 마스크를 의미한다. 여기서 127.0.0.0/255.0.0.0 와 127.0.0.0/8 가 같은 내용이라는 의미는 우측의 서브넷 마스크의 경우 255.0.0.0 과 같이 나타내는 방식과 8로 나타내는 방식이 같은 값을 나타냄을 의미한다. 즉 255.0.0.0 을 2진수로 표현했을 경우 11111111.00000000.00000000.00000000 와 같이 32비트로 표현이 되고 이때 1로 표현된 부분이 모두 8자리 이기 때문에 간단하게 8 로 표현할 수 있다. 따라서 127.* 와 localhost/8 도 모두 같은 표현이 된다.

9. James에 사용자 등록하기

일반적으로 메일박스를 파일시스템을 이용할 경우 James에 신규 사용자를 등록할 경우 telnet localhost 4555 로 접속을 해서 adduser 명령으로 사용자를 등록한다. 물론 메일박스를 파일시스템이 아닌 Database를 사용할 경우에도 위의 명령으로 신규 사용자 등록이 가능하다. 그러나 신규 회원이 가입했을 경우 사용자가 추가될때 마다 관리자 모드에서 사용자를 등록시켜 줄수만은 없다. 관리모드에서 사용자를 하나 등록한 후 users 테이블을 확인해 보면 관리모드에서 등록한 사용자가 추가 되어 있는 것을 볼 수 있다. 그런데 비밀번호가 암호화 되어 있기 때문에 프로그램상에서 추가를 해 줄 경우 James에서 사용하는 암호 체계로 변환을 해 주어야 한다. digestString 함수를 작성해서 암호 부분을 처리해 준다. pass 는 비밀번호이고 algorithm 은 SHA 로 설정해 준다. java.io.ByteArrayOutputStream java.io.IOException java.io.OutputStream java.security.MessageDigest java.security.NoSuchAlgorithmException javax.mail.MessagingException javax.mail.internet.MimeUtility public static String digestString(String pass, String algorithm ) throws NoSuchAlgorithmException { MessageDigest md; ByteArrayOutputStream bos; try { md = MessageDigest.getInstance(algorithm); byte[] digest = md.digest(pass.getBytes("iso-8859-1")); bos = new ByteArrayOutputStream(); OutputStream encodedStream = MimeUtility.encode(bos, "base64"); encodedStream.write(digest); return bos.toString("iso-8859-1"); } catch (IOException ioe) { throw new RuntimeException("Fatal error: " + ioe); } catch (MessagingException me) { throw new RuntimeException("Fatal error: " + me); } }

10. James 윈도우 서비스에 등록하기

James 를 실행시키기 위해서는 매번 run.bat 를 실행시켜줘야 한다. 그러나 OS가 재 부팅될때 마다 James를 실행 시켜 준다는 부분이 부담스러울 경우 James를 윈도우 서비스에 등록을 해서 사용할 수 있다. bin 폴더에 보면 Wrapper.exe 파일이 있고 이 파일을 이용하면 James를 서비스에 등록 시킬 수 있다. 우선 conf 폴더의 wrapper.conf 파일을 열어본다. 101 라인에는 James 의 서비스명을 입력한다. 104 라인에는 서비스 목록의 이름항목에 표시될 이름을 작성한다. 107 라인에는 서브스 목록의 설명항목에 표시될 내용을 작성한다. 그 외에 항목은 별도 수정하지 않는다. 도스창을 실행시켜 bin 폴더로 이동한후 Wrapper -i ../conf/wrapper.conf 를 실행시켜 James를 서비스에 등록한다. 서비스에 등록이 되면 net start james 명령으로 James 메일 서버를 실행 시킨다. 이때 101 라인에 설정한 서비스명으로 실행/종료 시킬 수 있다. 만약 101 라인에 James 2.2 와 같이 서비스명을 설정한 경우 net start "James 2.2" 와 같이 따옴표를 주어 실행 시켜야 한다.

마무리

예전에는 Windows에서 메일 서버를 돌릴경우 무료 메일서버인 EMWAC을 사용했지만버전이 오래되다 보니 요즘은 EMWAC를 사용하는 경우가 많이 줄어 든것 같습니다.지금은 James 라는 자바 메일서버 엔진으로 예전에 EMWAC이 하던 부분을 대체할 수 있습니다. 그러나 아쉽게도 James 에 관련된 내용이 없다 보니 처음 James를 접하시는 분들은 많이고생을 하셨을 겁니다. 저 또한 처음 James를 접할때 POP3 를 사용할 수 없다는 오류 메시지 때문에한동안 James 사용을 꺼리기도 했었습니다. 이것 저것 만지다 보니 오류 메시지가 V3 때문에 발생한다는 원인도 찾고 Outlook 에서 연결도 Local PC에서만 되고, Outlook 을 통한 메일 발송은 되지도 않고.. 등등 여러가지 문제가 많이 있었습니다.일단은 위의 설정만 한다고 하면 James를 메일 서버로 사용하는데 문제는 없을것이라 생각됩니다.물론 위에서 설명된 내용 이외에도 실제로 메일을 주고 받기 위해서 도메인도 있어야 하고DNS에 메일관련 부분도 설정해 주어야 합니다. 이런 부분은 다른 문서를 찾아 보시면 쉽게 찾을수있을 겁니다.

부탁드리는 말

저 나름대로 James를 가지고 이것 저것을 손대다 보니 그래도 어느정도 James를 사용할 수는 있을정도로 설정을 할 수 있도록 되었습니다.그러나 James에서 지원하는 기능은 아직도 많이 있지만 우리가 제대로 설정 할 줄 몰라서 사용하지못하는 기능도 수두룩 합니다. 이 부분은 여러분들과 함께 보완해 갈 수 있었으면 합니다.

도와주세요!!

James 메일의 경우 첨부파일 용량이 10M 를 넘어갈 경우 오류가 발생하고 있습니다.이 문제에 대해서 해결할 수 있는 방법 아시는 분께서는 도움 주셨으면 합니다.
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 때찌1
이전버튼 1 이전버튼