본문 바로가기
Server&OS/Window

[본문스크랩] SMTP 웹메일 만들기

by 백룡화검 2010. 4. 24.

SMTP 웹메일 만들기 #1

1.SMTP 웹메일을 왜 만들게 되었는가?

인터넷 홈페이지를 처음 만들게 된 것은 대학교 1학년때 교내 인터넷 홈페이지 경진대회에 나가기 위해서였습니다. 그 때 만든 그 어릿광스러운 홈페이지를 전 아직도 기억합니다. 제 첫 소중한 인터넷 프로그램 개발자 인생으로써의 전환기를 준 소중한 계기였죠.

그 때 부터 ASP라는 신기한 놈을 만나 올해로 4년째 ASP와 더불어 살아가는 입장이 되었습니다. 처음엔 제주인포, ASPKOREA의 도움을 받다가.. 차츰 많은 ASP사이트들이 생기더군요. 많이 배웠죠..

ASP를 하면서 수 많은 한계를 느끼고 슬퍼하기도 하고, 나름대로는 그 기능을 보완하기 위해 나름대로 구현한 여러 시스템들이 있었지만.. 최근까지 제가 해결하지 못했다고 생각이 되는 것은 바로 웹메일입니다. 익스체인지 서버를 구입한다면 이렇게 고생하지 않아도 되겠지만 윈도우 NT구입 이상의 돈을 투자 하지 않고 할 수 있다면... 이런 생각이 간절했습니다. 익스체인지 서버는 상당한 고가라 벤처기업 입장에서 익스체인지 서버로 웹메일을 만든다는 것은 꿈도 못꾸죠.

ASP와 PHP3 그리고 리눅스로 쉘스크립트를 써서 만드는 것이 보편화, 대중화 되어 있죠. 왜 리눅스와 PHP3로 된 웹메일 소스는 많은데 ASP로 된 웹메일 소스는 없는 것일까? 고민하며.. 분명히 있을거라.. 여느 때와 같이 인터넷을 뒤졌습니다. 나름대로 신기술에 익숙해 지려고 한국 사이트보다는 외국 사이트들을 돌아 다니며 새로 나온 컴포넌트들을 테스트 하고 기능을 익혔습니다. 그러나 정작 내가 원한 웹메일 소스는 어디서도 구하지 못한체.. 좌절하고 있었습니다.

그러다가 어느날.. 정말 우연치 않게... 강남 컴퓨터 서적에 들렀습니다. 여느 때 처럼 새로 나온 ASP관련 외국 서적이 있나 보다가.. 나온지는 좀 오래돼 보이지만.. Professional CDO Programming이란 책이 있었습니다. 처음엔 CDO라는 단어가 익숙해서 보게 되었는데... 2분 쯤 보았을까 내가 하고 싶었던 것들의 일부분이 구현이 되어 있는 페이지가 있었고.. 난 거금을 주고 그 책을 바로 사 버렸습니다.
(나중에 안 이야기지만 제가 예전에 구입한 Professional ASP 3.0 뒷부분에 거의 대부분 있던 내용이 들어 있었음)

리눅스처럼 전문적이진 않지만.. 내 손으로 웹메일을 만들어 NT에서 추가 비용없이 메일 서버를 구축할 수 있다는 그 사실 하나만으로 전 기뻤고... NT로 ASP 개발하시는 분들을 위해서도 정말 좋은 소식이 아닐까 생각했습니다.
그 날 저녁... SMTP로 메일을 받을 수 있다는 사실을 처음 두 눈으로 확인을 하고 정말 기뻤답니다. DROP 디렉토리 안에 저장된 xxxxxx.eml 화일은 내가 보낸 메일이었음을.....
그리고 바로 그 책을 통해서 CDONTS.Session을 통해 SMTP의 메일을 받은 폴더를 접속하고 그 안의 메세지들을 어떻게 끌어 내어 오는지.. 참 오랜 시간이 걸렸습니다. 그 객체들이 상속받는 관계에 어두웠고 CDO와 CDONTS와의 햇갈림 속에서 오는 좌절과 고민.. 그 시간속에서 많은 분들이 저에겐 힘이 되었습니다.

AgeOfStone의 준호님 , Taeyo의 태오님 , tiptech의 양달님..
제 옆에서 저를 응원해 주었던 후배 승렬 , 창주.. 그외의 다수의 분들이 격려의 박수와 아낌없는 성원 속에 허접한 실력임에도 불구하고 여러분께 보잘것 없는 이 SMTP 웹메일을 만들고 공개하게 되었습니다.

