ㅁ 개요
O 프로그램 소개
- 이번 글은 이전글([프로젝트] 파이썬 몸이불편한 분들을 위한 음성 이메일 보내기 - 4.음성으로 이메일 보내기 - 본문편)에 이은 6번째 마지막 글로 이전 글들을 종합하여 음성으로 메일을 보내는 방법에 대하여 살펴보겠습니다.
O 완성된 프로그램 실행 화면
-프로그램을 실행하면 아래와 같이 실행됩니다.
1.음성으로 메일 수신자, 제목, 본문 내용을 입력합니다.
2.본문 내용이 긴 경우 한줄씩 계속 입력 후 입력 내용을 확인합니다.
3. 입력된 내용을 최종 확인 후 메일이 수신자에게 발송 됩니다.
4. 아래와 같이 메일 수신자에게 메일이 잘 수신 되었습니다.
5. 내용을 확인해 보니 우리가 작성한 제목과 내용으로 잘 작성되어 보내진 것을 볼 수 있습니다.
ㅁ 세부 내용
O 완성된 소스
소스 : 5.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 re
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(emailList, emailTitle, emailContent):
################################################################
# 2. 이메일 발송
################################################################
msg = MIMEMultipart()
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()
def input_email_contents():
global email_contents,for_break
print("이메일 본문 내용은 한 줄씩 입력합니다. 본문내용을 알려주세요.")
textToVoice("이메일 본문 내용은 한 줄씩 입력합니다. 본문내용을 알려주세요.")
my_res = voiceToText()+"\n\n"
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("조금전 말씀하신 이메일 본문내용을 저장하였습니다.")
textToVoice("조금전 말씀하신 이메일 본문내용을 저장하였습니다.")
email_contents = str(email_contents) + my_res
# break
print("추가 입력 하겠습니까? 추가 입력하려면 yes, 아니면 no로 대답해 주세요.")
textToVoice("추가 입력 하겠습니까? 추가 입력하려면 yes, 아니면 no로 대답해 주세요.")
my_res3 = voiceToText()
if my_res3 == "yes" or my_res3 == "예스":
input_email_contents()
else:
print("전체 본문내용은 다음과 같습니다.")
textToVoice("전체 본문내용은 다음과 같습니다.")
print(email_contents)
textToVoice(email_contents)
print("본문내용 입력을 종료합니다.")
textToVoice("본문내용 입력을 종료합니다.")
for_break = False
else:
print("이메일 본문내용이 잘못 입력되었습니다. 다시 입력 하겠습니다.")
textToVoice("이메일 본문내용이 잘못 입력되었습니다. 다시 입력 하겠습니다.")
input_email_contents()
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("이메일을 받는 사람의 이름을 알려주세요. 또는 이메일 시스템을 종료하려면 '굿바이'라고 말씀해 주세요.")
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("말씀하신 분은 이메일 수신자목록에 없습니다.(또는 이메일 수신자를 부정확하게 말씀하신것 같습니다.) 말씀하신 분을 이메일 수신자 목록에 등록 후 다시 음성 이메일 시스템을 실행해 주세요.")
######################## 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.이메일 제목 받기 끝 ########################
######################## 3.이메일 본문 받기 시작 ########################
email_contents = False #이메일 본문이 처음엔 지징되어 있지않음
for_break = True
while True:
if email_contents: #이메일 본문이 지징되어 있으면 루프를 빠져나옴
break
if for_break == False: # 이중 루프를 빠져나가기 위한 변수 설정임
break
print("이메일 본문 내용은 한 줄씩 입력합니다. 본문내용을 알려주세요.")
textToVoice("이메일 본문 내용은 한 줄씩 입력합니다. 본문내용을 알려주세요.")
my_res = voiceToText()+"\n\n"
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("조금전 말씀하신 이메일 본문내용을 저장하였습니다.")
textToVoice("조금전 말씀하신 이메일 본문내용을 저장하였습니다.")
email_contents = re.sub("False","",str(email_contents))
email_contents = email_contents + my_res
# break
print("추가 입력 하겠습니까? 추가 입력하려면 yes, 아니면 no로 대답해 주세요.")
textToVoice("추가 입력 하겠습니까? 추가 입력하려면 yes, 아니면 no로 대답해 주세요.")
my_res3 = voiceToText()
if my_res3 == "yes" or my_res3 == "예스":
input_email_contents()
else:
print("전체 본문내용은 다음과 같습니다.\n\n")
textToVoice("전체 본문내용은 다음과 같습니다.")
print(email_contents)
textToVoice(email_contents)
print("본문내용 입력을 종료합니다.")
textToVoice("본문내용 입력을 종료합니다.")
for_break = False
break
else:
print("이메일 본문내용이 잘못 입력되었습니다. 다시 입력 하겠습니다.")
textToVoice("이메일 본문내용이 잘못 입력되었습니다. 다시 입력 하겠습니다.")
input_email_contents()
######################## 3.이메일 본문 받기 끝 ########################
for key, value in emaildic.items():
print(key, value)
if key == email_recipients:
email_recipients_value = value
print(email_recipients_value)
try:
pass
print("이메일을 발송합니다.")
textToVoice("이메일을 발송합니다.")
send_email(email_recipients_value, email_title, email_contents)
print("이메일을 잘 발송 하였습니다.")
textToVoice("이메일을 잘 발송 하였습니다.")
except:
pass
print("메일 발송 중 에러가 발생하였습니다. 에러 메시지를 확인하여 소스코드를 수정 후 프로그램을 다시 실행 하시기 바랍니다.")
textToVoice("메일 발송 중 에러가 발생하였습니다. 에러 메시지를 확인하여 소스코드를 수정 후 프로그램을 다시 실행 하시기 바랍니다.")
O 주요 내용
-아래 소스코드에 대해서 간략히 설명합니다.
(대부분의 내용은 이전 글과 동일하며 다른 주요 부분만 설명합니다.)
아래 부분 외에 다른 부분은 모두 이전 글과 동일합니다.
수신자의 메일 주소를 얻기 위해 수신자 딕셔너리 목록에 키/벨류를 가져오기 위해서 for 루프를 돌립니다.(line 337 ~ 341)
그리고, 우리가 메일을 보내려는 수신자(email_recipients, 백두산) 있는지 찾기위해서 딕셔너리의 키와 계속 비교를 해봅니다.(line 339)
만일 키(메일 수신자 이름)와 우리가 음성으로 지정한 수신자(백두산)가 같은 경우 딕셔너리의 해당 키에 매칭되는 벨류(메일주소, value)를 가져와서 email_recipients_value변수에 할당합니다. (line 340)
이후 try~except 구문으로 메일을 발송(send_mail) 합니다.
메일 발송함수는 아래와 같으며, 이전 글에서 다룬 내용과 동일합니다.
ㅁ 정리
O 우리가 배운 내용
이것으로 [프로젝트] 파이썬 몸이불편한 분들을 위한 음성 이메일 보내기 편을 모두 마칩니다.
그동안 읽어주신 독자 여러분께 감사 드립니다.
오늘은 여기까지이며, 댓글과 하트는 제가 이글을 지속할 수 있게 해주는 힘이 됩니다.
위의 내용이 유익하셨다면, 댓글과 하트 부탁드립니다.
감사합니다.
'파이썬 프로젝트 및 응용 > 몸이불편한 분들을 위한 음성 이메일 보내기' 카테고리의 다른 글
[프로젝트] 파이썬 몸이불편한 분들을 위한 음성 이메일 보내기 - 4.음성으로 이메일 보내기 - 본문편 (0) | 2023.06.24 |
---|---|
[프로젝트] 파이썬 몸이불편한 분들을 위한 음성 이메일 보내기 - 3.음성으로 이메일 보내기 - 제목편 (0) | 2023.06.24 |
[프로젝트] 파이썬 몸이불편한 분들을 위한 음성 이메일 보내기 - 2.음성으로 이메일 보내기 - 수신자편 (0) | 2023.06.24 |
[프로젝트] 파이썬 몸이불편한 분들을 위한 음성 이메일 보내기 - 1.이메일 보내기 (0) | 2023.06.24 |
[프로젝트] 파이썬 몸이불편한 분들을 위한 음성 이메일 보내기 - 0.소개편 (0) | 2023.06.24 |