smtp 서버가 따로 존재한다는 가정이 필요하다. smtp 서버는 여기서는 네이버 smtp를 사용하였다.
네이버에서 smtp를 활용하는 방법은 어렵지 않다. (구글이나 다음도 거의 비슷하다)
위 세팅이 끝나면 맨 하단의 SMTP 정보를 기록하자.
스프링(전자정부)에서는 간단하게 구현하였다.
Bean 객체로 등록해서 사용하도록 하였다.
여기서는 maven을 활용한 라이브러리 추가를 하였다.
가장 먼저 pom.xml 을 열어 mail 라이브러리를 추가한다. 혹시 버전에러가 생기면 자신의 프로젝트 버전에 맞추어서 버전을 바꾸도록 한다.
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
기능구현은 어렵지 않다. 구글링을 해 보면 정말 잘 나와있다.
setter와 getter 메소드를 추가해서 bean 객체로 등록 할 준비를 한다.
package 패키지명;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
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;
import javax.mail.internet.MimeUtility;
public class TestMailer {
private static final int port= 465; //어짜피 포트번호는 대부분 465를 사용한다. 아닐경우 변경하여주자.
private String host;
private String user;
private String tail;
private String password;
//하단 setter, getter를 활용한 정보 주입
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getTail() {
return tail;
}
public void setTail(String tail) {
this.tail = tail;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
private Properties props = System.getProperties();
private boolean setEnv(){
props.put("mail.smtp.host", host);
props.put("mail.smtp.port", port);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.ssl.trust", host);
return true;
}
//파일 없이 전송
public boolean sendMail(String receiver,String title, String text) throws Exception{
setEnv();
Message msg = sendingHead();
sendingBody(msg, receiver, title, text);
msg.setText(text);
Transport.send(msg);
return true;
}
//파일과 함께 전송
public boolean sendMail(String receiver,String title, String text, String filePath, String fileName) throws Exception{
setEnv();
Message msg = sendingHead();
sendingBody(msg, receiver, title, text);
if(filePath != null && filePath.length() > 0){
Multipart multipart = new MimeMultipart();
MimeBodyPart textBodyPart = new MimeBodyPart();
textBodyPart.setText(text,"UTF-8");
MimeBodyPart attachmentBodyPart= new MimeBodyPart();
DataSource source = new FileDataSource(filePath);
attachmentBodyPart.setDataHandler(new DataHandler(source));
attachmentBodyPart.setFileName(MimeUtility.encodeText(fileName, "UTF-8", null));
multipart.addBodyPart(textBodyPart); // add the text part
multipart.addBodyPart(attachmentBodyPart); // add the attachement part
msg.setContent(multipart);
}
Transport.send(msg);
return true;
}
private Message sendingHead(){
Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
String un = user;
String pw = password;
protected javax.mail.PasswordAuthentication getPasswordAuthentication() {
return new javax.mail.PasswordAuthentication(un, pw);
}
});
session.setDebug(true); //for debug
Message msg = new MimeMessage(session); //MimeMessage 생성
return msg;
}
private void sendingBody(Message msg, String receiver, String title, String text) throws Exception{
msg.setFrom(new InternetAddress(user + tail)); //발신자 셋팅 , 보내는 사람의 이메일주소를 한번 더 입력합니다. 이때는 이메일 풀 주소를 다 작성해주세요.
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(receiver)); //수신자셋팅
msg.setSubject(title); //제목셋팅
}
}
람다식을 활용하면 더 깔끔해 질 것 같은데..개발환경이 1.7에 맞추어 진 점이 매우 아쉽다.
위와같이 클래스를 만들고 설정을 기록할 xml에 해당 객체를 추가하여 주자.
서블릿-context.xml도 되고 기타 원하는 xml에 등록해도 된다.
<bean id='testMailer' class="패키지명.TestMailer">
<property name="host" value="smtp.naver.com" />
<property name="password" value="계정비밀번호" />
<property name="tail" value='@naver.com'/>
<property name="user" value='계정아이디'/>
</bean>
컨트롤러 또는 서비스에서는 간단하게 사용 가능 하다.
아래는 컨트롤러 예제이다.
@Autowired
private TestMailer testMailer; //사용
@RequestMapping(value = "/sendmail.do")
@ResponseBody
public String sendmail(@RequestParam HashMap<Object, Object> param) {
try {
testMailer.sendMail("받는대상", "이것은 제목", "스프링으로 구현해서 보내본다.\n파일없이 보낸다.");
} catch (Exception e) {
e.printStackTrace();
return "FAIL";
}
try {
testMailer.sendMail("받는대상", "이것은 제목", "스프링으로 구현해서 보내본다.","E:/파일위치","보낼파일명.확장자");
} catch (Exception e) {
e.printStackTrace();
return "FAIL";
}
return "SUCC";
}
반응형
'Spring framework' 카테고리의 다른 글
Javascript 배열(Json)값을 Java 객체로 저장하기 (0) | 2019.06.17 |
---|---|
전자정부, MongoTemplate 빈 생성 오류 (0) | 2019.06.03 |
Mybatis와 일반적인 DB커넥션 그리고 DBMS의 속도에 관해 (0) | 2019.04.29 |
Software caused connection abort: socket write error (0) | 2019.04.29 |
Spring 또는 전자정부, AOP가 되지 않는 경우 (0) | 2019.04.29 |
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)
댓글