특히... 웹메일 전체를 디자인 해 주신 송승렬님, 그리고 편지지 전문 회사 바람난 공주에서 디자인 된 편지지를 제공해 주신 김정미님께 다시 한번 감사하다는 말씀을 드리며 저의 "SMTP로 웹메일 만들기" 강좌를 시작해 보려고 합니다.

그리 전문적이진 않지만.. ASP로 무엇인가 새로운 기능을 구현할 수 있다는 그런 뿌듯한 기분을 여러분들과 같이 느끼고 싶군요.. 그럼 허접하다구..!!!! 머라구 하지 말구요... 천천히 저랑 같이 웹메일을 만들어 봅시다!!

새로운 것은 언제나 아름답다. 그것이 내가 새로움을 추구하는 단 하나의 이유이다.

질문은 http://goodboys.pe.kr 의 Study의 CDO스터디로...


2.SMTP 웹메일의 개요

SMTP는 1980년대 초에 만들어 졌으며 아직까지 그렇게 크게 바뀌지 않은 메일 송/수신 프로토콜입니다. 간단한 메일 전송 프로토콜(Simple Mail Transfer Protocol)은 종전까지 ASP프로그래머들에게 스팸메일이나 게시물에 대한 답변, 가입시 가입 축하 편지 보내기 등의 송신 기능으로 사용되어 왔구요..


아마 SMTP의 강력한 송신 기능이 수신기능을 억눌렀을지 모릅니다. 사실 pop3는 폴더에 있는 편지들을 꺼내주기만 할 뿐 아무것도 할 줄 아는 것이 없는 넘인데....

SMTP 웹메일의 간략한 개요를 그림으로 살펴 보면..
 
 
웹에서 메일을 CDONTS.Newmail 객체 보내는 SMTP서버에서 보냅니다. 그러면 SMTP프로토콜이 인터넷 망을 통해 받는 SMTP로 메일을 받게 된다. 받은 메일은 inetpub/mailroot/drop 폴더에 저장이 되며 , 계정에 관계 없이 그 도메인으로 배달되는 모든 메일을 받게 됩니다.

문제 1
    abcd@aaa.co.kr 이라는 E-Mail 계정이 없어도 이렇게 보내면 aaa.co.kr 이라는 SMTP 메일 서버가 받아서 Drop폴더에 저장한다는 것입니다. 이것의 장점은 별도의 계정 추가 없이 데이터 베이스에서 인증만 해주면 된다는 점이고, 이런 쓰레기 값들의 메일을 어떻게 처리해 줄 수 있느냐인데....

해결 방안 1
    일정 시간에 한번씩 지울수 있는 WSH로 짠 VBS를 돌리는 것입니다. Windows Script Host는 서버의 어플리케이션을 제어할 수 있는데 윈도우에 스케줄러를 이용해서 일정 시간이 되면 데이터 베이스에 존재하는 계정과 drop폴더에 존재하는 메일을 검사해서 데이터 베이스에 없으면 다른 폴더로 이전시키게 하면 될거 같습니다.
    그리고 한달 아니면 일주일에 이런 편지가 얼만큼 오는지 마스터가 체크를 해서 어떻게 대처할 것인가에 대한 방안을 세우면 되구요.!!!.!!!
    예제) VBS 화일

    허접한 해결 방법일지 모르겠지만... 더 좋은 방법은 C++로 서버응용프로그램을 짜서... CDO_Onarrival 이벤트(편지 도착하면 발생하는 이벤트)가 발생하면 데이터 베이스와 검사한후 없으면 다시 되돌려 보내는..방법도 있죠


그럼 SMTP로 메일을 한번 받아 봅시다.

    1. DNS를 설정한다. aaaa.pe.kr(자신의 도메인)을 설정하고 메일을 받을 수 있도록 MX레코드를 설정한다. 그리고 SMTP 서비스에 도메인을 추가 한다.(하나는 로컬로, 그리고 또 하나는 별칭으로 자신의 메일을 받고자 하는 도메인을 적어 준다.)

    2. 메일을 보내 본다. DROP폴더에 메일이 온것을 눈으로 확인할 수 있을것이다. 아웃룩으로 가져올 방법은 없나?(POP3가 제공되지 않으므로 없을거 같은데.. 누구 아시는 분 없어여?)

    3. CDO.SESSION객체를 사용하여 웹메일로 만든다.

    4. 데이터베이스와 연동 아래 보관함이나 여러가지 편지함을 꾸며 본다.

