<!-- 메일 설정 시작 -->
<!-- javax.mail/mail -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<beans:bean id="mailSender"
class="org.springframework.mail.javamail.JavaMailSenderImpl">
<beans:property name="host" value="smtp.gmail.com" />
<beans:property name="port" value="587" /><!-- 465 or 25 -->
<beans:property name="username" value="본인 이메일 계정" />
<beans:property name="password" value="해당 계정의 비밀번호" />
<beans:property name="defaultEncoding" value="utf-8" />
<beans:property name="javaMailProperties">
<beans:props>
<beans:prop key="mail.transport.protocol">smtp</beans:prop>
<beans:prop key="mail.smtp.auth">true</beans:prop>
<beans:prop key="mail.smtp.starttls.enable">true</beans:prop>
<beans:prop key="mail.debug">true</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
@Controller
public class MailSendController {
@Autowired
MailSender sender;
@ResponseBody
@RequestMapping("/mail/send")
public String sendMail() {
//메일내용설정해주기
SimpleMailMessage message = new SimpleMailMessage();
message.setTo("보내는사람 이메일~~");
message.setSubject("hiiiiiiiiiiiii");
message.setText("my first email to send a letter");
message.setFrom("받는사람 이메일!!");
sender.send(message);
return "send OK";
}
}
bean으로 설정된 mailSender
는 JavaMailSenderImpl
클래스임.
이 클래스는 JavaMailSender
인터페이스의 구현체. JavaMailSender
를 살펴본다면,
public interface JavaMailSender extends MailSender {}
즉, MailSender
를 상속받기 때문에 다형성이 가능하므로 컨트롤러에서 MailSender
클래스를 주입받을 수 있게 된다.
google의 보안정책이 바뀌어서 설정된 계정으로만 보내짐.
google 계정을 쉽게 만들 수 있기도 하고, 이를 악용하여 악성코드를 보낼 수도 있기 때문인게 아닌가 싶다.
MimeMessage
이용 JavaMailSender
인터페이스는 MimeMessage
객체를 생성해주는 createMimeMessage()
메서드를 제공MimeMessage
객체를 이용해서 메시지를 구성한 뒤 메일 발송@Autowired
JavaMailSender jmsender;
@ResponseBody
@RequestMapping("/mail/send/javamail")
public String sendJavaMailSender() {
MimeMessage message = jmsender.createMimeMessage();
try {
//메일제목설정
message.setSubject("[안내] 처음보내는 JAVAMAIL SENDER", "utf-8");
//html메일내용
String htmlStr = "<h1 style=\"color: lightblue;\">hi everyone~~</h1>"
+ "<a href=\"http://www.naver.com\">naver</a>";
//내용설정
message.setText(htmlStr, "utf-8", "html");
//TO 설정
message.addRecipient(RecipientType.TO,
new InternetAddress("받는사람메일계정", "mand2 님", "utf-8"));
jmsender.send(message);
} catch (MessagingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return "send OK";
}
setText
메서드: subtype
을 설정해주지 않으면 그냥 다 전해짐,, 태그를 텍스트로 인식!
To설정에서 new InternetAddress
를 사용하는 이유?
받는사람의 메일계정이 아닌 사용자 이름으로 보내줄 수 있음
스프링이 제공하는 MimeMessageHelper
클래스를 사용
@RequestMapping("/mail/send/file")
@ResponseBody
public String sendFileAttach() {
MimeMessage message = jmsender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true, "utf-8");
//title
helper.setSubject("[info] file attatched");
//content html
String htmlStr = "<h1>file has been attatched."
+ "please download the file I send </h1>";
//content setting
helper.setText(htmlStr, true);
//to
helper.setTo(new InternetAddress("받는사람 메일주소", "만득이 님", "utf-8"));
//create file instance + absolute root
DataSource dataSource = new FileDataSource("절대경로루트");
helper.addAttachment(MimeUtility.encodeText("파일이름",
"utf-8", "B"), dataSource);
jmsender.send(message);
} catch (MessagingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return "send ok";
}
#1 MimeMessage
객체로 메세지생성
#2 MimeMessageHelper
객체 생성 ( 메세지객체, 파일유무, charset)
#3 메일 제목 설정
#4 내용 html 설정
#5 받는사람 설정
#6 보낼 파일 설정
파일 위치
파일이름 설정
- MimUtility 의 encodeText 메서드를 이용
- 파일이름(한글일 때) 설정
#7 해당 메세지 객체를 send 해주기