반응형
// 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());
}
}
}
반응형
'React' 카테고리의 다른 글
커스터마이징, 혹은 특정 컴포넌트만 사용하고 싶은 경우에 pro-components 패키지를 직접 설치하지 않고 소스 코드를 가져다가 직접 쓰는 방법 (0) | 2025.06.19 |
---|---|
Ant Design의 전체 아이콘 SVG 소스를 한 번에 추출 하는 방법 (0) | 2025.06.19 |
유효한 Date 객체인지 검사하는 유틸리티 함수 (0) | 2025.06.11 |
React 17 + TypeScript 환경의 클래스 컴포넌트에서 hh24:mi 형식(예: 13:32)의 값을 입력받아 유효성 검증하는 (0) | 2025.06.11 |
하단 그리드(BottomGrid.tsx)에서 hide 사용 예제 (0) | 2025.06.10 |