LDLAP 라우팅을 통해서 Site Server나 Active Directory, 익스체인지 서버와 연동하여 좀 더 발전된 웹메일 시스템을 구축할 수 있는데.. 아직 내공이 그까지 역랑을 발휘하지 못하고 있습니다. 익스체인지 서버는 돈이 드는 일이기 때문에.. 아직 보류 중이고.. Active Directory로 다음 버전 웹메일을 만들려고 하고 있습니다. 익스체인지 서버와 연동이 필요하신 분은.. 이 강좌를 계기로 CDO를 공부하신 후 만들면 정말 좋겠죠?
그렇게 유용하게 이 강좌가 쓰였으면 하는 것이 바로 굿보이의 마음입니다.

SMTP 웹메일의 개요 잘 아셨나요? 그럼 SMTP에 쓰이는 CDO for NTS 에 대해서 한번 알아 보기로 하죠.!!! 열분들 화이팅~!!!!!

질문은 http://goodboys.pe.kr의 Study의 CDO스터디로...


3.CDO For NTS에 개요

지금까지 MS 제품을 사용하면서 제일 불만이었던 메일 서버에 관련된 내용이었습니다. 2000이 나오면 메일 서버에 관련된 문제가 해결이 될 줄 알았는데 아니더군요..
익스체인지 서버를 팔아 먹기 위해 여전히... 나쁜 M$ !!!!!
없으면 만들어쓸 수 밖에 없는 이런 웹메일을 만들 때 쓰는 객체가 바로 CDO입니다.
CDO는 원래 윈도우 NT 3.5부터 시작되어 OLE Messaging ,Active Messaging 등등으로 불리며 Messaging API의 길을 걸어 왔습니다. 그러다 CDO(Collaboration Data Object)라는 이름으로 바뀌어 메일 보내기로 우리에게 친숙하게 다가 왔죠. CDO Library는 여러 종류가 있습니다.

CDO library

필요 설치 항목

CDO 1.0a(OLEMSG.DLL)

익스체인지 서버 4.0 ,아웃룩 97 초기버전
OLE Messaging이라 불렸음

CDO 1.1(ACTMSG32.DLL)

익스체인지 서버 5.0 , 아웃룩 97 후기버전
Active Messaging 이라 불렸음

CDO 1.2(CDO.DLL)

익스체인지 서버 5.5 , 아웃룩 98 or 아웃룩 2000
처음으로 CDO라 불림, 익스체인지서버와
연동되어 사용되기 위해 만들어짐

CDO 1.21

익스체인지 서버 5.5 서비스팩 1-3

CDONTS

인터넷 인포메이션 서버(IIS) 4.0
SMTP/POP3와 연동되기 위해 만들어짐

CDO Win2K

윈도우 2000

CDO Exchange 2K

익스체인지 서버 2000


CDO x.x 버전들은 거의 대부분 아웃룩 클라이언트와 연동되어 사용되며 주소록 등등을 엑세스하며 아웃룩 97의 일정관리까지 할 수 있는 강력한 넘입니다.
이것들 중에서 저희가 이번에 다룰 놈은 바로 CDONTS입니다. 이 놈이 어떻게 구성이 되어 있고 어떻게 메일을 처리하는지 한번 알아 보도록 하겠습니다.

아래는 CDONTS의 레퍼런스 Object 입니다.
(Newmail은 일단 제외했습니다. Session에 관련된 사항만)

    Session(CDONTS.Session 객체 생성....)

    -- Folder(자신이 받은 메일함을 찾습니다.)

    ---- Messages( 그 안에 있는 메시지는 과연 어떤 것들이 있을까?)

    ------ Message

    ---- AddressEntry
    (보낸 사람의 정보를 세세히 볼 수 있습니다.)

    ---- Attachments(화일 첨부에 관련된 내용을 볼 수 있습니다.)

    ------ Attachment

    ---- Recipients
    (받는 사람의 정보를 세세히 볼 수 있습니다.)

    ------ Recipient


로직은 이러합니다.

    1. CDONTS.Session 객체를 생성킨후 SMTP 로그인한 다음 그 정보를 세션값에 저장시킨다.

    2. 그 세션값으로 자신의 Inbox를 찾는다.(사실 하나의 폴더에 다 들어감)

    3. 그 박스 안에서 자신의 이메일만 찾아서 Set 변수값에 저장

    4. 그 메세지들을 보여줌, 첨부화일 검사, 메일이 있나 없나 등등..

