
* 겪고 있는 문제 상황을 최대한 자세하게 작성해주세요.
* 문제 해결을 위해 어떤 시도를 해보았는지 구체적으로 함께 알려주세요.
이메일 발송이 되지 않네요.

작성한 코드 및 에러 메세지
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) 단축키로 코드를 한 번에 선택할 수 있어요!
