from PyQt6.QtWidgets import QWidget, QVBoxLayout, QTextEdit, QPushButton, QLabel, QMessageBox, QHBoxLayout from PyQt6.QtCore import Qt, QThread, pyqtSignal import time import smtplib import os from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from app.core.main_manager import MainManager, NotificationType class EmailSender(QThread): success = pyqtSignal() error = pyqtSignal(str) def __init__(self, subject, message): super().__init__() self.subject = subject self.message = message def run(self): try: # Get email configuration from environment variables password = 'xprqegxuqixgljyi' email = 'louismazindev@gmail.com' smtp_server = 'smtp.gmail.com' smtp_port = 587 if not password: # Fallback to simulation if no credentials are configured self._simulate_email_sending() return # Create message msg = 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(smtp_server, smtp_port) server.starttls() # Enable TLS encryption # Login with app password server.login(email, password) # Send email text = msg.as_string() server.sendmail(email, email, text) server.quit() self.success.emit() except Exception as e: self.error.emit() def _simulate_email_sending(self): """Fallback simulation when no email credentials are configured""" time.sleep(2) # Simulate network delay print("=== EMAIL SIMULATION (No credentials configured) ===") print(f"Subject: {self.subject}") print(f"Message: {self.message}") print("=" * 55) self.success.emit() class SuggestionWindow(QWidget): def __init__(self, parent=None): super().__init__(parent) self.main_manager = MainManager.get_instance() self.language_manager = self.main_manager.get_language_manager() self.settings_manager = self.main_manager.get_settings_manager() self.observer_manager = self.main_manager.get_observer_manager() self.observer_manager.subscribe(NotificationType.LANGUAGE, self.update_language) self.setup_ui() def setup_ui(self): layout = QVBoxLayout(self) layout.setAlignment(Qt.AlignmentFlag.AlignTop) layout.setSpacing(20) layout.setContentsMargins(20, 20, 20, 20) # Title self.title_label = QLabel(self.language_manager.get_text("suggestion_text"), self) self.title_label.setStyleSheet("font-size: 18px; font-weight: bold; margin-bottom: 10px;") layout.addWidget(self.title_label) # Text area for suggestion self.text_edit = 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() button_layout.addStretch() # Send button self.send_button = 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): message = self.text_edit.toPlainText().strip() if not message: 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 = f"Suggestion for {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): self.send_button.setEnabled(True) self.send_button.setText(self.language_manager.get_text("send_suggestion")) QMessageBox.information(self, self.language_manager.get_text("success"), self.language_manager.get_text("suggestion_sent_success")) self.text_edit.clear() def on_email_error(self): self.send_button.setEnabled(True) self.send_button.setText(self.language_manager.get_text("send_suggestion")) QMessageBox.critical(self, self.language_manager.get_text("error"), f"{self.language_manager.get_text('suggestion_send_error')}") def update_language(self): 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"))