Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » В помощь системному администратору » Рассылка

Модерирует : lynx, Crash_Master, dg, emx, ShriEkeR

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2

Открыть новую тему     Написать ответ в эту тему

Kuken



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
День добрый форумчане.
есть проблема, пока даже не знаю как к ней подступиться.
СУТЬ:
Есть файлик (формат не важен, но пусть будет xls)
в нем есть 3 столбца  
1) данные 1
2) данные 2
3) ДАТА!!!
задача:
нужно чтобы (обработка или сторонний софт)
по условию
за 5 дней до даты,  
за 1 день до даты
в день даты,
отправлял письмо на определенный эл. адрес.
в письмо включались данные из 1,2 и 3 столбца.
Ну и тему письма создавалась фраза + данные из 1 столбца

Всего записей: 37 | Зарегистр. 27-01-2017 | Отправлено: 08:18 19-04-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kuken

Цитата:
нужно чтобы (обработка или сторонний софт)

 
самостоятельно написать на питоне, к примеру.

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 09:17 19-04-2022
Kuken



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ну, умел бы написал.

Всего записей: 37 | Зарегистр. 27-01-2017 | Отправлено: 09:21 19-04-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kuken

Цитата:
ну, умел бы написал.

ну, можно и встроенными средствами (на английском)
https://www.myonlinetraininghub.com/automatically-email-reminders-from-excel-with-power-automate
но проще на любом скриптовом языке сделать или с помощью VBA (встроенный в Office язык), но и его изучить нужно будет.
 
 
на питоне же:
1) работа с Excel https://codecamp.ru/blog/python-excel-tutorial/
2) отправка email https://habr.com/ru/company/pechkin/blog/281915/
ну и все, в принципе. добавляем в системный планировщик заданий на запуск раз в сутки (или несколько раз, но тогда нужно сохранять состояние.. например просто создавать файл-флаг, в случае отправки, чтобы несколько раз не отправлять в один день).

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 23:10 19-04-2022 | Исправлено: Mavrikii, 04:16 20-04-2022
Kuken



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
 
спасибо..
попробую.
результат выложу

Всего записей: 37 | Зарегистр. 27-01-2017 | Отправлено: 05:29 20-04-2022
Kuken



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
пока докурил до такого...
#это для почты
import smtplib
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
#зто для экселя
from openpyxl import load_workbook
 
 
# чтение xlsx
def read_excel(filename='Кунг.xlsx'):
    wb = load_workbook(filename, data_only=True)
    sheet = wb["График средст измерений"]
    print('ячейка G19 =', sheet["g19"].value)
    for r in range(19, 22):
        print('заводские номера', sheet.cell(row=r, column=3).value)
    wb.close()
 
 
# отправка почты
def sendmail(addr, subj, dat):
    # ----------------------
    HOST = "server"  
    TO = "id@*ru"  
    FROM = "*@*.ru"  
    TEXT = "доставлено: " + dat  
    LOGIN = '***'  
    PASSWORD = '*******'  
    TEXT = dat  
    # -----------------------------------------------
    print('send-->', addr, subj, dat)
    # msg = MIMEText('RE: '+subj, 'plain', 'utf-8')
    # BODY = "\r\n".join(("From: %s" % FROM,"To: %s" % addr,"Subject: %s" % msg, "",TEXT ))
    server = smtplib.SMTP(HOST)
    server.login(LOGIN, PASSWORD)
    russian = 'windows-1251'
    msg = MIMEMultipart()
    msg["Subject"] = Header('RE: ' + subj, russian)
    msg["From"] = FROM
    # msg["To"] = Header(addr, russian)
    msg["To"] = addr
    text = MIMEText(TEXT.encode('cp1251'), 'plain', russian)
    msg.attach(text)
    server.sendmail(FROM, [TO], msg.as_string())
    server.quit()
 
 
read_excel('Кунг.xlsx')
sendmail('*@*.ru', 'Проверка манометра', 'text in body mail')
 
 
теперь в чем у меня проблема осталась.
1)  в тело письма не вставляет данные из ячеек.
2)  Таблица большая (относительно примерно 2000 строк) даты разные, как задать ему дату и что бы он сравнивал ее с таблицей и выбирал нужные (например за 5 дней до даты)

Всего записей: 37 | Зарегистр. 27-01-2017 | Отправлено: 07:59 29-04-2022 | Исправлено: Kuken, 08:00 29-04-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kuken

Цитата:
в тело письма не вставляет данные из ячеек.

ну так нужно не просто считывать содержимое excel, а перебирать данные и уже на основе их, выбранной строки, составлять то, что будет отправлено.
https://stackoverflow.com/questions/55319851/how-to-loop-through-each-row-in-excel-spreadsheet-using-openpyxl
 
