def createTicket(message, email): if not message: message = "(empty question)" # составляем текст письма cc = get_config('cc_mailbox.txt') receiver = get_config('incoming_email.txt') sender, password, host, port = get_config('outgoing_email.txt') body = message if "@innopolis.ru" not in email: email = email.strip() + "@innopolis.ru" # добавляем необходимые теги body += "\n\n#creator " + email + "\n#cc " + cc[0] # назначаем отправителя, адрес которого указан в sw и в outgoing email fromaddr = sender # получаетель = почта, которая указана в sw в разделе incoming email (также указана в incoming email) toaddr = receiver[0] # собираем объект письма msg = MIMEMultipart() msg['From'] = fromaddr msg['To'] = toaddr msg['Subject'] = 'Ticket from "{}": '.format(email) + message[0:15] if (len(message) > 15): msg['Subject'] += '...' msg.attach(MIMEText(body, 'plain')) # подключаемся к smtp серверу Google server = smtplib.SMTP(host, port) server.starttls() # проводим авторизацию server.login(fromaddr, password) # переводим сообщение в текст text = msg.as_string() # отправляем письмо server.sendmail(fromaddr, toaddr, text) # закрываем соединение server.quit()
def addComment(message, ticket_id): # составляем текст письма # получаем информацию о почтовых ящиках receiver = get_config('incoming_email.txt') sender, password, host, port = get_config('outgoing_email.txt') body = message # назначаем отправителя, адрес которого указан в sw и в outgoing email fromaddr = sender # получаетель = почта, которая указана в sw в разделе incoming email (также указана в incoming email) toaddr = receiver[0] # собираем объект письма msg = MIMEMultipart() msg['From'] = fromaddr msg['To'] = toaddr msg['Subject'] = '[Ticket #' + str(ticket_id) + '] new ticket' msg.attach(MIMEText(body, 'plain')) # подключаемся к smtp серверу Google server = smtplib.SMTP(host, port) server.starttls() # проводим авторизацию server.login(fromaddr, password) # переводим сообщение в текст text = msg.as_string() # отправляем письмо server.sendmail(fromaddr, toaddr, text) # закрываем соединение server.quit()
def addAttachment(attachment, ticket_id, att_name): # составляем текст письма # получаем информацию о почтовых ящиках receiver = get_config('incoming_email.txt') sender, password, host, port = get_config('outgoing_email.txt') body = 'Получено новое вложение' # назначаем отправителя, адрес которого указан в sw и в outgoing email fromaddr = sender # получаетель = почта, которая указана в sw в разделе incoming email (также указана в incoming email) toaddr = receiver[0] # собираем объект письма msg = MIMEMultipart() msg['From'] = fromaddr msg['To'] = toaddr msg['Subject'] = '[Ticket #' + str(ticket_id) + '] new ticket' msg.attach(MIMEText(body, 'plain')) #добавляет к письму вложение part = MIMEBase('application', 'octet-stream') part.set_payload(attachment) encoders.encode_base64(part) part.add_header('Content-Disposition', 'attachment', filename=att_name) msg.attach(part) # подключаемся к smtp серверу Google server = smtplib.SMTP(host, port) server.starttls() # проводим авторизацию server.login(fromaddr, password) # переводим сообщение в текст text = msg.as_string() # отправляем письмо server.sendmail(fromaddr, toaddr, text) # закрываем соединение server.quit()
def get_sw_att(id_search): with session() as c: # Получаем информацию из sw_acc.txt для подключения getPayload('sw_acc.txt') id_search = int(id_search) # Проводим авторизацию в Spiceworks c.post(sw_host + '/pro_users/login', data=payload) # Получаем все тикеты пользователя response = c.get(sw_host + '/api/tickets.json?total_count:true') if response.status_code != 200: return None result = response.json() # Обрабатываем полученные результаты и укладываем необходимые нам данные в json ticket = searchTicketById(result, id_search) comments = listComments_json(ticket) result = [] result_photos = [] bot_email = get_config('outgoing_email.txt')[0] bot_email = bot_email[0:len(bot_email) - 1] for com in comments: if (com["attachment_name"] != None and com['creator']['email'] != bot_email): path = com["attachment_location"] result.append(path) if not is_photo_attachment( path) else result_photos.append(path) result = list(set(result)) result_photos = list(set(result_photos)) return result, result_photos
def createTicketWithAtt(message, email, attList, nameList): if not message: message = "(empty question)" # составляем текст письма cc = get_config('cc_mailbox.txt') receiver = get_config('incoming_email.txt') sender, password, host, port = get_config('outgoing_email.txt') body = message if "@innopolis.ru" not in email: email = email.strip() + "@innopolis.ru" # добавляем необходимые теги body += "\n\n#creator " + email + "\n#cc " + cc[0] # назначаем отправителя, адрес которого указан в sw и в outgoing email fromaddr = sender # получаетель = почта, которая указана в sw в разделе incoming email (также указана в incoming email) toaddr = receiver[0] # собираем объект письма msg = MIMEMultipart() msg['From'] = fromaddr msg['To'] = toaddr msg['Subject'] = 'Ticket from "{}": '.format(email) + message[0:15] if (len(message) > 15): msg['Subject'] += '...' msg.attach(MIMEText(body, 'plain')) #добавляет к письму вложения for attachment in attList: part = MIMEBase('application', 'octet-stream') part.set_payload(attachment) encoders.encode_base64(part) part.add_header('Content-Disposition', 'attachment', filename=nameList[attList.index(attachment)]) msg.attach(part) # подключаемся к smtp серверу Google server = smtplib.SMTP(host, port) server.starttls() # проводим авторизацию server.login(fromaddr, password) # переводим сообщение в текст text = msg.as_string() # отправляем письмо server.sendmail(fromaddr, toaddr, text) # закрываем соединение server.quit()
def parse_and_send(message): counter = 0 attachments = [] #запоминаем текущую директорию start_path = os.getcwd() + '\\' path = start_path + 'attachments' + '\\' #переходим в %start_path\attachments\ os.chdir(path) # удаляем все старые файлы в папке files = glob.glob(path + '*') for f in files: os.remove(f) # собираем все новые файлы в список, сохраняя их временно в папку for part in message.walk(): #обрабатываем вложения if (part.get_content_disposition() == 'attachment'): #получаем полный путь к новому файлу filepath = '{}' + part.get_filename() filepath = filepath.format(path) attachments.append(filepath) #создаем файл f = open(part.get_filename(), 'wb') f.write(part.get_payload(decode=True)) f.close() os.chdir(start_path) string = quopri.decodestring(str(message)) string = string.decode('utf-8', 'ignore') user_add = get_config('outgoing_email.txt')[0] user_add = user_add[0:len(user_add) - 1] to = get_from_email(string, "to") ticket_id = get_from_email(string, "id") ticket_body = get_from_email(string, "ticket_body") url = get_from_email(string, "url") #индекс подстроки, содержащей информацию по следующему событию prev_event = 0 #в цикле обрабатывается ближайшее новое событие while (string.find("<!--event", prev_event) != -1): prev_event = string.find("<!--event", prev_event) event_type = get_from_email(string, "event", prev_event) #обнуление дополнительных атрибутов, которые зависят от события comment_from = "" msg = "" if ((event_type == "ticket-comment") or (event_type == "ticket-opened") or (event_type == "ticket-assigned")): msg = get_from_email(string, "msg", prev_event) if (event_type == "ticket-comment"): comment_from = get_from_email(string, "from", prev_event) #заканчиваем шаг цикла, если уведомление о комментарии пользователя if (comment_from == user_add or to == comment_from): prev_event += 1 continue prev_event += 1 #вызов функции, отправляющей уведомление пользователю с адресом = to, о событии = event_type (тикет открыт, закрыт, прокомментирован, привязан) #msg - пустая строка, если тикет открыт заново (event_type = ticket_reopened) или закрыт (event_type = ticket_closed) #если event_type = ticket_opened, то msg содержит запрос пользователя #если event_type = ticket_assigned, то msg содержит имя администратора, который отвечает за тикет и его почту #если event_type = ticket_comment, то comment_from содержит адрес комментатора (при других event_type остается пустым), а msg содержит текст комментария #функция send_to_user должна отправлять пользователю опощение, которое будет составлено с использованием перечисленных аргументов #(возможно, имеет смысл добавить к ней еще одним аргументом язык, на котором будут приходить оповещения) #send_to_user(to,event_type,id,comment_from,msg,attachments[],ticket_body) print("Got new message") is_finished = False # while (not is_finished): # try: user_id = get_uid(cut_domain(to)) chat_id = get_chat_id(user_id) lang = get_lang(user_id) if not chat_id: print("Chat id not found for user " + to) continue msg = msg.rstrip() if msg == 'Attachment:': msg = '(attachment)' ticket_body = ticket_body.rstrip() if event_type == 'ticket-assigned': send_question_assign(chat_id, ticket_id, lang, msg, ticket_body) print('Message sent to bot') if event_type == 'ticket-comment' and attachments and msg: send_attachment(chat_id, lang, ticket_id, attachments, msg) print('Message sent to bot') elif event_type == 'ticket-comment' and msg: send_answer(chat_id, ticket_id, lang, msg) print('Message sent to bot') #ticket-opened #elif attachments: #send_attachment(chat_id, lang, ticket_id, attachments) #print('Message sent to bot') if event_type == 'ticket-closed': send_notification(chat_id, lang, ticket_id) print('Message sent to bot') is_finished = True
M = imaplib.IMAP4_SSL(host, port) rv, data = M.login(email_account, password) except imaplib.IMAP4.error: print("LOGIN FAILED!!! ") return try: rv, mailboxes = M.list() rv, data = M.select(EMAIL_FOLDER) except imaplib.IMAP4.error: print("ERROR: Unable to select email from mailbox") return if rv == 'OK': #запускает обработку сообщений в EMAIL_FOLDER process_mailbox(M) M.close() else: print("ERROR: Unable to open mailbox ", rv) M.logout() # Запускаем проверку уведомлений, задержка 10 секунд #считываем данные для подключения из файла, переданного на вход get_config email_account, password, host, port = get_config('cc_mailbox.txt') while True: try: check_mailbox(email_account, password, host, port) except Exception as e: print(e) print("Error occured, retry in 10 seconds") time.sleep(10)
import sys import json import datetime sys.path.append('..\\py_scripts') from db_defaults import get_auth_data, def_mail_domain sys.path.append('..\\bot') from email_params import get_config # длина ключа активации KEY_LENGTH = 5 # количество попыток активации TRY_LIMIT = 5 # данные почты для отправки писем EMAIL, EMAIL_PASS, SMTP_SERVER, SMTP_PORT = get_config('outgoing_email.txt') # сгенерировать ключ из чисел заданной длины в виде строки def generate_key(): return ''.join(random.choices(string.digits, k=KEY_LENGTH)) def _send_email(to_address, subject, body): """ Отправляет письмо подтверждения пользователю. :param to_address: Адрес получателя :param subject: Тема письма :param body: Тело письма :return: None """