SMTP 서버가 인증정보를 요구할 때가 있는데 우리회사가 그렇다. 몇해전까지만해도 이렇지 않았는데 메일서버를 업그레이드 하면서 정책을 바꿧다.

현재 사내 메일 수신자에게는 상관이 없지만 메일을 외부로 보낼려하면 제목과 같은 오류가 난다.
이를 해결하려면 다음과 같이 하면된다.

일단 mail-service.xml 파일을 만들어서 JBoss의 deploy 폴더에 둔다.

<?xml version="1.0" encoding="UTF-8"?>
<!-- $Id: mail-service.xml 62349 2007-04-15 16:48:15Z dimitris@jboss.org $ -->
<server>

  <!-- ==================================================================== -->
  <!-- Mail Connection Factory                                              -->
  <!-- ==================================================================== -->

  <mbean code="org.jboss.mail.MailService"
         name="jboss:service=Mail">
    <attribute name="JNDIName">java:/mail/whatever</attribute>
    <attribute name="User">you@yourdomain.com</attribute>
    <attribute name="Password">yourpassword</attribute>
    <attribute name="Configuration">
      <!-- A test configuration -->
      <configuration>
        <!-- Change to your mail server prototocol -->
        <property name="mail.store.protocol" value="pop3"/>
        <property name="mail.transport.protocol" value="smtp"/>

        <!-- Change to the user who will receive mail  -->
        <property name="mail.user" value="you@yourdomain.com"/>

        <!-- Change to the mail server  -->
        <property name="mail.pop3.host" value="yourpop3.yourdomain.com"/>

        <!-- Change to the SMTP gateway server -->
        <property name="mail.smtp.host" value="yoursmtp.yourdomain.com"/>

        <!-- The mail server port -->
        <property name="mail.smtp.port" value="25"/>

        <!-- Change to the address mail will be from  -->
        <property name="mail.from" value="you@yourdomain.com"/>

        <!-- Enable debugging output from the javamail classes -->
        <property name="mail.debug" value="false"/>

        <property name="mail.smtp.auth" value="true"/>

      </configuration>
    </attribute>
    <depends>jboss:service=Naming</depends>
  </mbean>

</server>

중요한건 굵게 강조한 부분이 한줄 더 들어가면 된다는 것이다.
그리고 인증정보는 JNDI 이름아래에 있는 User과 Password 부분인데.
User는 이메일 전체를 사용해야한다..여기서 you가 아니라 you@yourdomain.com 이 된다. 이 두개만 조심하면 될거다.

그럼 얘를 사용하는 예제를 한번 적어 줄테니...활용하도록

package com.kisinfo.sarah.session.mail;

import java.util.Date;

import javax.annotation.Resource;
import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.naming.InitialContext;

import org.apache.log4j.Logger;
import org.jboss.annotation.ejb.LocalBinding;
import org.jboss.annotation.ejb.RemoteBinding;

import com.kisinfo.sarah.values.profile.Profile;
import com.kisinfo.sarah.values.user.User;


@Stateless
@Local ({MailAgentLocal.class})
@LocalBinding(jndiBinding="ejb/MailAgentLocal")
@Remote ({MailAgentRemote.class})
@RemoteBinding(jndiBinding="ejb/MailAgentRemote")

public class MailAgentBean implements MailAgentLocal,MailAgentRemote {
 
 @Resource
    public SessionContext ctx;
 
    private Logger logger = Logger.getLogger(this.getClass());
   
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void send(User user,Profile sender,Profile receiver,String subject,String content) throws MailException {
     try {
      InitialContext ic = new InitialContext();
      javax.mail.Session session = (javax.mail.Session)ic.lookup("java:/mail/whatever");

            
         MimeMessage message =   new MimeMessage(session);
         boolean parseStrict =   false;
        
         InternetAddress f = InternetAddress.parse(sender.email,parseStrict)[0];
         f.setPersonal(user.name,"euc-kr");
         message.setFrom(f);
         message.setRecipients(Message.RecipientType.TO,InternetAddress.parse(receiver.email, parseStrict));
  
         message.setSubject(subject);
 
         String  mailer  =   "sendMessage";
         message.setHeader("X-Mailer",mailer);
         message.setSentDate(new Date());
        

         MimeBodyPart mbp1 = new MimeBodyPart();
         mbp1.setContent(content,"text/html;charset=euc-kr");
         Multipart mp = new MimeMultipart();
         mp.addBodyPart(mbp1);
         message.setContent(mp);
    
          Transport.send(message);      
     }
     catch(Exception e) {
      logger.error(e);
      throw new MailException(e);
     }
    }

}

Posted by
,