이것이 바로 CDO for NTS로 우리가 만들고자 하는 웹메일입니다.

 

 

4. CDO For NTS 웹메일 만들기 (새편지함)

지금까지 기초적인 웹메일에 대한 이해 부분에 대해서 다루어 보았습니다. 여러분께서 많은 기대를 하시는 것에 미치지 못할까바 굿보이는 많이 조마조마하고 있습니다. 모자란 부분은 여러분께서 많은 부분 채워 주셨으면 하는 것이 저의 바램이구요. 앞으로 웹메일에 대한 새로운 여러분들의 기교를 보고 싶습니다.

오늘 부터 본격 적인 웹메일의 시작입니다. 공부 열심히 할 각오 되셨죠? 공부라기 보단.. 그냥 가벼운 마음으로 한번 봐 주세요. 제가 부담이 크답니다. ^.^; 나름대로 열심히 준비 했으니까... 귀엽게 봐 주시구요.

일단 먼저 계정을 등록할 데이터 베이스가 필요합니다.

    G_IDX 자동증가값
    G_ID 사용자 아이디
    G_Password 사용자패스워드
    G_Visited 방문수
    G_Last_Visited 마지막방문 시간

머 이정도로 먼저 UserDB를 디자인 합니다. 그리고 데이터 형식이나 길이 등은 서비스 목적이나 자신의 사이트에 맞게 하시면 되구요.. 일단은 로그인해서 그 안에서 편지를 볼 수 있게 해야 되는 것이 목적이니까..

그리고 그 안에서의 로그인을 안하고 파일의 이름을 처서 들어 오는 경우를 방지하려면 각화일 위에 로그인에 관련된 화일을 인클루드 시켜서 하부디렉토리로 화일로 치고 들어 오는 경우를 방지하면 되구요..

전 단순히 웹메일을 어떻게 받느냐만 설명을 하겠습니다. 나머지는 다 여러분들의 몫입니다.

자, 이제 과연 SMTP로 메일이 온것을 어떻게 보느냐에 대해서 같이 한번 살펴 보도록 하겠습니다.

로그인을 하고 편지함에 들어 오면 이런 메세지들이 있습니다.

(http://goodboys.pe.kr 의 Webmail 메뉴에서 확인하실 수 있습니다.
ID:guest , Password:guest 입니다. )


소스 보기

<html>기본 태그 부분은 제거하고 기능의 소스 부분만 게재합니다.
시간이 있으면 option Explicit 선언하구 Dim 으로 변수를 선언하려 했는데..
가장 기본적인 처음 테스트 코드를 보여 주기 위해 그냥 소스를 공개합니다.
소스 정리는 거치지 않았으며, 또한 성능 향상을 위한 튜닝도 안한 상태 그대로 공개 합니다.

허접하다구 머라구 그러지 말아요..^.^; 오직 해야 된다는 신념하나로 걍 빨리 빨리 하느라.. 시간 나시는 분은 소스를 잘 정리하구 기능도 만빵 넣어서 제게도 하나 보내 주십시오. ^.^;

Newlist.asp

    <%

    domain="goodboys.pe.kr"
    Email=Request.Cookies("UserCheck")("Userid")&"@"&domain

    Set objSession = CreateObject ("CDONTS.Session")
    objSession.LogonSMTP Request.Cookies("UserCheck")("Userid"), Email

    'SMTP에 로그온 합니다.

    set Session("CdoSession")=objSession
    'SMTP로그인 정보와 객체 생성된 것을 세션 값에 저장한다.

    set box = objSession.Inbox
    '자신의 메일 박스를 Set box 에 저장

    Set msg= box.Messages
    '메일 박스에 온 메시지들을 Set Msg에 저장

    IntLoop=Msg.count
    '도착한 메시지들의 갯수를 세어서 저장
    %>

    <FONT size=2>새편지를 읽으시면 바로 개인 편지함으로 이동합니다(구현했음 아직 기능에 안 넣었음).</FONT> <br>
    goodboys 웹 메일에 오신 것을 환영합니다.현재 <%=msg.count%>의 메일이 있습니다.<br><br>

    <% if intLoop=0 then

    Response.Write("새로 도착한 웹메일이 없습니다.~")

    else%>

    <table border="1">
    <tr>
    <td>중요도</td>
    <td>번호</td>
    <td>제목</td>
    <td>보낸사람</td>
    <td>보낸날짜</td>
    <td>첨부화일</td>
    <td>메일용량</td>
    </tr>

    <%
    a=0
    i=1
    do while i < IntLoop+1
    %>
    <tr>
    <td>
    <%select case msg(i).importance
    case "0"%>
    낮음
    <% case "1"%>
    보통
    <% case "2"%>
    중요
    <% end select %>
    '메일의 중요도 체크

    </td>
    <td><%=i%> </td>
    <td><A href="view.asp?MsgID=<%=i%>"><%=msg(i).subject%></a></td>
    '가져온 메일 을 순대로 하여 그 번호를 넘겨서 그 메시지를 찾음

    <td><%=msg(i).sender%> </td>'메시지를보낸 사람
    <td><%=left(msg(i).TimeSent,10)%> </td>'메시지보낸 시간
    <td>
    <%if msg(i).Attachments.count > 0 then%>
    있음
    <% else %>
    없음
    <% end if %>
    '첨부 화일의 검사

    </td>
    <td><%=msg(i).size%>byte </td>'메일전체 용량
    <% a=a+Clng(msg(i).size) %>'새메일의 전체 용량< /FONT>
    </tr>

    <%
    i=i+1
    loop

    %>
    </table>

    메일박스의 용량:<%=a%>byte
    <% end if
    set msg=nothing
    set box=nothing
    set objsession=nothing
    '객체에 사용된 자원의 반환
    %>

조금 이해가 가시겠어요? 부모로 부터 상속 받는 관계를 잘 이해하셔야 합니다.
저도 이것 때문에 고생을 많이 했어여. Newmail.asp에는 그리 어려운 것은 없습니다.

어렵다기 보다.. 이해를 하시고 넘어가는 부분이 많이 필요하죠.
http://msdn.microsoft.com/library/psdk/cdo/amsmtp_3qcf.htm

여기를 보시면 어떠한 객체가 어떤 부모로 부터 상속을 받는지 잘 나타나 있습니다.
잘 참고 하시고 한번 자신의 컴퓨터에서 구현을 해 보는 것이 좋겠습니다.
제 소스와 위의 레퍼런스를 보시면.. 메일의 내용을 보는 것은 제 강좌가 나오기 전에
먼저 구현해 보실 수 있겠죠? 그럼 예습하고 또 만나는 거로 하겠습니다.

 

 

 

 

 

 

 

4. CDO For NTS 웹메일 만들기(메일 읽기)

안녕하세여? 허접 굿보이입니다. 최근에 강좌가 조금 늦어 지고 있는데 정말 정말 죄송합니다. 회사일과 개인적인 일이 겹치는 바람에... 죄송 죄송....

지금까지 강좌 다들 이해하시고 잘 따라 오시고 많은 분들이 의문점을 제기해 주면서.. 많은 분들이 관심을 가져 주시고.. 또 연구하시는 거 보니까 허접 굿보이가 정말 감회가 새롭습니다.

힘을 내어 다시 강좌를 열심히 해 보려 합니다. 홈페이지 메인에 사진도 젊음의 사진(지금 제 모습)로 바꾸었구여~~ 다시 열심히 하겠습니다.

이번 강좌는 전에 메일을 받은 것을 읽어 보는 것입니다. 메일을 읽는데에 있어 메일 본문을 보려고 무지나 노력을 했었는데.. 잘 안되네여~ 메일 원문 아시죠.. 한글로 인코딩 되기 전에.. 이상한 문자들의 모임... 원문보기 메뉴를 만들어 놓구도.. 지금 쓰지 못하고 있네여~~ 으~~ 안타까운 현실...

일단 텍스트 보기와 HTML보기는 CDO For NTS에서 기본으로 제공을 하고 있습니다. 여기서 제가 가장 고민했던 것은 보낸 사람의 이메일 주소 입니다.

보통 Sender가 메일 보낸 사람을 나타내 주는데 아웃룩에서 보내면 그 사람의 이름이 찍혀서.. 고민을 했었는데 해결했습니다. 소스를 쭈욱~ 보시면서 .. 저번 강좌와 이어서 보시면 분명히 이번에는 더 쉽게 이해할 수 있으시리라 믿습니다.
그림 설명:그냥 메일 제목을 누르면 HTML보기가 되고 아래와 같이 보임


