메일을 보낼려면 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 번이 들어왔는지 이유를 알지못한게
찜찜하다.
이제 외부에서 보내는 메일은 됬으니 테스트 용으로만 쓰고 데몬을 돌릴땐 서버에 직접 넣어서
돌릴것이니 문제 없을거 같다. 앞으로 더 학습해야될부분은 외부 릴레이 허가시 인증서 로
처리를 하는 부분에 대해서 심도깊게 봐야될것같다.
'자바(JAVA)' 카테고리의 다른 글
JAVA System 설정값들 모두 가져오기 (0) | 2008.08.04 |
---|---|
hibernate antlr/ANTLRException 에러 (0) | 2008.08.03 |
JSTL cannot be resolved error (1) | 2008.08.03 |
제네릭(generic)을 통해 Java Collections 구현 (0) | 2008.08.02 |
Hibernate 입력관련 에러 (0) | 2008.07.24 |
spring 과 hibernate 연결 (0) | 2008.07.20 |
spring 에서 MS SQL JDBC 연동하기 (0) | 2008.07.19 |
전송받은 값이 한글이 깨질때 (0) | 2008.07.18 |