안드로이드에서 SMTP 이메일 보내기 (Kotlin)

김희규
5 min readNov 7, 2017

--

안드로이드에서 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 접속해서 메일을 보내는 방식은 권장하지 않는 방식인 듯 하다.

--

--

김희규
김희규

Written by 김희규

나는 최고의 선수다. 나를 최고라고 믿지 않는 사람은 최고가 될 수 없다.