스프링에서 제공하는 메일은 다양한 형태를 지원한다.
그중에 Velocity Engine을 이용하여 Template메일을 보낼수 있다.
SpringReference를 보면서 하나씩 세팅하면서 테스트 한 결과는 다음과 같다.

VelocityEngine에 대한 xml 세팅은 다음과 같다.
<bean id="velocityEngine"
  class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
  <property name="velocityProperties">
   <props>
    <prop key="resource.loader">class</prop>
    <prop key="class.resource.loader.class">
     org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
    </prop>
   </props>
  </property>
 </bean>

이렇게 선언된 velocityEngine은
<bean id="springMailSender"
  class="com.xxx.xxxx.mail.SpringMailSender" abstract="true">
  <property name="mailSender" ref="mailSender" />
  <property name="velocityEngine" ref="velocityEngine" />
 </bean>
으로 세팅하고...
본문내용은
String mailText = VelocityEngineUtils.mergeTemplateIntoString(
     velocityEngine, "com/xxx/mail/mailContent.vm",
     new HashMap());

을 이용하여 변환한 내용을 메일로 발송하는 것이다.

그런데 위의 방법은 *.vm 파일이 클래스 패스에 있어야만 파일을 찾아서 파싱할수 있다.
일반 파일로 바꾸기 위해서는 다음과 같이 변경해야 한다.
<property name="velocityProperties">
   <props>
    <prop key="resource.loader">file</prop>
    <prop key="file.resource.loader.class">org.apache.velocity.runtime.resource.loader.FileResourceLoader
    </prop>
    <prop key="file.resource.loader.path">${webapp.root}/WEB-INF/velocity</prop>
    <prop key="file.resource.loader.cache">false</prop>
   </props>
  </property>

그런데 위의 내용중에 ${webapp.root}가 있는데... 별도의 properties를 선언해서 webapp.root를 선언해야 한다. 음... 좀 거시기 하다... 귀찮기도 하고...

그래서 다시 찾아본 결과... (영어가 짧아서 자세히 읽어보지 않으면 잘 모르고 그냥 지나치곤 한다.)

<property name="resourceLoaderPath" value="WEB-INF/velocity"/>

이거 한줄이면 다 된다. ㅎㅎㅎ

암튼 짧은 영어라도 천천히 읽어보면 답이 보인다.





아파치 진영에서 자바메일관련된 것을 찾다가 발견했다. JAMES...

메일테스트 하나 하고 싶어도 메일서버 세팅이 귀찮고 여건이 안되 하기 힘들었는데...

1. 일단 다운받는다. http://james.apache.org 요기가면 있다. 최신 버전(2.3)을 받았다.
2. 압축을 푼다. 근데 폴더 경로에 공백같은거 있으면 곤란하다...
3. run.bat를 더블 클릭한다.
    쫌 있다가 아래와 같은 화면 나오면 끝이다.

사용자 삽입 이미지

4. 메일이 잘 가는지 테스트 해보자.
 4-1. 일단 계정생성한다.
  telnet localhost 4555  하면  id/pw 물어본다. Default는 root/root다.
Welcom root. HELP for a list of commands 라고 나온다. 그리고 깜빡깜빡..
adduser test 1111
User test added
adduser test2 1111
User test2 added 라고 나오면 끝.
 4-2. 메일 발송 테스트한다.
\telnet localhost 25
하면 다음과 같은 화면이 나온다.
220 HostName SMTP Server (JAMES SMTP Server 2.3.1) ready Wed, 31 Oct 2007 20:43:59 +0900 (KST)
helo localhost
mail from: <test@localhost>
rcpt to: <test2@localhost>
data
subject: This is Test Mail with JAMES...
어쩌구 저쩌구 메일내용 쓰고

.

하면...
250 2.6.0 Message received 나오면 성공이다.
사용자 삽입 이미지

메일은 설치폴더 밑에 저장된다.
사용자 삽입 이미지

파일관리가 귀찮다면 MySQL을 깔아서 메일 주고 받는 부분을 테스트 할수도 있다.
\james\apps\james\SAR-INF\config.xml파일에서 file:// 되어 있는 부분을 주석처리하고 db: 로 되어 있는 부분 주석을 풀어준다.
변경될 부분은...
inboxRepository, repositoryPath,outgoing, spoolrepository, spam의 repositoryPath, repository name 등이다.

dburl부분에 자신의 환경에 맞게 변경한다.
사용자 삽입 이미지

jdbc-driver도 버전에 맞는 것을 넣도록 하자.

다시 JAMES 설치폴더/bin에 가서 run.bat하자...
테이블은 알아서 생긴다. database만 미리 만들어 주고 지정하면...

file에서 생성된 user가 그대로 따라오지 않기 때문에 adduser를 이용해서 user는 다시 생성해야 한다. 생성하면 users테이블에 추가된다.
메시지를 보내고 나면 inbox테이블에 받은 메일이 쌓이게 된다.

자바를 이용해서 메일을 보내야 하는데... 자바메일에 관련된 jar를 lib(activation.jar, mail.jar 이정도?)에 넣었다면... 간단테스트를 할수 있다.

대출 클래스 하나 만들고 아래정도의 메소드 만들어서 테스트 할수 있다.

public class MailTest {

public void mailSend() {
        String smtp_addr ="127.0.0.1";
        String sender_addr ="webmaster@localhost";
        String sender_nm  = "관리자";
        String receiver = "test@localhost" ;
        String subject = "TITLE of Mail.......";
        String content = "Hello This is Test Mail" ;
        try
        {
            // 기본적인 메소드를 선언한다.
            Properties props = new Properties();
           
            props.put("mail.smtp.host",smtp_addr);
            Session session = Session.getDefaultInstance(props,null);
            MimeMessage message = new MimeMessage(session);

            message.setFrom(new InternetAddress(sender_addr,sender_nm, "euc-kr"));

            InternetAddress[] tos = InternetAddress.parse(receiver);
            message.setRecipients(Message.RecipientType.TO, tos);
            message.setSubject(subject, "euc-kr");

            Multipart multipart = new MimeMultipart();
            //메일 내용을 Setting한다.
            MimeBodyPart messageBodyPart = new MimeBodyPart();

            messageBodyPart.setText(content, "euc-kr");
            //messageBodyPart.setContent(content, "text/html;charset=euc-kr");

            multipart.addBodyPart(messageBodyPart);
            message.setSentDate(new java.util.Date());
            message.setContent(multipart);

            Transport transport = session.getTransport("smtp");

            Transport.send(message);
            transport.close();

        }
        catch(Exception e)  {
               e.printStackTrace();
        }
 }