티스토리 뷰

올해까치 - 인트로 까치

드디어 벌써 반년이 지나서 올해까치 프로젝트의 마지막인 이메일 보내기를 진행할 때가 되었다. 😀

이메일 자동화를 검색해 본 결과 파이썬에 이메일 라이브러리가 있어서인지 파이썬에 대한 결과가 가득했다. 내가 마침 파이썬을 할 줄 알아서 이메일 전송을 맡기로 했다.

 

smtplib 모듈

파이썬으로 이메일을 전송할 때 smtplib 모듈과 email 모듈을 사용해 편하게 이메일을 전송할 수 있다.

파이썬 이메일 전송 코드 중에 제일 잘 설명된 코드를 토대로 필요한 부분만 수정했다.

def send_email(받는 사람 이름, 메일 html 내용):
    import smtplib
    import re
    from email.mime.multipart import MIMEMultipart
    from email.mime.text import MIMEText

    def sendEmail(addr):
        reg = "^[a-zA-Z0-9.+_-]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$"
        if re.match(reg, addr): # 유효성 검사 통과
            smtp.sendmail(my_account, to_mail, msg.as_string()) # 이메일 전송
            print(to_mail, ' | ', "정상적으로 메일이 발송되었습니다.") # 전송된 이메일 출력
        else: # 통과하지 못하면
            print(to_mail, ' | ', "받으실 메일 주소를 정확히 입력하십시오.") # 전송되지 않은 이메일 출력

    # smpt 서버와 연결
    gmail_smtp = "smtp.gmail.com"
    gmail_port = 465
    smtp = smtplib.SMTP_SSL(gmail_smtp, gmail_port)

    # 로그인
    my_account = "내 이메일" # 발송 이메일 넣기
    my_password = "앱 비밀번호" # 내 앱 비밀번호 넣기
    smtp.login(my_account, my_password)

    # 메일을 받을 계정
    to_mail = "받을 사람 이메일" # 수신 이메일 넣기

    # 메일 기본 정보 설정
    msg = MIMEMultipart()
    msg["Subject"] = "안녕하세요, {0}님".format(받는 사람 이름) # 메일 제목
    msg["From"] = my_account
    msg["To"] = to_mail

    # 메일 본문 내용
    htmltext = MIMEText(메일 html 내용, 'html')  # 메일 내용, MIMEText을 사용해 html을 넣음
    msg.attach(htmltext)

    # 받는 메일 유효성 검사 거친 후 메일 전송
    sendEmail(to_mail)

    # smtp 서버 연결 해제
    smtp.quit()

1. 사람마다 다른 내용으로 메일을 보낼 것이라서 인자로 받을 사람 이름과 이메일 텍스트 내용을 받아서 html 형식으로 변환한 다음 메일을 전송한다.

2. 보내는 메일을 지메일로 많이 쓰던데 이제 지메일은 접근이 앱 비밀번호 말고는 불가해서 2차 인증 후에 앱 비밀번호를 생성해 사용하면 된다.

3. 이 코드를 참고한 이유인 이메일 유효성 검사 부분은 통과하지 못한 메일 주소를 확인해야 해서 수신 이메일을 출력하도록 했다.

 

+

아직은 실질적인 데이터 부분을 처리하는 함수를 짜지 않아서 받는 사람 이메일은 문자열로 뒀는데 추후에 저 부분도 수정할 것이다.

email.meme이 레거시라는데 대체하는 게 좋을지에 대해서도 찾아봐야겠다.

 

+

챗지피티에게 물어 레거시 모듈을 다른 것으로 수정하고 혹시나 메일 발송 중에 오류가 발생해 전송하지 못한 메일을 확인해야 해서 예외 처리를 추가했다.

 

+

이메일을 전송하고 나니 정규식이 000.co.kr과 같은 .가 두 번 있는 메일은 메일이 아니라고 판단해서 프로젝트 진행할 때 썼던 정규식을 붙여다가 다시 만들었다.

같이 프로젝트 한 친구(정규식은 내가 했는데도.....)가 이런이런 이메일은 통과 못한다고 면접관한테 한소리 듣고 수정한 정규식이라. 000만 붙이면 통과가 되기 때문에 주의..!

 

예외처리를 하고 테스트 할 겸 이상한 이메일 주소로 메일을 보내봤는데 여전히 전송했다는 메시지가 출력됐다.

지메일 웹 페이지로 들어가서 동일하게 이상한 이메일 주소로 전송했다. 별다른 말이 없이 전송완료 되었다고 하길래 검사 안 하고 그냥 보내는구나 싶었는데 몇 초 정도 지나니 받은 메일함으로 전송하지 못했다는 메일이 온다. 전송 못한 이메일 확인을 위해서 따로 메일함을 확인해야 될 것 같다...🤔

def send_email(받는 사람 닉네임, html 텍스트, 받는 사람 이메일):
    import smtplib
    import re
    from email.message import EmailMessage

    def sendEmail(addr):
        reg = "^[a-zA-Z0-9.+_-]+@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([0-9a-zA-Z]{2,})(\]?)$"
        if re.match(reg, addr):
            try:
                smtp.send_message(msg)
                print(to_mail, ' | ', "정상적으로 메일이 발송되었습니다.")
            except Exception as e:
                print(to_mail, ' | ', "! 메일을 발송하는 도중 에러가 발생했습니다.")
                print(e)
        else:
            print(to_mail, ' | ', "받으실 메일 주소를 정확히 입력하십시오.")

    # smpt 서버와 연결
    gmail_smtp = "smtp.gmail.com"
    gmail_port = 465
    smtp = smtplib.SMTP_SSL(gmail_smtp, gmail_port)

    # 로그인
    my_account = "my_email@gmail.com"
    my_password = "app password"
    smtp.login(my_account, my_password)

    # 메일을 받을 계정
    to_mail = 받는 사람 이메일

    # 메일 기본 정보 설정
    msg = EmailMessage()
    msg["Subject"] = "안녕하세요! {0}님. 새해를 맞이하면서 세웠던 계획들 기억하시나요?".format(
        받는 사람 닉네임)  # 메일 제목
    msg["From"] = my_account
    msg["To"] = to_mail

    # 메일 본문 내용
    msg.add_alternative(html 텍스트, subtype='html')

    # 받는 메일 유효성 검사 거친 후 메일 전송
    sendEmail(to_mail)

    # smtp 서버 연결 해제
    smtp.quit()

 

 

참고 링크

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함