я же не знаю где и что у вас там записано. проходите по строкам, выбирая значения из нужных столбцов. сравниваете дату (разницу с нынешней)
https://pynative.com/python-difference-between-two-dates/
и если разница меньше или равно, делаете отправку с данными из этой строки.
после как то помечаете (создаете файл или еще что, например добавляете в тот же excel файл), что отправили для этой строки и в следующий раз ее пропускаете.

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 02:12 30-04-2022 | Исправлено: Mavrikii, 02:13 30-04-2022
Kuken



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
#зто для экселя
from openpyxl import load_workbook
#дата
from datetime import datetime
now = datetime.now()
date = now.strftime("%d/%m/%Y") #формат даты
print('Date String:', date)
 
# чтение xlsx
def read_excel(filename='Кунг.xlsx'):
    wb = load_workbook(filename, data_only=True)
    sheet = wb["График средст измерений"]
    cell = sheet['G19'].value
    if cell.date() == (datetime.now().date() + timedelta(days=1)):
        print('ячейка G19 =', sheet["g19"].value)
    print("ok")
    for r in range(19, 22):
        print('заводские номера', sheet.cell(row=r, column=3).value)
    wb.close()
 
внес вот такие изменения и получил ошибку
 
    if cell.date() == (datetime.now().date() + timedelta(days=1)):
AttributeError: 'str' object has no attribute 'date'
 
Добавлено:
А вот кусок таблицы:
 
 
1    Манометр     ДМ02-100-1-М    07704    07.2021    12    05.05.2022
2    Манометр     ДМ02-100-1-М    7699      07.2021    12    06.05.2022
3    Манометр     ДМ02-100-1-М    7696      07.2021    12    09.05.2022

Всего записей: 37 | Зарегистр. 27-01-2017 | Отправлено: 10:08 04-05-2022 | Исправлено: Kuken, 10:11 04-05-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kuken

Цитата:
AttributeError: 'str' object has no attribute 'date'

какой формат строк с датой в Excel? строка или действительно дата?
если строка, то нужно предобразовывать.

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 11:21 05-05-2022
Kuken



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
в ячейке именно дата (проверял)
строка оставшаяся - текст

Всего записей: 37 | Зарегистр. 27-01-2017 | Отправлено: 12:36 05-05-2022 | Исправлено: Kuken, 13:50 05-05-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kuken

Цитата:
в ячейке именно дата (проверял)

тогда преобразуйте, но сдается мне, что формат не тот или считываете не там.
потому что, по умолчанию, если там дата и то считывается объект с датой, а не строка.
https://openpyxl.readthedocs.io/en/3.0/datetime.html
 

Цитата:
AttributeError: 'str' object has no attribute 'date'

у строки нет метода date
 
можно строку преобразовывать через strptime
https://datagy.io/python-string-to-date/

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 22:22 05-05-2022
Kuken



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
если ставлю вот так
 
#дата
from datetime import datetime
 
#data_string = datetime
data = datetime.now()
# now = datetime.strptime("%d.%m.%Y")
print(data)
data = data.strftime("%d.%m.%Y") #формат даты
print('Date String:', data)
 
# чтение xlsx
def read_excel(filename='Кунг.xlsx'):
    wb = load_workbook(filename, data_only=True)
    sheet = wb["График средст измерений"]
    cell = sheet['G19'].value
#    if cell.data() == (datatime.now().data() + timedelta(days=1)):
#        print('ячейка G19 =', sheet["g19"].value)
#    print("ok")
    for r in range(19, 22):
        print('заводские номера', sheet.cell(row=r, column=3).value)
    wb.close()
 
то результат такой:
 
2022-05-06 12:56:52.086024
Date String: 06.05.2022
заводские номера 07704
заводские номера 7699
заводские номера 7696
 
Добавлено:

Цитата:
Kuken
 
Цитата:
AttributeError: 'str' object has no attribute 'date'
 
какой формат строк с датой в Excel? строка или действительно дата?
если строка, то нужно предобразовывать.

этот вопрос решил.
 
вот таким образом:
#дата
from datetime import datetime
from datetime import timedelta
 
#data_string = datetime
data = datetime.today()
# now = datetime.strptime("%d.%m.%Y")
print(data)
data = data.strftime("%d.%m.%Y") #формат даты
print('Date String:', data)
 
# чтение xlsx
def read_excel(filename='Кунг.xlsx'):
    wb = load_workbook(filename, data_only=True)
    sheet = wb["График средст измерений"]
    cell = sheet['G19'].value
 
    for r in range(19, 22):
        print('заводские номера', sheet.cell(row=r, column=4).value)
    if cell.date() == (datetime.today() + timedelta(days=1)):
        print('ячейка G19 =', sheet["g19"].value)
    print("ok")    
    wb.close()
 
Добавлено:
теперь как правильно сделать что бы он выбирал ячейки у которых дата + 1 день.
а то он фигачит все.

Всего записей: 37 | Зарегистр. 27-01-2017 | Отправлено: 10:58 06-05-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kuken

