google SMTP 를 이용해서 java 에서 Email 보내기 테스트 |
개발환경 : JDK 1.5, eclipse-galileo, Junit 3.8.2, window XP |
web application 작업시 메일 모듈이 붙는 경우가 있다. 회원인증이나 회원들한테
소식지나 제품을 구매했다면 구내 내역을 보낸다던지 많은 경우의 수가 있다.
메일 관련 모듈을 개발하기 위해서는 없어서 안되는 것이 SMTP 서버이다.
메일을 보내는 역할을 하는 서버인데 이것이 있어야 제대로 소스가 구동이
되는지 확인할수 있기 때문이다.
대용량 메일 테스트가 아니라면 구글에서 사용하는 메일계정으로 테스트가
가능하다. 구글 메일계정이 있다면 POP3 뿐만 아니라 SMTP 서버도 사용이
가능하다. 대용량을 보내게 되면 불법 사용자로 간주 계정이 차단 될것이므로
주의 하도록 한다. 간단한 메일 모듈 테스트로는 적당한 것 같다.
spring framework 에서는 여러가지 유용한 유틸 클래스들이 많이 있는데
그중 하나가 메일을 보낼수 있게 도와주는 클래스이다. org.springframework.mail
패키지에 이런 클래스들이 모여있다.
크게 두 종류로 나눌수 있는데 간단한 메일을 보낼때와 로우 레벨에 대한
제어를 할 수 있는 클래스 두 분류로 나눈다. 간단한 메일을 보낼때는
MailSender 인터페이스와 데이터를 담아서 보낼 캡슐클래스 SimpleMailSender
이 쓰인다. 또한 여기에는 로우레벨의 에러를 감지할수 있는 MailException 이
제공된다.
1. 메일을 보내기위한 준비작업 |
메일을 보내기 위해서는 sun 에서 제공하는 2가지 라이브러리가 필요하다.
이 dependencies library 는 mail.jar, activation.jar 이다. 아래 URL로 다운로드 한후
이클립스 라이브러리 폴더에 포함시킨다.
(1) JavaMail API http://java.sun.com/products/javamail/ 의 mail.jar 이다
(2) JAF http://java.sun.com/javase/technologies/desktop/javabeans/jaf/downloads/index.html
activation.jar
2. 전체 소스에 대한 설명 |
아래 소스는 단위 테스트를 위한 junit 소스이다. 메일을 간단하게 junit 으로 돌려볼수 있도록
해놓은 것이다. 소스에 들어가는 내용중에 준비해야될 것은 사용자 메일계정과 패스워드이며
SMTP 호스트 네임주소는 gmail-smtp.l.google.com 이다. 특징이 있다면 다중메일을 보낼수
있도록 되어 있는데 메일 사용자 정보를 String[] 배열에 담아서 파라미터로 넘기면 된다 .
그리고 다음과 같은 에러가 만난다면 props.put("mail.smtp.starttls.enable","true"); 이 부분을
빼먹은 것이니 주의하기 바란다.
com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first
junit 메일 테스트 전체 소스는 다음과 같다.
import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import junit.framework.TestCase; public class MailTest extends TestCase { public void testMailSend(){ try { String[] emailList = { "to@naver.com" };// 메일 보낼사람 리스트 String emailFromAddress = "from@gmail.com";// 메일 보내는 사람 String emailMsgTxt = "메일 테스트 내용 "; // 내용 String emailSubjectTxt = "잘가는지 테스트 중~~~~~~~~~~";// 제목 // 메일보내기 postMail(emailList, emailSubjectTxt, emailMsgTxt, emailFromAddress); System.out.println("모든 사용자에게 메일이 성공적으로 보내졌음~~"); } catch (MessagingException e) { e.printStackTrace(); } } private void postMail(String recipients[], String subject, String message, String from) throws MessagingException { boolean debug = false; java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); String SMTP_HOST_NAME = "gmail-smtp.l.google.com"; // Properties 설정 Properties props = new Properties(); props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.starttls.enable","true"); props.put("mail.smtp.host", SMTP_HOST_NAME); props.put("mail.smtp.auth", "true"); Authenticator auth = new SMTPAuthenticator(); Session session = Session.getDefaultInstance(props, auth); session.setDebug(debug); // create a message Message msg = new MimeMessage(session); // set the from and to address InternetAddress addressFrom = new InternetAddress(from); msg.setFrom(addressFrom); InternetAddress[] addressTo = new InternetAddress[recipients.length]; for (int i = 0; i < recipients.length; i++) { addressTo[i] = new InternetAddress(recipients[i]); } msg.setRecipients(Message.RecipientType.TO, addressTo); // Setting the Subject and Content Type msg.setSubject(subject); msg.setContent(message, "text/plain"); Transport.send(msg); } /** * 구글 사용자 메일 계정 아이디/패스 정보 */ private class SMTPAuthenticator extends javax.mail.Authenticator { public PasswordAuthentication getPasswordAuthentication() { String username = "id@gmail.com"; // gmail 사용자; String password = "password"; // 패스워드; return new PasswordAuthentication(username, password); } } }
'자바(JAVA)' 카테고리의 다른 글
Ajax 을 사용하여 Form 데이터를 POST 전송하고자 할 때 (4) | 2010.08.02 |
---|---|
swing 으로 제작되었으며 아파치의 HttpClient 를 이용한 웹서비스에 파일 업로드하기 (7) | 2010.07.30 |
아파치에서 배포하는 HttpClient 3.x 를 이용해 네트워크 데이터 전송 (5) | 2010.07.30 |
JAVA 에서 데이터 교환을 위해 JSON 사용하기 (0) | 2010.07.20 |
Spring 에서 트랜잭션 설정시 NoClassDefFoundError TransactionManager 에러 (0) | 2010.07.18 |
PreparedStatement 사용한 like % 쿼리 문자열 합치기 (0) | 2010.07.06 |
cannot call getWriter() after getOutputStream() 에러 (0) | 2009.09.25 |
(5) HSQLDB 과 Spring framework - DBUnit 테스트 환경을 만들어 본다. (0) | 2009.09.09 |