코틀린 기반으로 쓰여짐
이메일을 통한 회원가입시에 특정 도메인에서만 이용가능하게 하고싶어서(가령 블라인드나 에브리타임같은) 이메일 인증이 필요했다.
파이어베이스를 통하면 쉽게 구현이 가능하긴하다.
https://firebase.google.com/docs/auth/android/manage-users?hl=ko
근데 파이어베이스를 쓰지 않고 싶기도했고, 직접 구현해보고 싶어서 만들어보았다.
최초에 만들어보려고 구글링을 해보니
https://stickode.tistory.com/287
요런 방식이 대부분이였다. 잘 작동했지만, 내가 원하는 기능은 아니였다.
어떤 앱/웹에서 인증번호 보내기 버튼을 누르게되면 메일 선택 없이 자동으로 보내지기 때문이다
그러한 방식이 무엇일까 구글링 해보다 찾은게 smtp 방식이다.
https://www.cloudflare.com/ko-kr/learning/email-security/what-is-smtp/
아마 대부분의 전공자들이 한번쯤은 들어봤거나 공부해본 방식일테다
simple mail transfer protocool의 준말로 말그대로 간편하게 이메일을 보낼때만 적용할 수 있는 프로토콜로서
tcp 25번 포트를 쓴다. 뭐 그게 중요한건 아니니까 더 궁금한게 있으신분들은 구글링 해보길 바란다.
1.smtp방식을 쓰려면 라이브러리를 추가해야한다
https://code.google.com/archive/p/javamail-android/downloads
app -> libs 밑에다가 위 파일들을 설치하면 되는데 libs가 없으면 그냥 만들면된다
모르겠는 분들을 위한 참고자료
2.메니페스트 변경
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
추가해준다
3.의존성 주입
implementation files('libs/activation.jar')
implementation files('libs/additionnal.jar')
implementation files('libs/mail.jar')
4.보안비밀번호 만들기
기본적으로 구글(지메일)을 이용해서 보내기 때문에 필요하다.
fun sendEmail(toEmail: String): String {
val fromEmail = "아까위에서2차인증받았던이메일"
val password = "아까위에서2차인증받았던 비밀번호"
val code = (100..10000).random().toString()
CoroutineScope(Dispatchers.IO).launch {
val props = Properties()
props.setProperty("mail.transport.protocol", "smtp")
props.setProperty("mail.host", "smtp.gmail.com")
props.put("mail.smtp.auth", "true")
props.put("mail.smtp.port", "465")
props.put("mail.smtp.socketFactory.port", "465")
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory")
props.put("mail.smtp.socketFactory.fallback", "false")
props.put("mail.smtp.ssl.enable", "true")
props.setProperty("mail.smtp.quitwait", "false")
// 구글에서 지원하는 smtp 정보를 받아와 MimeMessage 객체에 전달
val session = Session.getDefaultInstance(props, this@GMailSender)
// 메시지 객체 만들기
val message = MimeMessage(session)
message.sender = InternetAddress(fromEmail) // 보내는 사람 설정
message.addRecipient(Message.RecipientType.TO, InternetAddress(toEmail)) // 받는 사람 설정
message.subject =
"verfication code" // 이메일 제목
message.setText("저쪽 테이블에서 보낸 코드입니다. 아래 비밀번호를 인증창에 입력해주세요\n" + "<" + code + ">") // 이메일 내용
// 전송
Transport.send(message)
}
return code
}
5.결과
참고
https://min-wachya.tistory.com/168
'프로그래밍 > 안드로이드' 카테고리의 다른 글
리사이클러뷰 갱신(리스트어댑터) - 안드로이드 (0) | 2022.11.02 |
---|---|
싱글톤 패턴 - 안드로이드 (0) | 2022.09.27 |
프레그먼트와 네비게이션 바 - 안드로이드 (0) | 2022.09.21 |
코루틴 - 안드로이드 (0) | 2022.09.13 |
제트팩1 - 안드로이드 (0) | 2022.09.06 |