2024년 1월 23일 화요일

Java 로 gmail을 이용해서 SMTP 메일 보내는 방법


 간단하게 SMTP로 메일 보내는 방법을 기술한다.

보안적으로 약간은 부족할수있다.

먼져 설정해야 할것은 Gmail 설정을 해줘야 한다.

1. 앱 비밀번호 만들기

구글 계정에 로그인하여 보안을 선택해준다.

로그인하는 방법에서 2단계 인증을 추가해준다.





2단계 인증절차를 진행해준다.
설정을 완료하면 2단계 인증 설정이 완료된다.
다시 2단계 인증화면으로 들어가 하단에 앱비밀번호를 설정해준다.




앱 이름을 적어주고 앱비밀번호를 설정해준다.
















16자리 비밀번호를 잘 저장해놓는다. (한번생성되면 확인불가)
생성된 앱정보를 확인 가능하다.








그럼 중요한 코드
Java maven 을 기준으로 하면 먼져 의존성을 추가해주고 코드를 작성하면 끝난다.

pom.xml 파일에 추가해준다.
```
<!-- Gmail -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>javax.mail-api</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
```
application.properities 에 mail 정보를 기입해준다.

```
#gmail
email.user=email
email.password=password
email.smtp.host=smtp.gmail.com
email.smtp.port=465
```

메일 작성코드를 작성해준다.
```
package com.shop.controller;

import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class EmailSender {
private Properties emailConfig;

public EmailSender() throws Exception {
this.emailConfig = loadEmailConfig();
}

private Properties loadEmailConfig() throws Exception {
Properties props = new Properties();
// application.properties 파일을 로드합니다.
props.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("application.properties"));
return props;
}

public void sendEmail(String recipient, String subject, String text) throws MessagingException {
Properties props = createEmailProperties();
Session session = createSession(props);

Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(emailConfig.getProperty("email.user")));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipient));
message.setSubject(subject);
message.setText(text);

Transport.send(message);
}

private Properties createEmailProperties() {
Properties props = new Properties();
props.put("mail.smtp.host", emailConfig.getProperty("email.smtp.host"));
props.put("mail.smtp.port", emailConfig.getProperty("email.smtp.port"));
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.ssl.trust", emailConfig.getProperty("email.smtp.host"));
return props;
}

private Session createSession(Properties props) {
return Session.getInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(emailConfig.getProperty("email.user"), emailConfig.getProperty("email.password"));
}
});
}

public static void main(String[] args) {
try {
EmailSender sender = new EmailSender();
sender.sendEmail("testemailaddress@gmail.com", "테스트 메일입니다.", "이것은 테스트 메일입니다. \n\n 잘 갔나요?");
} catch (Exception e) {
e.printStackTrace();
}
}
}
```