Пример #1
0
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()
Пример #2
0
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()
Пример #3
0
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()
Пример #4
0
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
Пример #5
0
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
    """