본문 바로가기
조그만 기술로 세상을 이롭게

앱에서 Flask 서버를 통해 메일 전송하기

by eplus 2026. 6. 1.

앱을 개발하다 보면 사용자가 오류 신고, 기능 개선 요청, 문의사항 등을 보낼 수 있는 기능이 필요할 때가 있습니다.

처음에는 앱에서 바로 메일 앱을 열어 보내는 방식을 생각할 수 있습니다. 하지만 실제 사용자 휴대폰에서는 메일 앱이 설치되어 있지 않거나, 기본 메일 계정이 설정되어 있지 않아 정상적으로 열리지 않는 경우가 많습니다.

그래서 이번에는 앱에서 직접 메일 앱을 실행하지 않고, Flask 서버를 통해 자동으로 메일을 전송하는 방식으로 개선했습니다.

기본 구조

전체 흐름은 다음과 같습니다.

MAUI 앱
 → Flask 서버 API 호출
 → Gmail SMTP 발송
 → 담당자 메일 수신

앱은 사용자가 입력한 요청 내용을 서버로 전송하고, 서버는 그 내용을 담당자 메일로 보내는 역할만 합니다.

이번 구조에서는 서버에 요청 내용을 DB로 저장하지 않고, 메일 발송만 처리합니다.

왜 서버를 거쳐야 할까?

앱에서 Gmail 계정과 비밀번호를 직접 사용하면 보안상 위험합니다.

앱은 APK 또는 AAB 형태로 배포되기 때문에, 내부 문자열이나 설정값이 분석될 수 있습니다. 만약 Gmail 앱 비밀번호를 앱 안에 넣으면 계정 정보가 노출될 수 있습니다.

따라서 Gmail 계정 정보는 반드시 서버에만 보관해야 합니다.

나쁜 방식:
앱 안에 Gmail 계정/비밀번호 저장

좋은 방식:
앱은 서버 API만 호출
Gmail 정보는 서버 환경변수에 저장

앱에서 서버로 보내는 데이터

앱에서는 요청 내용을 JSON 형태로 Flask 서버에 보냅니다.

예를 들어 버스정류소어때 앱에서는 다음과 같은 내용을 전송할 수 있습니다.

{
  "appName": "버스정류소어때",
  "requestType": "오류 수정",
  "message": "북면 감계 검색이 잘 되지 않습니다.",
  "contact": "010-0000-0000",
  "appVersion": "1.0.5",
  "device": "Android"
}

이 정보는 서버에서 메일 제목과 본문으로 정리되어 담당자에게 전송됩니다.

Flask 서버 처리 방식

Flask 서버에는 /api/app-request 같은 API를 추가합니다.

이 API는 앱에서 전달한 JSON 데이터를 받아 메일 본문을 만들고, Gmail SMTP를 이용해 메일을 발송합니다.

예시 구조는 다음과 같습니다.

@application.route("/api/app-request", methods=["POST"])
def app_request():
    data = request.get_json() or {}

    app_name = data.get("appName", "앱")
    request_type = data.get("requestType", "기타")
    message = data.get("message", "")
    contact = data.get("contact", "")

    subject = f"[{app_name}] {request_type} 요청"

    body = f"""
앱명: {app_name}
요청구분: {request_type}
연락처: {contact}

요청내용:
{message}
"""

    # Gmail SMTP 발송 처리
    return jsonify({"result": "ok", "message": "요청이 접수되었습니다."})

실제 운영에서는 여기에 Gmail SMTP 접속, 예외 처리, 입력값 검증 등을 함께 넣어야 합니다.

Gmail 앱 비밀번호 사용

Gmail SMTP를 사용하려면 일반 비밀번호가 아니라 앱 비밀번호를 사용하는 것이 좋습니다.

앱 비밀번호는 Google 계정에서 2단계 인증을 켠 뒤 생성할 수 있습니다.

서버에는 다음과 같은 환경변수를 등록합니다.

