from PyQt6.QtWidgets import QWidget, QVBoxLayout, QTextEdit, QPushButton, QLabel, QMessageBox, QHBoxLayout from PyQt6.QtCore import Qt, QThread, pyqtSignal import smtplib, os from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from dotenv import load_dotenv from app.core.main_manager import MainManager, NotificationType from typing import Optional # Load environment variables from .env file load_dotenv() class EmailSender(QThread): success = pyqtSignal() error = pyqtSignal(str) def __init__(self, subject: str, message: str) -> None: super().__init__() self.subject: str = subject self.message: str = message def run(self) -> None: try: # Get email configuration from environment variables email: Optional[str] = os.getenv('EMAIL_ADDRESS') password: Optional[str] = os.getenv('EMAIL_PASSWORD') smtp_server: str = os.getenv('EMAIL_SMTP_SERVER', 'smtp.gmail.com') smtp_port: int = int(os.getenv('EMAIL_SMTP_PORT', '587')) if not email or not password: self.error.emit("password") return # Create message msg: MIMEMultipart = MIMEMultipart() msg['From'] = email msg['To'] = email msg['Subject'] = self.subject # Add body to email msg.attach(MIMEText(self.message, 'plain')) # Create SMTP session server: smtplib.SMTP = smtplib.SMTP(smtp_server, smtp_port) server.starttls() # Enable TLS encryption # Login with app password server.login(email, password) # Send email text: str = msg.as_string() server.sendmail(email, email, text) server.quit() self.success.emit() except smtplib.SMTPAuthenticationError: self.error.emit("email_credentials_error") except Exception: self.error.emit("suggestion_send_error") class SuggestionWindow(QWidget): def __init__(self, parent: Optional[QWidget] = None) -> None: super().__init__(parent) self.main_manager: MainManager = MainManager.get_instance() self.language_manager = self.main_manager.get_language_manager() self.settings_manager = self.main_manager.get_settings_manager() self.alert_manager = self.main_manager.get_alert_manager() self.observer_manager = self.main_manager.get_observer_manager() self.observer_manager.subscribe(NotificationType.LANGUAGE, self.update_language) self.email_sender: Optional[EmailSender] = None self.setup_ui() def setup_ui(self) -> None: layout: QVBoxLayout = QVBoxLayout(self) layout.setAlignment(Qt.AlignmentFlag.AlignTop) layout.setSpacing(20) layout.setContentsMargins(20, 20, 20, 20) # Title self.title_label: QLabel = QLabel(self.language_manager.get_text("suggestion_text"), self) self.title_label.setStyleSheet("font-size: 18px; font-weight: bold; margin-bottom: 10px;") self.title_label.setWordWrap(True) # Permet le retour à la ligne automatique self.title_label.setSizePolicy(self.title_label.sizePolicy().horizontalPolicy(), self.title_label.sizePolicy().verticalPolicy()) layout.addWidget(self.title_label) # Text area for suggestion self.text_edit: QTextEdit = QTextEdit(self) self.text_edit.setPlaceholderText(self.language_manager.get_text("suggestion_placeholder")) self.text_edit.setMinimumHeight(200) layout.addWidget(self.text_edit) # Button layout button_layout: QHBoxLayout = QHBoxLayout() button_layout.addStretch() # Send button self.send_button: QPushButton = QPushButton(self.language_manager.get_text("send_suggestion"), self) self.send_button.clicked.connect(self.send_suggestion) button_layout.addWidget(self.send_button) layout.addLayout(button_layout) layout.addStretch() def send_suggestion(self) -> None: message: str = self.text_edit.toPlainText().strip() if len(message)<15: self.alert_manager.show_error("suggestion_too_short") return # Disable send button during sending self.send_button.setEnabled(False) self.send_button.setText(self.language_manager.get_text("sending")) # Create subject with app name subject: str = f"Suggestion pour {self.settings_manager.get_config('app_name')}" # Create and start email sender thread self.email_sender = EmailSender(subject, message) self.email_sender.success.connect(self.on_email_sent) self.email_sender.error.connect(self.on_email_error) self.email_sender.start() def on_email_sent(self) -> None: self.send_button.setEnabled(True) self.send_button.setText(self.language_manager.get_text("send_suggestion")) self.alert_manager.show_success("suggestion_sent_success") self.text_edit.clear() def on_email_error(self, error: str) -> None: self.send_button.setEnabled(True) self.send_button.setText(self.language_manager.get_text("send_suggestion")) self.alert_manager.show_error(error) def update_language(self) -> None: self.title_label.setText(self.language_manager.get_text("suggestion_text")) self.text_edit.setPlaceholderText(self.language_manager.get_text("suggestion_placeholder")) self.send_button.setText(self.language_manager.get_text("send_suggestion"))