from PyQt6.QtWidgets import QWidget, QVBoxLayout, QTextEdit, QPushButton, QLabel, 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 import app.utils.paths as path # Load environment variables from .env file load_dotenv(path.resource_path(".env")) 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"))