그림 설명:TEXT로 보기를 누르면 아래와 같이 보임
Flash
소스 보기

    <%@ Language=VBScript %>
    <%
    'Option Explicit

    Dim MailIndex
    Dim MailSubject
    Dim MailSenderAddress
    Dim MailSendDate
    Dim MailContentText
    Dim MailReplaceContentText
    Dim MailContentHTML
    Dim ObjSession
    Dim ObjMessage
    Dim ObjUserMessage
    Dim objUserSender
    Dim Content
    Dim MailSendAddress
    Dim subject
    Dim IntLoop
    %>

    '변수 선언

    Mailindex=cint(request("MsgID"))

    '자신의 메세지 박스 중에서 선택한 메세지의 ID번호를 넘김

    Set objSession = Session("CdoSession")
    set ObjMessage = objSession.Inbox.Messages

    '메일을 받아 오는 것과 동일

    Set ObjUserMessage=ObjMessage(mailindex)

    '자신이 선택한 메세지를 Set 변수에 저장함(이는 한 메시지에 여러 첨부화일이 있을경우에 사용함)

    set ObjUserSender=ObjUserMessage.sender

    '보낸 사람의 정보를 Set객체에 저장..( 그 중에 전 메일 주소만 필요했음)

    MailSubject=ObjUserMessage.subject

    '메시지의 제목을 변수에 저장

    MailSenderAddress=ObjUserSender.address

    '보낸 사람의 정보 중에 이메일 주소를 변수에 저장

    MailSendDate=ObjUserMessage.TimeSent

    '메세지의 보낸 시간을 변수에 저장

    MailContentText=ObjUserMessage.text

    '메세지의 본문 내용을 텍스트로 저장

    MailReplaceContentText=replace(MailContentText,Chr(13),"<BR>")

    '메세지의 본문 내용중에 엔터가 쳐진 부분은 처리하는 것을 변수에 저장

    MailContentHTML=ObjUserMessage.htmltext

    '메세지의 본문을 HTML형식으로 보여주는 것을 변수에 저장

    if request("type")="text" then

        Content=MailReplaceContentText

    else

        Content=MailContentHTML

    end if

    '넘어 온값이 text이면 텍스트 형식의 메일을 아니면 HTML형식의 메일을 보여 주게끔 변수 설정

    <HTML>
    <HEAD>
        <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
        <Meta HTTP-Equiv="Content-Type" Content="text/html; charset=EUC-KR">
    </HEAD>
    <BODY>
    <table cellpadding=0 cellspacing=0 border=0 width="80%">
    <tr>
        <td colspan = 3 bgcolor=black></td>
    <tr>
        <td width=1 bgcolor=black></td>
        <td height=20 bgcolor=orange>
            &nbsp;&nbsp;FROM : <%=MailSenderAddress%></td>
        <td width=1 bgcolor=black></td>
    </tr>
    <tr>
        <td colspan = 3 bgcolor=black></td>
    <tr>
        <td width=1 bgcolor=black></td>
        <td height=20 bgcolor=skyblue>
            &nbsp;&nbsp;TITLE : <%=MailSubject%></td>
        <td width=1 bgcolor=black></td>
    </tr>
    <tr>
        <td colspan = 3 bgcolor=black></td>
    <tr>
        <td width=1 bgcolor=black></td>
        <td height=30 bgcolor=#eeeeee align=right>

    <%=CdoBodyFormats.CdoBodyFormatText%>
    <%
    if request("type")="text" then
    %>
        <A href="view.asp?MsgID=<%=Mailindex%>&type=html" >HTML로 보기</a> /
    <%
    else
    %>
        <A href="view.asp?MsgID=<%=Mailindex%>&type=text" >TEXT로 보기</a> /

    <%end if
    %>

    <A href="view_code.asp?MsgID=<%=Mailindex%>">원문보기</a> &nbsp;&nbsp;&nbsp;&nbsp;
        <td width=1 bgcolor=black></td>
    </tr>
    <tr>
        <td colspan = 3 bgcolor=black></td>
    <tr>
        <td width=1 bgcolor=black></td>
        <td align=middle style="COLOR: white; FONT-FAMILY: verdana; FONT-SIZE: 8pt" bgcolor=#255cb2>
    C&nbsp;&nbsp;&nbsp;&nbsp;O&nbsp;&nbsp;&nbsp;&nbsp; N&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;&nbsp;&nbsp;&nbsp; E&nbsp;&nbsp;&nbsp;&nbsp;N&nbsp;&nbsp;&nbsp;&nbsp;T</td>
        <td width=1 bgcolor=black></td>
    </tr>
    <tr>
        <td colspan = 3 bgcolor=black></td>
    <tr>
        <td width=1 bgcolor=black></td>
        <td align=middle>
        <br><BR>
        <table cellpadding=0 cellspacing=0 border=0 width="90%">
        <tr>
            <td><%=Content%></td>
        </tr>
        </table>
        <br><br>

    <%
    'Set DbCon=Server.CreateObject("ADODB.Connection")
    'DbCon.Open ("DSN=;UID=;PWD=")

    'sql="insert into Mail_ObjMessage(G_ID,G_Title,G_Sender,G_Text,Content,G_HTML_Content,G_Date)"
    'sql= sql & "values('" & request("UserCheck")("Userid") & "', '" & subject & "' ,'" & sender & "' ,'" & MailContentText & "' ,'" & MailContentHTML & "' , '" & M_Date &"') "
    'DbCon.Execute(sql)

    'Set Docon=Nothing

    'ObjMessage(index).delete --> 해당 메일을 메일 박스에서 지워 버림<BR>
    %>

    '이 부분은.. 메일을 보게 되면 받은 편지함으로 이동되게 DB를 사용해서 구현하는 부분으로..
    프로그래머에 따라 처리 하는 법이 틀릴 것 같아.. 기능에는 넣지 않았지만.. 여러분들이 좋은 방법을 한번 생각해 주세여.

        <td width=1 bgcolor=black></td>
    </tr>
    <tr>
        <td colspan = 3 bgcolor=black></td>
    <tr>
        <td width=1 bgcolor=black></td>
        <td bgcolor=#eeeeee>
        <table cellpadding=0 cellspacing=0 border=0 width="100%">
        <tr>
            <td width=80 valign=top align=middle>
            <br>
            첨부화일
            <br><br>
            </td>
            <td width=1 bgcolor=black></td>
            <td width=5></td>
            <td>

    <%
    intLoop=1

    do while IntLoop < ObjUserMessage.Attachments.count + 1
        Response.Write "<a href=file_view.asp?MsgID=" & Mailindex &"&FileID=" & IntLoop & ">" & ObjUserMessage.Attachments(intLoop).name & "</a><br>"
        IntLoop=IntLoop+1

    loop %>

    '메시지에 어태치 된 파일을 루프를 돌려서 찾아봄

    < %
    set ObjUserMessage=nothing
    set ObjMessage=nothing
    set objsession=nothing
    %>

    '사용한 객체들의 자원 반환

            </td>
        </tr>
        </table>
        </td>
        <td width=1 bgcolor=black></td>
    </tr>
    <tr>
        <td colspan = 3 bgcolor=black></td>
    </tr>
    </table>
    </BODY>
    </HTML>


