❗️ SpringBoot를 이용하여 구현하였습니다.
//mail
implementation 'org.springframework.boot:spring-boot-starter-mail'
spring:
mail:
host: smtp.gmail.com
port: 587
username: ${spring.mail.username}
password: ${spring.mail.password}
properties:
mail:
smtp:
auth: true
starttls:
enable: true
1. 구글 계정 관리에 들어간다.
2. 2단계인증이 되어 있다면 그대로 2단계 인증을 누르고 아니면 설정을 해준다.
3. App의 이름을 정하고 만들기를 누른다.
4. 생성된 비밀번호를 복사한다.
1. 사용하는 애플리케이션에 환경변수를 설정하기 위해 edit을 누른다.
2. Modify options를 누르고 Environment variables를 체크한다.
3. 체크한 부분 클릭 후 +를 눌러 yml에서 설정한 ${spring.mail.username}, ${spring.mail.password}를 입력해준다.
username은 아이디를 적으면 되고 password엔 복사해둔 앱 비밀번호를 적으면 된다. 공백은 들어가면 안 되니 없애고 넣어야 한다.
@RequiredArgsConstructor
@Slf4j
@Service
public class MailService {
private final JavaMailSender javaMailSender;
public void whenEnjoyMeeting(User user, Meeting meeting){
// 메시지 객체 생성
SimpleMailMessage message = new SimpleMailMessage();
// 이메일 제목
message.setSubject(user.getUsername()+"님 플로깅 모임에 참여하셨습니다!");
// 이메일 받을 대상
message.setTo(user.getEmail());
// 이메일 내용
message.setText(user.getUsername()+ "님 " +meeting.getTitle()+" 모임에 참여하셨습니다. " +
"즐거운 모임과 더 나은 지구를 위한 실천을 응원합니다!");
javaMailSender.send(message);
}
}
나같은 경우는 모임 생성과 모임 참여시에 메일을 발송해주는 로직을 사용했다. controller에서는 service단의 메서드만 호출해주고 중요한 로직은 전부 Service에서 해결하기 때문에 MailService 객체를 MeetingService에서 호출해 사용했다.
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
@Slf4j
public class MeetingService {
private final MailService mailService;
@Transactional
public Meeting createMeeting(MeetingCreateDto dto) {
if(dto.getUserId() == null) throw new IllegalArgumentException();
User user = userRepository.findByUserStrId(dto.getUserId());
if(user == null) throw new UserNotFoundException("유저 정보가 존재하지 않습니다");
Meeting meeting = Meeting.builder()
.user(user)
.title(dto.getTitle())
.location(dto.getLocation())
.period(dto.getPeriod())
.contents(dto.getContents())
.maxCount(dto.getMaxCount())
.build();
Meeting saveMeeting = meetingRepository.save(meeting);
chattingRepository.save( new Chatting(saveMeeting));
log.info("meeting number order: {}", saveMeeting.getId());
// 메일 서비스
mailService.whenEnjoyMeeting(user, saveMeeting);
return saveMeeting;
}
@Transactional
public void enjoyMeeting(Long meetingNo, String userId) {
User user = userRepository.findByUserStrId(userId);
boolean continueProcess = meetingRepository.alreadyEnjoyed(user.getId(), meetingNo);
if(!continueProcess){
Meeting meeting = meetingRepository.findById(meetingNo).orElseThrow(IllegalArgumentException::new);
//더티체킹
meeting.enjoyMeeting(user.getId());
// 메일 서비스 해주기
mailService.whenEnjoyMeeting(user, meeting);
}
throw new IllegalArgumentException("이미 참여중인 모임입니다.");
}
}

아주 잘 된다.