Цитата:
теперь как правильно сделать что бы он выбирал ячейки у которых дата + 1 день.

считаете разницу между днями.. если 1 день, то делаете то, что нужно.
либо загоняете данные строки в отдельный массив, который обработаете позже.
 
в принципе можно использовать и внутренние возможности,
https://openpyxl.readthedocs.io/en/stable/api/openpyxl.worksheet.filters.html
но и переборка будет нормально работать (если нет там миллионов записей)

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 00:45 07-05-2022 | Исправлено: Mavrikii, 00:45 07-05-2022
andreik99

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Если можно чтобы не плодить темы задам близкий по теме вопрос в этой ветке.
Какие SMTP сервера (под Windows и/или Linux (Debian)) умеют по листам рассылки поочередно для каждого сообщения подменять поле "TO" очередным адресом из списка.  
т.е. задача чтобы в сообщении в поле TO был только один получатель.

Всего записей: 1503 | Зарегистр. 19-06-2008 | Отправлено: 08:29 08-06-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
andreik99
это не задача SMTP сервера. возможно, какие то почтовики и поддерживают напрямую списки рассылок, но, в целом, это делается сторонними средствами.

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 08:35 08-06-2022
vlary



Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
andreik99
Цитата:
т.е. задача чтобы в сообщении в поле TO был только один получатель.
Почтовый сервер CommuniGate Pro имеет много фишек насчет
групповых адресов и списков рассылки, но такой фишки как подстановка
в поле Кому: адреса из списка там нет.
Стоит один получатель, это имя группы или списка рассылки.
Желаемую фичу я в свое время реализовал с помощью самописной проги.
У сервера есть фича для определенных адресов запускать программу
и отправлять на ее стандартный вход отправляемое письмо.
Программа из поля Кому: извлекала имя списка, вытаскивала из базы
все адреса этого списка, формировала индивидуальные письма,
заменяя поле Кому: на адрес участника, и снова отправляла эти письма на сервер.
И далее они уходили обычным образом.
Если порыться в сети, наверняка можно найти и автономные программы,
которые позволяют составлять и хранить списки рассылки,
а также отправлять сформированную рассылку на любой почтовый сервер.


----------
Заслуженный SCOтовод, почетный SUNтехник и любитель Кошек

Всего записей: 17279 | Зарегистр. 13-06-2007 | Отправлено: 12:11 10-06-2022
sdr77

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
man at
 
примеры
 
> за 5 дней до даты,  
 
echo /home/user1/bin/send_my_spam-5.sh | at 01:05 2022-12-25 - 5 days
 
> за 1 день до даты
 
echo /home/user1/bin/send_my_spam-1.sh | at 01:01 2022-12-25 - 1 day
 
> в день даты
 
echo /home/user1/bin/send_my_spam-0.sh | at 01:00 2022-12-25
 
дата, время, название скриптов отправки условные.
 
должен быть запущен и работать демон atd
 
 
Добавлено:
andreik99
> чтобы в сообщении в поле TO был только один получатель.
 
одно письмо - одному получателю. все очень просто.
 
есть 2 поля To:
1) что идет в RCPT TO:  
2) что написано в заголовках письма.
 
они не обязаны совпадать. но если они не совпадают, то настроенные на паранойю почтовые серверы уже ставят + в спам-рейтинг.

Всего записей: 386 | Зарегистр. 22-07-2005 | Отправлено: 15:21 11-06-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
andreik99

Цитата:
умеют по листам рассылки поочередно для каждого сообщения подменять поле "TO" очередным адресом из списка.

https://support.microsoft.com/ru-ru/office/использование-слияния-для-массовой-рассылки-сообщений-электронной-почты-0f123521-20ce-4aa8-8b62-ac211dedefa4

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 01:28 13-06-2022
Kuken



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
vlary
andreik99,sdr77
Вы немного не допоняли задачу,  
при чему тут групповая рассылка?????
мне нужно что бы из файла выбирались данные по критерию (за 1 день до даты, за 5 дней до даты)
в файле более 3000 строк.  
и именно эти данные отправлялись определенному отправителю. (адрес жестко прописан кому идут они)
у меня то как раз проблема в том что я не могу заставить питон корректно отбирать данные из файла.  
 

Всего записей: 37 | Зарегистр. 27-01-2017 | Отправлено: 09:15 14-06-2022
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Kuken

Цитата:
у меня то как раз проблема в том что я не могу заставить питон корректно отбирать данные из файла.  

так при чем тут SMTP сервер то? у вас же сообщение фомируется питоном.
что именно у вас не получается с питоном?
кусок данных выложить то можете?

Всего записей: 15117 | Зарегистр. 20-09-2014 | Отправлено: 09:21 14-06-2022 | Исправлено: Mavrikii, 09:30 14-06-2022
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2

Компьютерный форум Ru.Board » Компьютеры » В помощь системному администратору » Рассылка


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru