파이썬 프로젝트 및 응용/몸이불편한 분들을 위한 음성 이메일 보내기

[프로젝트] 파이썬 몸이불편한 분들을 위한 음성 이메일 보내기 - 3.음성으로 이메일 보내기 - 제목편

파기차차 2023. 6. 24. 15:14
728x90
반응형
SMALL

ㅁ 개요

 

O 프로그램 소개

 

 

- 이번 글은 이전글([프로젝트] 파이썬 몸이불편한 분들을 위한 음성 이메일 보내기 - 2.음성으로 이메일 보내기 - 수신자편)에 이은 4번째 글로 음성으로 메일을 보내기 위해 두번째로 제목을 설정하는 방법에 대하여 살펴보겠습니다.

 

 

 

O 완성된 프로그램 실행 화면

 

 

 - 본 포스팅의 최종 완성된 프로그램의 결과화면은 아래와 같습니다.

 

 

1.프로그램을 실행하면 아래와 같이 실행 되며, 메일 제목을 정확히 말하면 프로그램이 정상 종료됩니다.

 

 

 

2.메일 제목을 잘못 말한 경우 다시 입력 받도록 하고 있습니다.

 

 

 

 

 


 

ㅁ 세부 내용

 

O 완성된 소스

 

 

소스 : 3.py

 

# -*- coding: utf-8 -*-
import smtplib
from email.encoders import encode_base64
from email.header import Header
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import formatdate
import os

import speech_recognition as sr
from gtts import gTTS
import os
import playsound
from translate import Translator

from config import *
emailpw = EMAILPW


def textToVoice(text):
    tts = gTTS(text=text, lang='ko')
    filename='voice.mp3'
    tts.save(filename) # 파일을 만들고,
    playsound.playsound(filename) # 해당 음성파일을 실행(즉, 음성을 말함)
    os.remove(filename)

def voiceToText():
    r = sr.Recognizer()
    with sr.Microphone() as source:
        print("say something: ")
        audio = r.listen(source)
        said = " "

        try:
            said = r.recognize_google(audio, language="ko-KR")
            print("Your speech thinks like: ", said)
        except Exception as e:
            print("Exception: " + str(e))
    
    return said

def send_email():
    ################################################################
    # 2. 이메일 발송
    ################################################################
    msg = MIMEMultipart()

    emailList = 'pygichacha@gmail.com,secuhelper@naver.com'
    emailTitle = '음성 메일보내기 테스트'
    emailContent = '음성 메일보내기 테스트 입니다.'

    msg['From'] = 'secuhelper@naver.com'
    msg['To'] = emailList
    msg['Date'] = formatdate(localtime=True)
    msg['Subject'] = Header(s=emailTitle, charset='utf-8')
    body = MIMEText(emailContent, _charset='utf-8')
    msg.attach(body)

    mailServer = smtplib.SMTP_SSL('smtp.naver.com')

    debugMessage = mailServer.set_debuglevel(True)
    print(debugMessage, type(debugMessage)) # 디버그 메시지에 'retcode (221)' 가 포함되어 있으면 정상 발송한 것임

    mailServer.login('secuhelper@naver.com', emailpw)  # 본인 계정과 비밀번호 사용.
    mailServer.send_message(msg)
    mailServer.quit()



def input_email_recipients():
    global email_recipients,for_break
    print("이메일을 받는 사람의 이름을 알려주세요.")
    textToVoice("이메일을 받는 사람의 이름을 알려주세요.")
    my_res = voiceToText()

    for key in  emaildic.keys():
        print(key,"++++++++++++++++++++++++++++++++++++++")
        if key in my_res:
       # if "홍길동" in my_res:
            print("이메일을 받는 사람이 "+key+" 이 맞습니까? 맞으면 yes, 아니면 no로 대답해 주세요.")
            textToVoice("이메일을 받는 사람이 "+key+" 이 맞습니까? 맞으면 yes, 아니면 no로 대답해 주세요.")
            my_res2 = voiceToText()

            if my_res2 == "yes" or my_res2 == "예스":
                print("이메일을 받는사람에 "+key+" 로 저장하고, 이메일 제목 단계로 이동 합니다.")
                textToVoice("이메일을 받는사람에 "+key+" 로 저장하고, 이메일 제목 단계로 이동 합니다.")
                email_recipients = key
                for_break = False
                break
            else:
                print("이메일을 받는사람이 잘못 지정되었습니다. 다시 입력합니다.")
                textToVoice("이메일을 받는사람이 잘못 지정되었습니다. 다시 입력합니다.")
                input_email_recipients()


def input_email_title():
    global email_title

    print("이메일 제목을 알려주세요.")
    textToVoice("이메일 제목을 알려주세요.")
    my_res = voiceToText()

    if '굿바이' in my_res:
        print("음성 이메일 시스템을 종료합니다.")
        textToVoice("음성 이메일 시스템을 종료합니다.")

    print("이메일 제목이 "+my_res+" 이 맞습니까? 맞으면 yes, 아니면 no로 대답해 주세요.")
    textToVoice("이메일 제목이 "+my_res+" 이 맞습니까? 맞으면 yes, 아니면 no로 대답해 주세요.")
    my_res2 = voiceToText()

    if my_res2 == "yes" or my_res2 == "예스":
        print("이메일 제목을 "+my_res+" 로 저장하고, 이메일 본문 작성 단계로 이동 합니다.")
        textToVoice("이메일 제목을 "+my_res+" 로 저장하고, 이메일 본문 작성 단계로 이동 합니다.")
        email_title = my_res
    else:
        print("이메일 제목이 잘못 지정되었습니다. 다시 입력합니다.")
        textToVoice("이메일 제목이 잘못 지정되었습니다. 다시 입력합니다.")
        input_email_title()




