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

[프로젝트] 파이썬 몸이불편한 분들을 위한 음성 이메일 보내기 - 2.음성으로 이메일 보내기 - 수신자편

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

ㅁ 개요

 

O 프로그램 소개

 

 

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

 

 

 

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

 

 

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

 

========

소스 2.py

========

 

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

 

 

 

2. 하지만 수신자 목록에 없는 사람(백두산)을 얘기하면 수신자 목록에 있는 사람을 얘기할때까지 물어봅니다.

 

 

 

========

소스 2-1.py

========

 

3. 개선된 소스를 실행하면 아래와 같이 실행됩니다.

 

수신자 목록에 있는 누구(백두산)를 말하더라도 시스템이 알아 듣고, 그에게 메일을 보낼 수 있도록 개선되었습니다.

 

 

 

 


 

ㅁ 세부 내용

 

O 완성된 소스

 

 

소스 : 2.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
from config import *

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

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
    print("이메일을 받는 사람의 이름을 알려주세요.")
    textToVoice("이메일을 받는 사람의 이름을 알려주세요.")
    my_res = voiceToText()

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

        if my_res2 == "yes" or my_res2 == "예스":
            print("이메일을 받는사람에 홍길동으로 저장합니다.")
            textToVoice("이메일을 받는사람에 홍길동으로 저장합니다.")
            email_recipients = True
        else:
            print("이메일을 받는사람이 잘못지정되었습니다. 다시 입력합니다.")
            textToVoice("이메일을 받는사람이 잘못지정되었습니다. 다시 입력합니다.")
            input_email_recipients()




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




email_recipients = False

while True:

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

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

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

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

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

 

 

 

소스 : 2-1.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()




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




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

while True:

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

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

    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()

    if email_recipients == False: #이메일 수신자가 지징되어 있지 않으면 안내 메시지 뿌려줌
        print("말씀하신 분은 이메일 수신자목록에 없습니다.(또는 이메일 수신자를 부정확하게 말씀하신것 같습니다.) 말씀하신 분을 이메일 수신자 목록에 등록 후 다시 음성 이메일 시스템을 실행해 주세요.")
        textToVoice("말씀하신 분은 이메일 수신자목록에 없습니다.(또는 이메일 수신자를 부정확하게 말씀하신것 같습니다.) 말씀하신 분을 이메일 수신자 목록에 등록 후 다시 음성 이메일 시스템을 실행해 주세요.")

 

 

 

 

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

 

 

 

 > python 2.py
 > python 2-1.py

 

 

 

 


 
 

 

O 주요 내용

 

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

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

 

 

 

========

소스 2.py

========

 

 

1.관련 모듈을 임포트 합니다.

 

 

 

 

2.아래와 같이 텍스트를 음성으로(주로 안내방송용), 음성을 텍스트로(주로 메일 보내기 위한 용도로 사용) 변환하는 함수를 정의합니다.

 

 

 

 

 

3.메일 발송 하는 부분으로 함수로 만들었을 뿐이며, 이전 글 내용과 동일합니다.

 

 

 

 

 

 

4. 메일 수신자(예: 홍길동)를 음성으로 말할때 잘 못 이야기 할 수 있으므로 이 부분을 반복적으로 쉽게 하기 위하여 함수 형태로 만들어 두었습니다.

 

또한 여러번 틀릴 경우에 대비하여 함수 자신을 다시 호출 하도록(재귀 함수) 하였습니다.(line 88)

 

 

 

 

 

 

5.이메일 수신자 목록을 딕셔너리로 만들고, 키/벨류를 사용할 수 있도록 하였습니다.(line 92)

 

이메일 수신자가 설정되면 다음 단계(제목 -> 본문 순)로 넘어 갈 수 있습니다. 따라서 최초에는 email_recipients = False로 설정하고, email_recipients = True로 바뀐다면 루프를 종료하도록 break를 사용하였습니다.(line 94, line 98~ 99)

 

아래 소스에서는 수신자가 '홍길동'만 가능합니다. 따라서 수신자가 '홀길동'이고, 이후 'yes'로 대답하면 프로그램은 종료됩니다.

 

하지만 수신자에 홍길동이 아닌 다른 사람인 경우 '홍길동'이 나올때까지 계속 루프를 돌게 됩니다.

 

이 부분은 다음 글에서 개선된 소스를 살펴보겠습니다.

 

 

 

 

 

 

========

소스 2-1.py

========

 

소스 2.py와 다른 주요 부분만 설명합니다.

(설명은 아래 주석을 참고하여 주시기 바랍니다.)

 

 

 

 

 

 

 

 

 

 

 

 


 

ㅁ 정리

 

O 우리가 배운 내용

 
 - 오늘은 음성으로 메일을 보내기 위해 첫번째로 수신자를 설정하는 방법에 대하여 살펴보았습니다.
 
 - 오늘 우리가 배운 내용을 간략히 정리해 보면 아래와 같습니다.

 > 1.수신자 목록에서 키값 받아와서 내가 말한 내용(my_res)에 존재하는지 확인 후 존재하면 if문 실행

while True:
    for key in  emaildic.keys():<-- 수신자 목록에서 for문으로 키를 하나씩 확인
        if key in my_res: <-- 내가 말한 내용(예: 백두산)에 key값(백두산)이 있으면 if문 실행
       # if "홍길동" in my_res:
            print("이메일을 받는 사람이 "+key+" 이 맞습니까? 맞으면 yes, 아니면 no로 대답해 주세요.")
            textToVoice("이메일을 받는 사람이 "+key+" 이 맞습니까? 맞으면 yes, 아니면 no로 대답해 주세요.")
            my_res2 = voiceToText()

 

 

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

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

 

 

 

 

감사합니다.

 

 

 

 

 

728x90
반응형
LIST