이번 강좌도 어렵다기 보다.. 이해를 하시고 넘어가는 부분이 많이 필요하죠.
http://msdn.microsoft.com/library/psdk/cdo/amsmtp_3qcf.htm

 

 

4. CDO For NTS 웹메일 만들기(메일 읽기)

안녕하세여? 허접 굿보이입니다. 최근에 강좌가 조금 늦어지고 있는데 정말 정말 죄송합니다.
회사일과 개인적인 일이 겹치는 바람에... 죄송 죄송....

이번에는 메일을 읽을때 첨부화일이 있으면 그 첨부화일을 다운로드 받는 기능입니다.
이 기능을 구현하는데 있어 한글 화일명이 정말 문제가 많이 되었습니다.

URLDecoding 알고리즘을 구해서 깨어진 한글명을 디코딩도 해보구 저장된 파일의 파일명을 가져다가도 해보구 다 실패 했는데.. 한가지 자바 스크립트의 location.href를 통해서 구현하는 방법을 쓰게 되었습니다.
휴~~ 골치 아픈 한글화일명.. 이것도 뽀록성짙은 구라 코드에 가까운 것이라.. 아마 여러분들이 더 다듬어야 할 부분이 많을 듯 합니다. 제가 생각해도 참 뽀록성이 넘 짙네여~ 크크크...

이번 소스를 실행하기 전에 먼저 첨부화일이 저장될 디렉토리를 가상디렉토리로 잡아 웹에서
그 화일을 다운로드 받을 수 있게 해야 합니다. 저 같은 경우는 D드라이브의 한 디렉토리를 maildown으로 가상 디렉토리로 잡고 그 안에 폴더를 만들었습니다.