emaildic = {'홍길동':'pygichacha@gmail.com','백두산':'secuhelper@naver.com'}





# ######################## 1.이메일 수신자 받기 시작 ########################

# email_recipients = False #이메일 수신자가 처음엔 지징되어 있지않음
# for_break = True 

# while True:

#     if email_recipients: #이메일 수신자가 지징되어 있으면 루프를 빠져나옴
#         break

#     if for_break == False: # 이중 루프를 빠져나가기 위한 변수 설정임
#         break

#     print("이메일 시스템을 종료하려면 '굿바이'라고 말씀해 주세요.")
#     textToVoice("이메일 시스템을 종료하려면 '굿바이'라고 말씀해 주세요.")

#     print("이메일을 받는 사람의 이름을 알려주세요.")
#     textToVoice("이메일을 받는 사람의 이름을 알려주세요.")
#     my_res = voiceToText()

#     if '굿바이' in my_res:
#         print("음성 이메일 시스템을 종료합니다.")
#         textToVoice("음성 이메일 시스템을 종료합니다.")
#         break

#     for key in  emaildic.keys():
#         if '굿바이' in my_res:
#             print("음성 이메일 시스템을 종료합니다.2")
#             textToVoice("음성 이메일 시스템을 종료합니다.2")
#             for_break = False
#             break

#         print(key,"++++++++++++++++++++++++++++++++++++++")
#         if key in my_res:
#        # if "홍길동" in my_res:
#             print("이메일을 받는 사람이 "+key+" 이 맞습니까? 맞으면 yes, 아니면 no로 대답해 주세요.")
#             textToVoice("이메일을 받는 사람이 "+key+" 이 맞습니까? 맞으면 yes, 아니면 no로 대답해 주세요.")
#             my_res2 = voiceToText()

#             if my_res2 == "yes" or my_res2 == "예스":
#                 print("이메일을 받는사람에 "+key+" 로 저장하고, 이메일 제목 단계로 이동 합니다.")
#                 textToVoice("이메일을 받는사람에 "+key+" 로 저장하고, 이메일 제목 단계로 이동 합니다.")
#                 email_recipients = key
#                 for_break = False
#                 break
#             else:
#                 print("이메일을 받는사람이 잘못 지정되었습니다. 다시 입력합니다.")
#                 textToVoice("이메일을 받는사람이 잘못 지정되었습니다. 다시 입력합니다.")
#                 input_email_recipients()

# ######################## 1.이메일 수신자 받기 끝 ########################




######################## 2.이메일 제목 받기 시작 ########################

email_title = False #이메일 수신자가 처음엔 지징되어 있지않음
for_break = True 

while True:

    if email_title: #이메일 제목이 지징되어 있으면 루프를 빠져나옴
        break

    if for_break == False: # 이중 루프를 빠져나가기 위한 변수 설정임
        break

    print("이메일 제목을 알려주세요.")
    textToVoice("이메일 제목을 알려주세요.")
    my_res = voiceToText()

    if '굿바이' in my_res:
        print("음성 이메일 시스템을 종료합니다.")
        textToVoice("음성 이메일 시스템을 종료합니다.")
        break

    # 제목: 음성으로 이메일 보내기
    print("이메일 제목이 "+my_res+" 이 맞습니까? 맞으면 yes, 아니면 no로 대답해 주세요.")
    textToVoice("이메일 제목이 "+my_res+" 이 맞습니까? 맞으면 yes, 아니면 no로 대답해 주세요.")
    my_res2 = voiceToText()

    if my_res2 == "yes" or my_res2 == "예스":
        print("이메일 제목을 "+my_res+" 로 저장하고, 이메일 본문 작성 단계로 이동 합니다.")
        textToVoice("이메일 제목을 "+my_res+" 로 저장하고, 이메일 본문 작성 단계로 이동 합니다.")
        email_title = my_res
        break
    else:
        print("이메일 제목이 잘못 지정되었습니다. 다시 입력합니다.")
        textToVoice("이메일 제목이 잘못 지정되었습니다. 다시 입력합니다.")
        input_email_title()

######################## 2.이메일 제목 받기 끝 ########################

 

 

 

 

 - 소스파일을 cmd, 파워쉘 또는 vscode 등에서 아래와 같이 실행하시기 바랍니다.

 

 

 

 > python 3.py
 

 

 

 

 


 

O 주요 내용

 

-아래 소스코드에 대해서 간략히 설명합니다.

(대부분의 내용은 이전 글과 동일하며 다른 주요 부분만 설명합니다.)

 

 

 

 

 

1.메일 제목을 입력받는 함수 입니다.

제목을 잘못 말한 경우 다시 받을 수 있도록 함수 형태로 만들어 둔 것일 뿐 특별한 내용은 없습니다.

 

 

 

2. 마찬가지로 이전 내용과 동일합니다.

다만, 수신자의 경우 여러명이 존재하므로 키/벨류 구조를 사용하였지만, 제목은 하나만 작성하면 되므로 단순 구조를 사용하며, 굳이 이중 루프를 사용할 필요가 없습니다.

 

 

 

 

 


 

ㅁ 정리

 

O 우리가 배운 내용

 
 - 오늘은 음성으로 메일을 보내기 위해 두번째로 제목을 설정하는 방법에 대하여 알아보았습니다.

 

 

 

오늘은 여기까지이며, 댓글하트는 제가 이글을 지속할 수 있게 해주는 힘이 됩니다.

위의 내용이 유익하셨다면, 댓글과 하트 부탁드립니다.

 

 

 

 

감사합니다.

 

 

 

 

728x90
반응형
LIST