커뮤니티
포인트
쿠폰
내 강의실
국비 신청 내역
증명서
계정
로그아웃
학습 질문
개발 일지
나의 활동
답변 완료
이메일 발송 실패
[왕초보] 칼퇴를 부르는 파이썬 업무 자동화
4주차
북마크
백*우
댓글
1
추천
0
조회수
8
조회수
8
답변 완료

* 겪고 있는 문제 상황을 최대한 자세하게 작성해주세요.

* 문제 해결을 위해 어떤 시도를 해보았는지 구체적으로 함께 알려주세요.



이메일 발송이 되지 않네요.






작성한 코드 및 에러 메세지

import smtplib

import os

from email.mime.multipart import MIMEMultipart

from email.mime.text import MIMEText

from email.mime.base import MIMEBase

from email import encoders

from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.chrome.options import Options

from selenium.webdriver.common.action_chains import ActionChains

import time

import openpyxl

from openpyxl.drawing.image import Image

from datetime import datetime


# 시스템 환경 변수에서 이메일 및 비밀번호 가져오기

email_user = os.getenv('EMAIL_USER'# 환경 변수에서 이메일 주소 가져오기

email_password = os.getenv('EMAIL_PASSWORD'# 환경 변수에서 이메일 비밀번호 가져오기

email_send = 'ttmalook@nate.com' # 수신 이메일 주소 (여기서는 예시로 설정)


# 확인용: 이메일 정보 출력

print(f"이메일: {email_user}, 비밀번호: {'*' * len(email_password)}")


# Chrome 옵션 설정

chrome_options = Options()

chrome_options.add_experimental_option("detach", True# 브라우저 자동 종료 방지

chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"]) # 불필요한 로그 제거

driver = webdriver.Chrome(options=chrome_options)


# 웹사이트 열기

driver.get('https://finance.yahoo.com/quote/NVDA'# 엔비디아 주식 가격 페이지


# 일정 시간 대기 (페이지가 로드될 수 있도록 충분히 기다림)

time.sleep(10# 10초 동안 기다림, 필요에 따라 조정 가능


# 주식 가격 및 변동 정보 가져오기

try:

  stock_price_element = driver.find_element(By.CSS_SELECTOR, 'fin-streamer[data-field="regularMarketPrice"]')

  stock_price = stock_price_element.text

  print(f"엔비디아 주식 가격: {stock_price}")

except Exception as e:

  print(f"주식 가격을 가져올 수 없습니다: {e}")


try:

  stock_change_element = driver.find_element(By.CSS_SELECTOR, 'fin-streamer[data-field="regularMarketChange"]')

  stock_change = stock_change_element.text

  print(f"엔비디아 주식 변동: {stock_change}")

except Exception as e:

  print(f"주식 변동을 가져올 수 없습니다: {e}")


try:

  stock_percent_change_element = driver.find_element(By.CSS_SELECTOR, 'fin-streamer[data-field="regularMarketChangePercent"]')

  stock_percent_change = stock_percent_change_element.text

  print(f"엔비디아 주식 변동 비율: {stock_percent_change}")

except Exception as e:

  print(f"주식 변동 비율을 가져올 수 없습니다: {e}")


# 타임스탬프 가져오기

timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

print(f"타임스탬프: {timestamp}")


# 그래프 이미지 영역 캡처 (SVG 그래프가 있는 영역)

try:

  # 그래프가 있는 div 요소를 찾고 그 요소를 기준으로 스크린샷을 찍는다

  graph_element = driver.find_element(By.CSS_SELECTOR, 'div.stx-subholder'# 그래프 영역

  location = graph_element.location

  size = graph_element.size


  # 전체 화면 캡처 후, 그래프 부분만 잘라서 저장

  driver.save_screenshot('nvda_full_screenshot.png')


  # 잘라낸 이미지 부분 저장 (좌표 및 크기를 사용)

  from PIL import Image as PILImage

  full_image = PILImage.open('nvda_full_screenshot.png')

  left = location['x']

  top = location['y']

  right = left + size['width']

  bottom = top + size['height']

  graph_image = full_image.crop((left, top, right, bottom))

  graph_image.save('nvda_stock_graph.png')

  print("주식 그래프 스크린샷 저장 완료!")

except Exception as e:

  print(f"SVG 그래프를 찾을 수 없습니다: {e}")


# 엑셀 파일 생성

wb = openpyxl.Workbook()

ws = wb.active


# 엑셀에 주식 데이터 입력

ws['A1'] = 'Ticker'

ws['B1'] = 'Price'

ws['C1'] = 'Change'

ws['D1'] = 'Change Percent'

ws['E1'] = 'Timestamp'

ws['F1'] = 'SVG Graph'


ws['A2'] = 'NVDA'

ws['B2'] = stock_price

ws['C2'] = stock_change

ws['D2'] = stock_percent_change

ws['E2'] = timestamp


# 이미지 추가

img = Image('nvda_stock_graph.png')

ws.add_image(img, 'F2')


# 엑셀 파일 이름에 날짜와 시간을 포함하여 저장

now = datetime.now().strftime("%Y%m%d_%H%M%S")

excel_filename = f'nvda_stock_{now}.xlsx'

wb.save(excel_filename)

print(f"엑셀 저장 완료: {excel_filename}")


# 이메일 제목 및 본문 내용 설정

subject = '주식 가격 및 그래프'

body = f'엔비디아 주식 가격 및 그래프를 첨부한 엑셀 파일을 전송합니다. 파일 이름: {excel_filename}'


# 이메일 메시지 생성

msg = MIMEMultipart()

msg['From'] = email_user

msg['To'] = email_send

msg['Subject'] = subject

msg.attach(MIMEText(body, 'plain'))


# 첨부 파일 설정 (엑셀 파일)

attachment = open(excel_filename, 'rb')


part = MIMEBase('application', 'octet-stream')

part.set_payload(attachment.read())

encoders.encode_base64(part)

part.add_header('Content-Disposition', f'attachment; filename={excel_filename}')


msg.attach(part)


# 네이트 메일 SMTP 서버를 사용하여 이메일 보내기

try:

  # SSL을 사용하여 연결

  server = smtplib.SMTP_SSL('smtp.nate.com', 465# SSL 포트 465 사용

  server.login(email_user, email_password# 로그인

  text = msg.as_string() # 이메일 메시지를 문자열로 변환

  server.sendmail(email_user, email_send, text# 이메일 발송

  server.quit() # 서버 종료

  print("이메일 전송 성공!")

except Exception as e:

  print(f"이메일 전송 실패: {e}")


VScode 의 오류 메시지

PS C:\Users\user\Downloads\automation> & C:/Users/user/AppData/Local/Microsoft/WindowsApps/python3.10.exe c:/Users/user/Downloads/automation/google.py

이메일: ttmalook@nate.com, 비밀번호: *************

엔비디아 주식 가격: 

엔비디아 주식 변동: +12.06

엔비디아 주식 변동 비율: 

타임스탬프: 2025-02-06 03:38:23

주식 그래프 스크린샷 저장 완료!

엑셀 저장 완료: nvda_stock_20250206_033823.xlsx

이메일 전송 실패: [WinError 10061] 대상 컴퓨터에서 연결을 거부했으므로 연결하지 못했습니다

PS C:\Users\user\Downloads\automation> 

오류 발생 시, 작성한 코드 전체와 에러 메시지를 첨부해 주세요.

Tip 1) </> 아이콘을 눌러 코드박스를 만들어 보세요.

Tip 2) Ctrl+A(맥의 경우 Command+A) 단축키로 코드를 한 번에 선택할 수 있어



Tip 2) Ctrl+A(맥의 경우 Command+A) 단축키로 코드를 한 번에 선택할 수 있어요!




취소
 공유
취소
댓글 0
댓글 알림
나의얼굴