# /opt/trueconf_bot/lk/documents_service.py import smtplib import logging from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email import encoders from datetime import datetime import config.config as config logger = logging.getLogger(__name__) def get_user_info_for_docs(cursor, card_id: str) -> dict: """Извлекает кадровые данные сотрудника по CARD_ID для оформления бланков справок""" current_date = datetime.now().strftime('%Y-%m-%d') query = """ select e.TAB_N, a.NAME, d.NAME, hr.FULL_NAME, hr.EMAIL, f.SNAME, pr.EMAIL as workBookEmail from (select e.TAB_N, e.FIRM_ID, c.F_NAME, c.L_NAME, e.ID, c.M_NAME from UOV_SELFSERVICE_PR_EMP e join UOV_SELFSERVICE_PR_CARD c on c.ID=e.CARD_ID where c.ID = %s group by e.ID, e.FIRM_ID, c.F_NAME, c.L_NAME, c.M_NAME, e.TAB_N ) as e join UOV_SELFSERVICE_PR_TRANS t on t.EMP_ID = e.ID join UOV_SELFSERVICE_ST_APPOINT a on a.ID = t.APPOINT_ID join UOV_SELFSERVICE_HR_DEPT d on d.ID = t.DEPT_ID join UOV_SELFSERVICE_HR_S_USER_SL hr on hr.FIRM_ID = e.FIRM_ID join UOV_SELFSERVICE_HR_FIRM f on e.FIRM_ID=f.ID left join UOV_SELFSERVICE_HR_S_USER_PR pr on (pr.DEPT_ISOL_ID = d.DEPT_ISOL_ID or pr.FIRM_ID = f.ID) where ((t.D_FROM <= %s and t.D_TO >= %s) or (t.D_FROM <= %s and t.D_TO = '1999-12-31')) and e.FIRM_ID = f.ID """ cursor.execute(query, (card_id, current_date, current_date, current_date)) row = cursor.fetchone() if not row: raise Exception("Не удалось найти кадровые данные сотрудника для заказа справки.") return { 'tab_n': str(row[0]) if row[0] else "Не указан", 'job': str(row[1]) if row[1] else "", 'dept': str(row[2]) if row[2] else "", 'hr_fio': str(row[3]) if row[3] else "", 'hr_email': str(row[4]) if row[4] else "", 'firm': str(row[5]) if row[5] else "", 'wb_email': str(row[6]) if row[6] else "" } def generate_mail_message(doc_name: str, quantity: int, user_info: dict, period: str = "", attachment_path: str = "") -> bool: """Формирует и отправляет HTML-письмо заявки на справку в отдел кадров СибЦема""" # Извлекаем оригинальные адреса кадровиков из структуры БД orig_to = user_info.get('hr_email', '').strip() # Копия уходит на ящик трудовых книжек только если заказывают пункт 7 orig_cc = user_info.get('wb_email', '').strip() if doc_name == "Копия трудовой книжки" else "" to_email = orig_to cc_list = [orig_cc] if orig_cc else [] # Если включен DOCUMENTS_TEST_MODE, жестко перехватываем поток писем if getattr(config, 'DOCUMENTS_TEST_MODE', False): test_email = getattr(config, 'DOCUMENTS_TARGET_EMAIL', 'mailonline@sibcem.ru') to_email = test_email cc_list = [] subject = f"Запрос документа {doc_name} из Личного кабинета" period_str = f" {period}" if period else "" messageBody = ( f"Необходимо оформить документ {doc_name} в количестве {quantity} шт. " f"на сотрудника предприятия {user_info['firm']} с табельным номером - " f"\"{user_info['tab_n']}\"{period_str}.

" f"Данное письмо отправлено автоматически, отвечать на него не стоит." ) message = MIMEMultipart() message['From'] = getattr(config, 'DEFAULT_EMAIL_FROM', 'mailonline@sibcem.ru') message['To'] = to_email message['Subject'] = subject if cc_list: message['Cc'] = ", ".join(cc_list) message.attach(MIMEText(messageBody, 'html', 'utf-8')) if attachment_path: try: with open(attachment_path, 'rb') as attachment: part = MIMEBase("application", "octet-stream") part.set_payload(attachment.read()) encoders.encode_base64(part) part.add_header("Content-Disposition", f"attachment; filename={attachment_path}") message.attach(part) except Exception as e: logger.error(f"Не удалось прикрепить файл к письму: {e}") recipients = [to_email] + cc_list smtp_server = getattr(config, 'SMTP_SERVER', 'srvkem-mail.sibcem.ru') smtp_port = int(getattr(config, 'SMTP_PORT', 25)) try: server = smtplib.SMTP(smtp_server, smtp_port) server.starttls() # Если в конфигурации Passwork лежат логин/пароль для SMTP — авторизуемся if getattr(config, 'SMTP_USER', None): server.login(config.SMTP_USER, config.SMTP_PASSWORD) server.sendmail(message['From'], recipients, message.as_string()) server.quit() return True except Exception as e: logger.error(f"Ошибка SMTP при отправке письма: {e}") return False