10분이면 Python으로 Microsoft Office365 로 email 전송 자동화

나이트 개발자·2023년 8월 20일
0
post-thumbnail

배경

여러가지 방법들이 있지만 가장 빠르고 쉽게 할 수 있는 방법만 기록에 남긴다. smtplib를 사용하는 예제들이 인터넷에 많이 보이지만 정작 2023년8월 현재에는 잘 동작하지 않는다. 그 간 MS가 보안을 강화한 덕이라고 봐야할 것 같다. 또 여러 글들에서는 Office365세팅을 powershell script로 하는 방법 위주로 안내가 돼 있는데 우분투를 쓰는 나로서는 당장 활용하기 어려웠다.

초 간단 기록

  1. https://portal.azure.com/ 방문
  2. 검색바에서 Azure Active Directory를 찾아서 이동
  3. 앱등록 : 앱 이름을 주고 모든 조직 디렉터리의 계정(모든 Azure AD 디렉터리 - 다중 테넌트) 옵션 선택
  4. console 앱이기 때문에 리디렉션 URI는 넣지 않아도 됨
  5. 등록 버튼 눌러서 등록 완료
  6. 생성된 앱을 선택(Azure Active Directory의 개요 화면에서 어플리케이션 갯수에 링크된 페이지를 방문하여 방금 생성한 앱 이름을 선택)하고 애플리케이션(클라이언트) ID 및
    디렉터리(테넌트) ID 를 각각 client_id 및 tenent_id로 기록 (추후 사용 예정)
  7. 좌측 메뉴에서 인증서 및 암호 선택
  8. 새 클라이언트 암호 선택후 설명과 만료시간 선택후 추가버튼눌러 생성 완료
  9. 생성된 내용을 메모해두고 특히 값은 client_secret으로 기록(추후 사용 예정
  10. 좌측 메뉴에서 API 사용권한 선택하여 오른쪽 페이지에서 권한 추가 버튼을 누른다.
  11. Microsoft Graph 선택 > 애플리케이션 사용권한 선택 >
    Mail.ReadWrite,
    Mail.Send,
    User.Read.All 을 각각 검색하여 권한추가 버튼으로 모두 추가
  12. 관리자동의 허용 버튼 눌러 모든 권한 허용(관리자일 경우만 가능, 일반 사용자라면 관리자에게 허용 요청 필요)
  13. O365설치 pip install O365
  14. 다음의 테스트 코드로 메일 전송 여부 확인
from O365 import Account, FileSystemTokenBackend

credentials = (
    "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY",
)
scopes = [
    "https://graph.microsoft.com/.default",
]

# Use the "credentials" flow
account = Account(
    credentials,
    auth_flow_type="credentials",
    tenant_id="ZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" )

if account.authenticate(scopes=scopes):
    print("Authenticated!")

mailbox = account.mailbox(resource="cto@mycompany.com")
m = mailbox.new_message()
m.to.add("worker@abc.com")
m.subject = "Testing!"
m.body = "George Best quote: I've stopped drinking, but only while I'm asleep."
m.send()
  1. office 365의 Exchange 보낸 편지함에서 전송 여부 수신자의 이메일 받은 편지함에서 수신 여부 확인.

마치며

지금은 단지 메일 송신과 관련된 내용이지만 O365 package를 사용하는 이 과정을 통해 Microsoft office365의 여러 기능들을 이용할 수 있는 인증에 대한 경험을 미리 할 수 있다. 다른 자동화들도 인증 부분을 재활용하거나 약간의 수정만 하면 가능하다.

참조

profile
개발하면서 또는 프러덕 관리하면서 겪는 기억해둬야하는 내용을 메모장 삼아 남긴다. Google Keep이나 메모 도구에 남기는 것과는 달리 잘 정리할 수 있어서 언젠가 들춰봐야할 내용들을 담은 글들이 게시된다.

2개의 댓글

comment-user-thumbnail
2024년 2월 26일

안녕하세요. 주셨던 내용으로 많은 도움이 되고 있습니다.
저는 초보자인데 Office365 메일 연계를 하고 싶어 뒤지고 있는데

보여주신 코드 중
아래의 내용이 에러가 나서 혹시 더 설정을 해야하는지요 ?

mailbox = account.mailbox(resource="cto@mycompany.com")
m = mailbox.new_message()
m.to.add("worker@abc.com")
m.subject = "Testing!"
m.body = "George Best quote: I've stopped drinking, but only while I'm asleep."
m.send()

에러가 이렇게 나오는디.. 다르게 설정을 해야 할까요 ?

  • 참고로 이메일은 제 이메일로 처리하였습니다.

Client Error: 403 Client Error: Forbidden for url: https://graph.microsoft.com/v1.0/users/cto@mycompany.com/sendMail | Error Message: Access is denied. Check credentials and try again. | Error Code:

1개의 답글