그리고 그 폴더의 보안을 IUSR_컴퓨터이름 을 가진 사람이 쓰고 지울 수 있도록 해 주어야
파일을 저장하는데 문제가 없습니다. 이 점 꼭 유념하여 주십시오.

(http://goodboys.pe.kr 의 Webmail 메뉴에서 확인하실 수 있습니다.
ID:guest , Password:guest 입니다.)

아래 공개되는 소스와 동일하니 동작 과정은 제 홈에서 확인하시기 바랍니다.

 

 

 


Flash
file_view.asp 소스 코드

    <%

    Set objSession = Session("CdoSession")

    set box = objSession.Inbox.Messages

    index=request("MsgID")
    attindex=request("FileID")
    ‘메시지의 ID값과 파일의 ID값을 넘겨 받아 변수에 저장한다


    Set objFile=box(index)
    Setatt= objFile.attachments(attindex)
    ‘넘겨 받은 파일의 ID 값으로 그 파일의 첨부된 파일을 찾는다.

    filename=att.name
    ‘메일에 첨부된 이름 값을 저장한다.

    UserID=Request.cookies("UserCheck")("UserID")
    ‘로그인시 저장된 쿠키 값을 저장

    strDirectory="d:\mail\"& UserID & "\"
    ‘로그인한 아이디로 폴더를 이미 생성해 놓는다.
    ‘로그인한 아이디의 폴더가 있는지 없는지 검사해서 폴더를 생성해도 된다. 전 시간이 없어서.. 걍 하나 만들어 놓고 테스트를 했다.

    ‘웹메일을 만들 사람이면 회원가입과 연동해서 가입함과 동시에 폴더를 하나 만들어 주는 것도 좋다. 이폴더는 첨부된 파일이 저장되는 곳이다.

    strFile=split(Cstr(filename),".")
    ‘ .으로 구별하여 그 앞값과 그 뒷값을 잘라 낸다.

    StrFile2=StrFile(0)
    ' 파일 확장자를 제거한 파일 이름을 구함.

    strExt = StrFile(1)
    '확장자를 구함.


    ' MS에서 제공하는 파일 관련 기본 콤포넌트를 생성

    Set fso = CreateObject("Scripting.FileSystemObject")

    bExist = True
    ' 우선 파일이 존재한다고 가정

    strFileNameTemp = strDirectory & filename
    ' 저장할 파일의 완전한 이름을 만듦

    countfilename = 0
    ' 파일이 존재할 경우, 이름 뒤에 붙이 숫자를 세팅함.

    While bExist = True ' 우선 있다고 생각함.

        If (fso.FileExists(strFileNameTemp )) Then

            ' 파일이 있으면, 여기로 들어 옵니다.

            '파일 이름에 숫자를 붙인 새로운 파일 이름 생성

            countfilename = countfilename + 1

            strsave=strFile2 & countfilename & "." & strExt

            strFileNameTemp = strDirectory&StrFile2&countfilename & "." & strExt

        else

            strFile3 = strFile2 & countfilename

            strsave=strFile2&"." & strExt

            bExist = False

            ' 파일이 존재하지 않으므로.

        End If

    Wend

    ' Scripting.FileSystemObject를 닫아줌.

    strFileName = strFileNameTemp

    ' 위에서 구한 이름을 저장할때 사용하기 위해

    ' 저장할 파일이름을 만듦.

        'on error resume next

        '---

        '--- Save the file now

        '---

    att.WriteToFile(strFileName)

    downpath="../maildown/"& UserID & "/" & Strsave

    %>

    <Script Language="Javascript">

    parent.main2.location.href='http://goodboys.pe.kr/<%=downpath%>';

    </script>

    ‘저장됨과 동시에 그 파일을 보여 준다.

    ‘main2는 보여주고자 하는 프레임의 이름이고 그 뒤는 그 파일이 존재하는 경로명이다.


이번 강좌는 FileSystemObject에 대한 정확한 이해가 필요합니다. 그리고 화일은 첨부화일을 누를때마다 다른 이름으로 저장되게 현재는 되어 있습니다. 이것을 메일을 읽으면 화일이 자동으로 지정 폴더에 저장되고 메일 내용은 데이터 베이스에 넣어서 화일 저장이 계속되는 일이 없도록 막는 것은 여러분의 임무입니다.
그럼 핵심 내용은 여기서 끝이 났다고 볼 수 있겠죠? 그 다음부터는 바로 여러분의 몫이니까요.
그럼 화이팅입니다.