GMAIL_USER=eplusposbar@gmail.com
GMAIL_APP_PASSWORD=구글앱비밀번호16자리
TO_EMAIL=posbar@kakao.com

이 값은 절대 앱 소스에 넣지 않고, 서버 환경변수로 관리합니다.

Windows IIS 서버 환경변수 설정

Windows 서버에서 IIS로 Flask를 운영하는 경우, 환경변수는 시스템 변수로 등록할 수 있습니다.

관리자 권한 CMD에서 다음과 같이 입력합니다.

setx GMAIL_USER "eplusposbar@gmail.com" /M
setx GMAIL_APP_PASSWORD "구글앱비밀번호16자리" /M
setx TO_EMAIL "posbar@kakao.com" /M

setx 명령은 새 CMD 창부터 값이 보입니다.

설정 후에는 IIS를 재시작해야 Flask 프로세스가 새 환경변수를 읽을 수 있습니다.

iisreset

또는 IIS 관리자에서 해당 애플리케이션 풀을 재시작해도 됩니다.

MAUI 앱에서 서버 호출

앱에서는 메일 앱을 열지 않고 HttpClient로 서버 API를 호출합니다.

var payload = new
{
    appName = "버스정류소어때",
    requestType = selectedRequestType,
    message = txtMessage.Text,
    contact = txtContact.Text,
    appVersion = AppInfo.Current.VersionString,
    device = DeviceInfo.Current.Model
};

var json = JsonSerializer.Serialize(payload);
var content = new StringContent(json, Encoding.UTF8, "application/json");

using var http = new HttpClient();
var response = await http.PostAsync(
    "https://www.eiot.kr/api/app-request",
    content
);

서버 응답이 성공이면 앱에서는 다음과 같은 안내를 보여줄 수 있습니다.

요청이 접수되었습니다.
검토 후 앱 개선에 반영하겠습니다.

실패하면 네트워크 상태나 서버 설정을 확인하라는 메시지를 표시합니다.

이 방식의 장점

Flask 서버를 통한 메일 전송 방식은 다음 장점이 있습니다.

  • 사용자 휴대폰에 메일 앱이 없어도 요청 가능
  • Gmail 비밀번호를 앱에 넣지 않아 보안에 안전
  • 앱별 요청 내용을 자동으로 구분 가능
  • 앱 버전, 기기 정보 등을 함께 받을 수 있음
  • 향후 DB 저장, 관리자 화면, Push 알림으로 확장 가능

주의할 점

운영 시에는 다음 부분을 꼭 확인해야 합니다.

1. Gmail 앱 비밀번호는 서버에만 저장
2. HTTPS 주소 사용
3. Flask API 예외 처리 적용
4. IIS 재시작 후 환경변수 반영 확인
5. 앱에서 서버 오류 메시지 처리

또한 외부에서 아무나 API를 호출하지 못하게 하려면 간단한 API Key를 추가하는 것도 좋습니다.

예를 들어 앱에서 요청 헤더에 키를 보내고, 서버에서 이 값이 맞는지 확인하는 방식입니다.

마무리

앱에서 사용자 의견을 받는 기능은 생각보다 중요합니다.

특히 공공데이터 API를 사용하는 앱은 지역별 조회 오류, 네트워크 오류, 데이터 누락 등이 발생할 수 있기 때문에 사용자의 피드백을 빠르게 받을 수 있어야 합니다.

메일 앱을 직접 여는 방식은 간단하지만 사용자 환경에 따라 실패할 수 있습니다.

반면 Flask 서버를 통한 메일 전송 방식은 조금 더 구현이 필요하지만, 실제 운영 환경에서는 훨씬 안정적이고 확장성도 좋습니다.

이번 방식처럼 앱은 요청 내용을 서버로 보내고, 서버가 Gmail SMTP로 담당자에게 메일을 보내도록 구성하면 보안과 사용성을 모두 개선할 수 있습니다.

반응형