tgoop.com/python2day/6457
Last Update:
ΠΠ°ΠΊ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ°ΡΡΡΠ»ΠΊΠΈ ΠΏΠΈΡΠ΅ΠΌ ΠΏΠΎ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½ΠΎΠΉ ΠΏΠΎΡΡΠ΅. ΠΡΠ΄Π΅Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ, ΠΊΡΠΎ ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ ΡΡΠ°Π»ΠΊΠΈΠ²Π°Π»ΡΡ Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈΠ»ΠΈ ΡΠ΅ΠΊΠ»Π°ΠΌΠ½ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π±ΠΎΠ»ΡΡΠΎΠΌΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Ρ ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Π΅ΠΉ.
ΠΠΎΠ΄:
import os
import time
import imaplib
import smtplib
import logging
from typing import Optional
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
from email.utils import formatdate
# ΠΠΎΠ³Π³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s β %(levelname)s β %(message)s",
handlers=[
logging.FileHandler("email_sender.log"),
logging.StreamHandler()
]
)
def create_email(
from_addr: str,
to_addr: str,
subject: str,
body: str,
attachment_path: Optional[str] = None
) -> MIMEMultipart:
logging.info("Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΈΡΡΠΌΠ°...")
msg = MIMEMultipart()
msg["From"] = from_addr
msg["To"] = to_addr
msg["Subject"] = Header(subject, 'utf-8')
msg["Date"] = formatdate(localtime=True)
msg.attach(MIMEText(body, 'html', 'utf-8'))
if attachment_path and os.path.exists(attachment_path):
try:
part = MIMEBase('application', "octet-stream")
with open(attachment_path, "rb") as file:
part.set_payload(file.read())
encoders.encode_base64(part)
part.add_header(
'Content-Disposition',
f'attachment; filename="{os.path.basename(attachment_path)}"'
)
msg.attach(part)
logging.info(f"Π€Π°ΠΉΠ» ΠΏΡΠΈΠΊΡΠ΅ΠΏΠ»Π΅Π½: {attachment_path}")
except Exception as e:
logging.error(f"ΠΡΠΈΠ±ΠΊΠ° ΠΏΡΠΈ ΠΏΡΠΈΠΊΡΠ΅ΠΏΠ»Π΅Π½ΠΈΠΈ ΡΠ°ΠΉΠ»Π°: {e}")
else:
logging.warning("Π€Π°ΠΉΠ» Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ ΠΈΠ»ΠΈ Π½Π΅ ΡΠΊΠ°Π·Π°Π½ β ΠΏΠΈΡΡΠΌΠΎ Π±ΡΠ΄Π΅Ρ Π±Π΅Π· Π²Π»ΠΎΠΆΠ΅Π½ΠΈΡ.")
return msg
def send_email(
smtp_server: str,
smtp_port: int,
from_addr: str,
from_pass: str,
to_addr: str,
message: MIMEMultipart
) -> None:
try:
with smtplib.SMTP(smtp_server, smtp_port) as smtp:
smtp.starttls()
smtp.login(from_addr, from_pass)
smtp.sendmail(from_addr, to_addr, message.as_string())
logging.info(f"ΠΠΈΡΡΠΌΠΎ ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½ΠΎ Π½Π° {to_addr}")
except Exception as e:
logging.error(f"ΠΡΠΈΠ±ΠΊΠ° ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΠΏΠΈΡΡΠΌΠ°: {e}")
def save_to_sent(
imap_server: str,
imap_port: int,
from_addr: str,
from_pass: str,
message: MIMEMultipart
) -> None:
try:
with imaplib.IMAP4(imap_server, imap_port) as imap:
imap.login(from_addr, from_pass)
imap.select('Sent')
imap.append('Sent', None, imaplib.Time2Internaldate(time.time()), message.as_bytes())
logging.info("ΠΠΈΡΡΠΌΠΎ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΎ Π² 'Sent'")
except Exception as e:
logging.error(f"ΠΡΠΈΠ±ΠΊΠ° ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΏΠΈΡΡΠΌΠ°: {e}")
if __name__ == "__main__":
FROM_EMAIL = "corp-mail@mail.ru"
FROM_PASSWORD = "*"
SMTP_SERVER = "*.mail.ru"
SMTP_PORT = 25
IMAP_PORT = 143
TO_EMAIL = "students-mail@mail.ru"
SUBJECT = "Π’Π΅ΠΌΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ"
BODY = "Π’Π΅ΠΊΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ"
ATTACHMENT_PATH = "ΡΠ΅ΡΡΠΈΡΠΈΠΊΠ°Ρ.pdf"
try:
email_msg = create_email(FROM_EMAIL, TO_EMAIL, SUBJECT, BODY, ATTACHMENT_PATH)
send_email(SMTP_SERVER, SMTP_PORT, FROM_EMAIL, FROM_PASSWORD, TO_EMAIL, email_msg)
save_to_sent(SMTP_SERVER, IMAP_PORT, FROM_EMAIL, FROM_PASSWORD, email_msg)
except Exception as e:
logging.critical(f"ΠΡΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΎΡΠΈΠ±ΠΊΠ°: {e}")
#python #soft #code