Please Enable JavaScript!
Gon[ Enable JavaScript ]

smtp 서버이용 메일보내기

자바(JAVA)
반응형

메일을 보낼려면 SMTP 서버가 있어야되고 받을려면 POP3 서버가 있어야한다.
JAVA 공개 서버를 사용해도 되겠지만 MS 2003 Server 가 있기에 거기다 smtp 서버를 설치하고
데몬을 돌려 메일을 보낼생각이다. 우선 IIS 에 메일서버설치 절차부터알아보자.
자세한 주소는 다음과 같으며 이것을 따라 설치를 했다.
http://msdn.microsoft.com/ko-kr/library/8b83ac7t(VS.80).aspx

사용자 삽입 이미지

SMTP 서버가 설치 됬다면 서버를 이용할 클라이언트를 만들어본다.
2개의 jar 파일이 필요한데 아래주소로 다운을 받은후 mail.jar , activation.jar 를 lib 추가한다.
http://java.sun.com/products/javamail/downloads/index.html (JavaMail API download)
http://java.sun.com/products/javabeans/jaf/downloads/index.html (JAF download)

그리고 다음 소스를 복사해서 돌려본다.

import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

try{
     //set up the default parameters.
     Properties props = new Properties();
     props.put("mail.transport.protocol", "smtp");
     props.put("mail.smtp.host", "IP");
     props.put("mail.smtp.port", "25");
     //create the session and create the new mail message
     Session mailSession = Session.getInstance(props);
     MimeMessage msg = new MimeMessage(mailSession);
     //set the FROM, TO, DATE and SUBJECT fields
     msg.setFrom(new InternetAddress(
보내는이@mail.com));
     msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(
받는이@mail.com));
     msg.setSentDate(new Date());
     msg.setSubject("JavaMail 테스트");
     //create the body of the mail, 첨부파일 없이 메시지만 전송할 경우
     //msg.setText("Hello! from my first java e-mail...Testing!!/n");
 
     // Create the message part
     BodyPart messageBodyPart = new MimeBodyPart();
 
     // Fill the message
     messageBodyPart.setText("테스트용 메일의 내용입니다.");
     Multipart multipart = new MimeMultipart();
     multipart.addBodyPart(messageBodyPart);
    
     // Part two is attachment
    messageBodyPart = new MimeBodyPart();
    File file = new File("JavaMail_Append.java");
    FileDataSource fds = new FileDataSource(file);
    messageBodyPart.setDataHandler(new DataHandler(fds));
    messageBodyPart.setFileName(fds.getName());
    multipart.addBodyPart(messageBodyPart);
 
     // Put parts in message
     msg.setContent(multipart);
 
     // Send the message
     Transport.send(msg);
 
     //ask the Transport class to send our mail message
       System.out.println("E-mail successfully sent!!");
    }catch(Exception e){
     e.printStackTrace();
    }

전송을 했는데  다음과 같은 에러가 났다.
java.lang.NoClassDefFoundError: javax/activation/DataSource

이부분에서 난것인데 Activation Framework 을 추가하지 않아서 그렇다. 그것은 위에서 추가해야되는
두개의 jar중에 activation.jar  이다.

MimeMessage msg = new MimeMessage(mailSession);

jar 추가하고 다시 돌렸는데 Relay Denied 나는 것이다. 이것은 처음 기본 셋팅값이 외부에서 메일을
보낼려는 Relay 시도를 막고 있기 떄문이다. 난 서버에 올리기전에 외부에서 작업을 했기 때문에
Relay deny 가 난것이다.  그래서 서버에 릴레이 허가를 주면 되는데 문제는 작업컴퓨터 IP 가 고정이
아니였으며 공유기로 공유한거라 가상 아이피가 잡혀있는것이다.

SMTP server response: 550 5.7.1 Unable to relay..

사용자 삽입 이미지
이제 외부로 나가는 IP를 알아야 한다. 그래서 DOS 에서 tracert [목적지주소] 를 날리니 표시한 부분의
외부로 나가는 것이 찍히는것이다 . 그래서 열라게 서버에 릴레이 허가 하도록 찍었다.

사용자 삽입 이미지
그런데 계속 같은 에러가 나는것이다 . 아 무엇이 문제 일까 싶어서 로그를 보기로 했다. 그런데
제일 뒷자리가 1번이 되야되는데 로그에는 120 찍혀있는것이다. 왜 120 번 인지는 모르겠지만
여하튼 문제점을 찾았으니 된것 아닌가.  그래도 왜 120 번이 들어왔는지 이유를 알지못한게
찜찜하다.
사용자 삽입 이미지
사용자 삽입 이미지
이제 외부에서 보내는 메일은 됬으니 테스트 용으로만 쓰고 데몬을 돌릴땐 서버에 직접 넣어서
돌릴것이니 문제 없을거 같다. 앞으로 더 학습해야될부분은 외부 릴레이 허가시 인증서 로
처리를 하는 부분에 대해서 심도깊게 봐야될것같다.

반응형
Posted by 녹두장군1
,