Лаб. 6 Python
.docx
import socket HOST = '127.0.0.1' PORT = 50007 while True: email = input('Введите почтовый адрес: ') msg = input('Введите сообщение: ') with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((HOST, PORT)) s.sendall((email + ' ' + msg).encode('utf-8')) response = s.recv(1024).decode('utf-8') if response == 'OK': print("Сообщение успешно отправлено!") exit() else: print("Ошибка при отправке сообщения:", response, "\n")
import socket import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText import os import re from random import randint from dotenv import load_dotenv load_dotenv() def valid_email(email): return bool(re.search(r"^[\w\.\+\-]+\@[\w]+\.[a-z]{2,3}$", email)) def sending_message(sender, recipient, id, msg): msgSent = MIMEMultipart() msgSent['From'] = sender msgSent['To'] = recipient msgSent['Subject'] = f"[Ticket #{id}] Mailer" msgSent.attach(MIMEText(msg)) server.send_message(msgSent) EMAIL_LOGIN = os.getenv('EMAIL_LOGIN') EMAIL_PASSWORD = os.getenv('EMAIL_PASSWORD') IMAP_HOST = os.getenv('IMAP_HOST') IMAP_PORT = os.getenv('IMAP_PORT') SMTP_HOST = os.getenv('SMTP_HOST') SMTP_PORT = os.getenv('SMTP_PORT') PERIOD_CHECK = os.getenv('PERIOD_CHECK') HOST = '127.0.0.1' #localhost PORT = 50007 server = smtplib.SMTP(SMTP_HOST, SMTP_PORT) #создание объекта SMTP для установки с почтовым сервером server.starttls() #использование шифрования server.login(EMAIL_LOGIN, EMAIL_PASSWORD) #предоставление доступа к аккаунту with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: #описание того как сервер принимает информацию s.bind((HOST, PORT)) #IP-адрес и порт, по которому можно подключиться к серверу s.listen(1) #запускаем сервер print("Сервер успешно запущен!") conn, addr = s.accept() #принимаем подключённых к серверу with conn: print("Подключено к ", addr) while True: msgFull = conn.recv(1024).decode('utf-8') #принимаем данные, поступающие на сервер if not msgFull: break recipient, msg = msgFull.split(' ', 1) #print("Получатель: ", recipient, " Сообщение: ", msg) if not valid_email(recipient): conn.sendall(bytes("Некорректный email-адрес получателя!", "UTF-8")) else: id = str(randint(0, 99999)) sending_message(EMAIL_LOGIN, recipient, id, msg) #sending_message(EMAIL_LOGIN, EMAIL_LOGIN, id, msg) conn.sendall(b'OK')
from imaplib import IMAP4_SSL import email import os import re import time from dotenv import load_dotenv load_dotenv() def check_subject(subject, message): #проверка формата темы письма pattern = r"\[Ticket #(\d+)\] Mailer" match = re.match(pattern, subject) if match: ticket_id = match.group(1) logMessage = f"ID: {ticket_id}\n{message}" #запись сообщения в файл success_request.log with open("success_request.log", "a") as file: file.write(logMessage + "\n\n") print("Запись в success_request.log\n") else: #запись сообщения в файл error_request.log with open("error_request.log", "a") as file: file.write(message + "\n\n") print("Запись в error_request.log\n") EMAIL_LOGIN = os.getenv('EMAIL_LOGIN') EMAIL_PASSWORD = os.getenv('EMAIL_PASSWORD') IMAP_HOST = os.getenv('IMAP_HOST') IMAP_PORT = os.getenv('IMAP_PORT') SMTP_HOST = os.getenv('SMTP_HOST') SMTP_PORT = os.getenv('SMTP_PORT') PERIOD_CHECK = os.getenv('PERIOD_CHECK') with IMAP4_SSL(SMTP_HOST, IMAP_PORT) as M: rc, resp = M.login(EMAIL_LOGIN, EMAIL_PASSWORD) while True: M.select() #поиск новых сообщений с темой "Mailer" result, data = M.search(None, f'(FROM {EMAIL_LOGIN})', '(UNSEEN)') #'(UNSEEN)' #print("RESULT:", result, "DATA: ", data) if result == "OK": for num in data[0].split(): print("Письмо:", num.decode()) #получение данных письма result, data = M.fetch(num, "(RFC822)") emailMessage = email.message_from_bytes(data[0][1]) #извлечение темы и текста письма subject = emailMessage["Subject"] msg = "" print("Tема письма:", subject) if emailMessage.is_multipart(): #если письмо содержит различные части for part in emailMessage.get_payload(): #то перебераем эти части и получаем только текст if part.get_content_type() == "text/plain": msg = part.get_payload(decode=True).decode() else: #если только текст, то получаем его msg = emailMessage.get_payload(decode=True).decode() check_subject(subject, msg) #отметка сообщения как прочитанного M.store(num, "+FLAGS", "\\Seen") time.sleep(float(PERIOD_CHECK))