본문 바로가기
Dev/ETC

메일 Open 확인

by nakanara 2008. 12. 24.
반응형
2008/12/23 - [컴퓨터/900. Ect] - Java 메일 보내기

메일 전송 시 받은 사람이 메일을 확인했는지에 대한 파악이 필요하여 구현하게 되었으며 http://flashcafe.org/ 에서 많은 도움을 받았습니다.

개요는 다음과 같습니다. 특정인에게 전자 메일을 전송하였을 때 그 사람이 해당 메일을 Open 했는지 파악을 하기 위해서 구성한 것입니다. 확인 메일 등은 메일을 받는 수신자가 전송하지 않을 수도 있고 지원하지 않는 경우도 많기 때문에 이미지 다운로드를 하는 방식으로 바꾸었습니다.

다음의 소스를 구현하기 위해서는 하나의 Servlet 파일이 필요합니다.
(메일 구현은 아래 부분에서..)

1. 이 메일 내용에 HTML 의  IMG 태그를 사용하여 메일 내용을 작성합니다.
  <img src=\"http://192.168.10.177/lims/mailOpenCheck.do?userId=001/>
 
메일을 열어 볼 때 IMG 태그의 이미지를 가져오기 위해서 서버의 Servlet 파일에 접근을 합니다. 그 때 원하시는 작업을 하실 수 있습니다. userId등의 Key 를 받아서 메일 Open 체크 및 시간 체크를 할 수도 있습니다. 하지만 중요한 Key 등의 정보는 포함하지 않는 것이 좋습니다.
  그 외에도 iframe 기능을 사용하여 파일을 불러올 수도 있습니다.

2. Servlet 을 작성합니다.

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

/**
*
* @see 호출한 곳에 Image 쓰기.
*/
public class MailOpenCheck extends HttpServlet {
    private static Logger logger = Logger.getLogger("MailOpenCheck");

    /**
     * @param req 들어오는 request
     * @param resp 나가는 Response
     * @throws Exception
     */
    protected void getImage(HttpServletRequest req, HttpServletResponse resp) throws Exception {
        // 받을 key
        String userId= req.getParameter("userId");        

        // 표시할 Image
        String convFileNm = "sample.jpg";
        File tempFile = new File("C:/img" + "/" + convFileNm);

        // 타입 설정.
        resp.setContentType("image/gif");
        javax.servlet.ServletOutputStream servletoutputstream1 = resp
                .getOutputStream();

        // 파일 쓰기.
        dumpFile(tempFile, servletoutputstream1);

        servletoutputstream1.flush();
        servletoutputstream1.close();

        // DB에 저장 등 Open 한 경우에 대한 처리 로 직을 구현합니다.
        
    }

    /**
     * @see outputstrame 에 파일 쓰기.
     * @param realFile
     * @param outputstream
     */
    private void dumpFile(File realFile, OutputStream outputstream) {
        int MAX_BYTE = 4096;
        byte readByte[] = new byte[MAX_BYTE];

        try {
            BufferedInputStream bufferedinputstream = new BufferedInputStream(
                    new FileInputStream(realFile));
            int i;
            while ((i = bufferedinputstream.read(readByte, 0, MAX_BYTE)) != -1) {
                outputstream.write(readByte, 0, i);
            }
            bufferedinputstream.close();
        } catch (Exception e) {
            logger.error("dumpFile() requested, Exception is " + e);
        }
    }

    /* (non-Javadoc)
     * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
     */
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                    throws ServletException, IOException {
        try {
            getImage(req, resp);
        }catch (Exception e) {
            System.out.println("err = "  + e.getMessage());
        }
    }

    /* (non-Javadoc)
     * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
     */
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                    throws ServletException, IOException {
        try {
            getImage(req, resp);
        }catch (Exception e) {
            System.out.println("err = "  + e.getMessage());
        }
    }
}


위 과정으로 했을 경우 Web메일로 정상적으로 받을 경우에는 작동하지만 이미지등을 막아 둔 경우에는 처리 되지 않을 수 있습니다. 주의하세요.

* 문제점이나 지적은 ^^ 많이 해주세요 그럼 수고하세요

글 작성시 참고한 글 (감사합니다.)
1. http://flashcafe.org/programming_study/12027/page/2 (PHP)
2. http://widelake.net/5

반응형

'Dev > ETC' 카테고리의 다른 글

JavaScript String Byte 구하기.  (0) 2010.08.13
My Sql 계정 생성 방법 및 1045 오류  (0) 2009.04.06
Java 메일 보내기  (0) 2008.12.23
PDA에서 PDF파일 보기  (0) 2008.11.24
이클립스 단축키  (0) 2008.11.23