본문 바로가기

React

Java, Spring, iBatis, MariaDB 환경에서 실행 결과를 등록된 수신자들에게 이메일로 발송 예제

반응형
// com.example.service.TestPlanEmailService.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;

import com.example.mapper.ItTestPlanMapper;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Service
public class TestPlanEmailService {

    @Autowired
    private JavaMailSender mailSender;

    @Autowired
    private ItTestPlanMapper testPlanMapper;

    private static final int EMAIL_BATCH_SIZE = 50;

    public void sendTestPlanEmail(int testId) {
        // 1. 테스트 계획 정보 조회
        Map<String, Object> testPlan = testPlanMapper.selectTestPlanById(testId);
        if (testPlan == null) {
            throw new IllegalArgumentException("테스트 계획을 찾을 수 없습니다. testId=" + testId);
        }

        // 2. 수신자 정보 조회
        List<Map<String, Object>> receivers = testPlanMapper.selectEmailReceiversByTestId(testId);
        if (receivers.isEmpty()) {
            System.out.println("수신자가 없습니다.");
            return;
        }

        // 3. 이메일 본문 작성
        String subject = "[테스트 계획 안내] " + testPlan.get("test_name");
        String content = String.format(
            "테스트 명: %s\n시작일: %s\n종료일: %s\n설명:\n%s",
            testPlan.get("test_name"),
            testPlan.get("plan_start_date"),
            testPlan.get("plan_end_date"),
            testPlan.get("description")
        );

        // 4. 이메일 수신자 분할 전송
        List<String> batch = new ArrayList<>();
        for (Map<String, Object> receiver : receivers) {
            String email = (String) receiver.get("email_addr");
            if (email != null && !email.isEmpty()) {
                batch.add(email);
                if (batch.size() >= EMAIL_BATCH_SIZE) {
                    sendEmailBatch(batch, subject, content);
                    batch.clear();
                }
            }
        }
        if (!batch.isEmpty()) {
            sendEmailBatch(batch, subject, content);
        }
    }

    private void sendEmailBatch(List<String> recipients, String subject, String content) {
        try {
            SimpleMailMessage message = new SimpleMailMessage();
            message.setSubject(subject);
            message.setText(content);
            message.setFrom("noreply@example.com");
            message.setTo("noreply@example.com"); // 필요 시 대체

            // Bcc로 모든 수신자 추가
            message.setBcc(recipients.toArray(new String[0]));

            mailSender.send(message);
            System.out.println("전송 완료: " + recipients.size() + "명");
        } catch (Exception e) {
            System.err.println("이메일 전송 실패: " + e.getMessage());
        }
    }
}
반응형