본문 바로가기
카테고리 없음

[Java] JavaMail API 사용하여 자동 이메일 보내기 (1)

by teamnova 2025. 4. 9.
728x90

 

안녕하세요 오늘은 자바의 mail 전송 API 인 JavaMail API 를 사용하여 

자동으로 이메일을 보내는 기능을 구현해보겠습니다. 

 

이 기능을 통해 본인에게 알림 메일 보내는 시스템을 만들거나, 팀원들에게 매일 자동으로 리포트 파일을 보내거나 

아니면 제 2외국어 학습을 위해 매일 일정 개수에 해당하는 단어장을 발송받아 볼수도 있습니다. 

 

 

 

1. 의존성 추가 

먼저 자바 maven 인 경우 아래 경로에서 라이브러리 버전 확인 후 의존성을 추가해줍니다. 

  <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

 

https://mvnrepository.com/artifact/jakarta.mail/jakarta.mail-api 

 

 

 

2. EmailSender.java 

이메일 발신, 수신 주소 설정과 이메일에 포함될 내용을 설정, 메일을 직접 전송하는 과정이 담긴 파일입니다

 

public class EmailSender {

    public static void send(){


        final String username = "prov***@gmail.com"; // 보내는 사람 메일
        final String password = "16자리 앱비밀번호 발급후 사용"; // 앱 비밀번호
        // Google 앱 비밀번호 발급 방법: 구글 계정 -> 보안 설정 -> 앱 비밀번호 메뉴 이동 -> 앱 이름 새로 만들기 -> 비번 생성됨


        String to = "prov***@gmail.com"; // 받는 사람 메일
        String subject = "자동 메일 테스트";
        String body = "안녕하세요. 이 메일은 자바로 자동 전송된 메일입니다. 오늘은 2025년 4월 9일입니다";

        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.port", "587");

        Session session = Session.getInstance(props, new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });

        try {
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(username));
            message.setRecipients(
                    Message.RecipientType.TO,
                    InternetAddress.parse(to)
            );
            message.setSubject(subject);
            message.setText(body);

            Transport.send(message);
            System.out.println("메일 전송 완료!");
        } catch (MessagingException e) {
            e.printStackTrace();
        }


    }
}

 

 

1) 앱 비밀번호 설정 

먼저 메일 보내는 사람과 받는 사람을 설정해줍니다. 

해당 포스트에서는 구글에서 제공하는 Gmail SMTP 서버를 사용하였습니다.

메일을 보내는 시스템을 만들기 위해서는 해당 계정에 대한 권한이 필요합니다. 

String password 하단에 써진대로 Gmail 계정에서 발급하는 16자리 임시 비밀번호를 String password 값에 넣어줍니다. 

편의상 받는 사람 메일도 동일한 계정으로 진행하였습니다 

 

 

 

2) 메일에 포함될 내용 추가 

메일을 통해 받아보고자 하는 내용을 자유롭게 추가합니다. 

  String to = "prov***@gmail.com"; // 받는 사람 메일
        String subject = "자동 메일 테스트";
        String body = "안녕하세요. 이 메일은 자바로 자동 전송된 메일입니다. 오늘은 2025년 4월 9일입니다";

 

 

 

3) SMTP 서버 접속을 위한 외부 네트워크 설정 

JavaMail이 Gmail SMTP 서버에 안전하게 접속해서 메일을 전송할 수 있도록
네트워크 및 보안 관련 설정을 지정해주는 부분입니다

   Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.port", "587");

 

 

4) 메일 보내기 

SMTP 전송은 외부 네트워크 통신이기 때문에 실패 가능성이 있기 때문에 try-catch 문을 사용합니다

try {
    Message message = new MimeMessage(session);
    message.setFrom(new InternetAddress(username));
    // ... 생략 ...
    Transport.send(message);
    System.out.println("메일 전송 완료!");
} catch (MessagingException e) {
    e.printStackTrace();
}

 

 

 

 

3. AutoMailer.java 

메일 전송 메소드를 원하는 반복주기마다 호출하는 메소드입니다. 

예제 상에서는 1분마다 발송되도록 설정하였습니다. 

public class AutoMailer {
    public static void main(String[] args) {
    
        ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

        long initialDelay = 0;           // 바로 시작
        long period = 1;                 // 1분마다

        scheduler.scheduleAtFixedRate(() -> {
            EmailSender.send(); // 여기서 메일 전송 메서드 호출
        }, initialDelay, period, TimeUnit.MINUTES);
    }
}

 

 

 

만약 매일 오전 9시에 메일을 받아보고싶다면 아래와 같이 수정할 수 있습니다. 

public class AutoMailer {
    public static void main(String[] args) {

        ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

          long initialDelay = computeDelayUntilHour(9); // 오전 9시에 전송 시작
          long period = 24 * 60; // 매 24시간마다 반복


        scheduler.scheduleAtFixedRate(() -> {
            EmailSender.send(); // 여기서 메일 전송 메서드 호출
        }, initialDelay, period, TimeUnit.MINUTES);
    }

    // 현재 시각 기준으로 내일 오전 9시까지 남은 시간 계산
    private static long computeDelayUntilHour(int hour) {
        LocalDateTime now = LocalDateTime.now();
        LocalDateTime nextRun = now.withHour(hour).withMinute(0).withSecond(0).withNano(0);
        if (now.isAfter(nextRun)) {
            nextRun = nextRun.plusDays(1);
        }
        return Duration.between(now, nextRun).toMinutes();
    }


}

 

 

1분 간격으로 메일이 도착한 것을 확인할 수 있습니다. 

 

현재는 자바서버에서 실행되기 때문에 ide 에서 실행을 중지하면 메일 발송이 되지 않습니다. 

다음 시간에는 리눅스 서버에 .jar 파일로 빌드한 자바 프로젝트를 업로드 후, 

백그라운드로 계속 실행 되도록 해보겠습니다. 

 

감사합니다.