안드로이드에서 Intent로 메일 앱을 띄우는 게 아니라, 직접 SMTP서버로 요청을 보내서 Gmail로 메일을 보내도록 구현을 해야 하는 일이 생겼다. 일단 Javax의 기본 Mail 라이브러리를 이용하면 간단하게 이메일 주소와 비밀번호만 가지고도 이메일 계정으로 을 보낼 수 있다.
문제는 javax 라이브러리를 android에서 기본으로 제공하지 않고, Netbeans 프레임웤이 필요하단 것인데 이건 다운로드받아서 추가하면 된다.
mail.jar
activation.jar
additional.jar
위의 3개의 파일을 모듈의 libs 폴더에 놓고 gradle sync를 다시 하면 된다(참고: Click here — How to add External Jars)
Kotlin 코드
fun sendEmail(
title: String, // 메일 제목
body: String, // 메일 내용
dest: String, // 받는 메일 주소
fileName: String, // 첨부파일 이름
filePath: String // 첨부파일 경로
)
{
// 보내는 메일 주소와 비밀번호
val username = "";
val password = "";
val props = 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");
// 비밀번호 인증으로 세션 생성
val session = Session.getInstance(props,
object: javax.mail.Authenticator() {
override fun getPasswordAuthentication(): PasswordAuthentication {
return PasswordAuthentication(username, password);
}
})
// 메시지 객체 만들기
val message = MimeMessage(session)
message.setFrom(InternetAddress(username))
// 수신자 설정, 여러명으로도 가능
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(dest))
message.subject = title
message.setText(body)
// 파일을 담기 위한 Multipart 생성
val multipart = MimeMultipart()
val messageBodyPart = MimeBodyPart()
val source = FileDataSource(filePath)
messageBodyPart.dataHandler = DataHandler(source)
messageBodyPart.fileName = fileName
multipart.addBodyPart(messageBodyPart)
// 메시지에 파일 담고
message.setContent(multipart)
// 전송
Transport.send(message)
}
보안 수준이 낮은 앱 허용
https://myaccount.google.com/lesssecureapps 에 들어가서 보안 수준이 낮은 앱 허용을 해야 위 코드가 실행 가능하다. ID/비밀번호로 SMTP 접속해서 메일을 보내는 방식은 권장하지 않는 방식인 듯 하다.
Reference