from PyQt6.QtWidgets import QWidget, QVBoxLayout, QTextEdit, QPushButton, QLabel, QHBoxLayout, QSizePolicy 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.license_manager = self.main_manager.get_license_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.setWordWrap(True) self.title_label.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum) 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(150) self.text_edit.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding) layout.addWidget(self.text_edit, 1) # 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) 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")) content = self.settings_manager.get_config('app_name').replace(' ', '_') # Ajouter le préfixe "PRIORITAIRE" uniquement si le système de licence est activé ET que l'utilisateur a le support prioritaire if self.settings_manager.get_config("enable_licensing") and self.license_manager.is_feature_available("priority_support"): subject = "PRIORITAIRE - "+content else: subject = "Suggestion pour "+content # 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"))