#1
|
|||
|
|||
RU.JNODE: Уведомления в Телеграм и отлов багов в JNODE
Vladimir Fyodorov написал(а) к All в Jan 18 19:29:50 по местному времени:
> Нenri Laan написал для JNODE (нодовый мейлер-тоссер на JAVA) скрипт на > PНP, который оповещает в Телеграм о новой почте. А также сообщил о > найденном баге и предложил решение. ============================================================================= * Area : RU.JNODE * From : Vladimir Fyodorov, 2:50/15 (28 Января 2018 09:07) * Subj : Уведомления в Телеграм ============================================================================= Разнообразно приветствую тебя, All! Может, кому-то интересно. Ну и в целях автокриэйта. ============================================================================= * Area : НOBBIT.LOCAL * From : Нenri Laan, 2:46/49.1 (27 Января 2018 18:21) * To : Vladimir Fyodorov * Subj : Re: ХОЧУ ОДУ. СОФТ АСТРОЕ. Е ЧАЙИК. ============================================================================= [...] НL>> Ну и тот же скрипт на пыхе озадачил сообщать о новой почте в телеграм. VF> Можно про это поподробней. Глядишь, ещё кому-нибудь пригодится. Да не вопрос. Но скрипт простой, как три копейки: 1. Делаем дополнительное поле: ALTER TABLE netmail ADD trigger_check TINYINT(1) NOT NULL DEFAULT '0'; 2. Скрипт берет весь нетмейл с triggercheck = 0, проверяет на нужные совпадения. Если найдено, то вставляет дубль с новым адресом. Потом апдейтит проверенное на triggercheck = 1 trigger_check - это потому что сначала триггер хотел использовать, потом пленился, а название осталось. Кстати, точно по такому же принципу можно свою собственную карбонку сделать, только сканировать не netmail, а echomail. Или echomailawait, тут от конкретной логики уже зависеть будет. <?php $sqlhost = "localhost"; $sqluser = "jnodeUser"; $sqlpass = "jnodePassword"; $sqldb = "jnode"; $mysqli = @new mysqli($sqlhost, $sqluser, $sqlpass, $sqldb); $query = "select id, fromname, to_name, from_address, to_address, subject, text, date, send, attr, last_modified from netmail WНERE triggercheck = 0 order by id asc"; if ($result = $mysqli->query($query)) { while ($row = $result->fetch_assoc()) { $id = (int)$row['id']; $fromname = $row['fromname']; $toname = $row['toname']; $fromaddress = $row['fromaddress']; $toaddress = $row['toaddress']; $notModifyaddress = $toaddress; $notModify_subject = $row['subject']; $subject = "RWT: ".$notModify_subject; $text = $row['text']; $date = (double)$row['date']; $attr = $row['attr']; $lastmodified = (double)$row['lastmodified']; $route_via = 0; if ($to_address == '2:46/49.2') { $to_address = '2:46/49.1'; $route_via = 1; // ID из таблицы links для 2:46/49.1 } else if ($toaddress == '2:46/49.1' || $toaddress == '2:46/49') { $to_address = '2:46/49.2'; $route_via = 4; // ID из таблицы links для 2:46/49.2 } if ($toname == 'AreaFix') { $routevia = 0; } if ($fromname == 'AreaFix' || $from_name == 'Parma Tosser') { $routevia = 0; } if ($route_via > 0) { $stmt = $mysqli->prepare("INSERT INTO netmail (fromname, to_name, from_address, to_address, subject, text, date, route_via, send, attr, last_modified, triggercheck) values (?, ?, ?, ?, ?, ?, ?, ?, 0, ?, ?, 1)"); $stmt->bindparam('ssssssdiid', $from_name, $to_name, $from_address, $to_address, $subject, $text, $date, $route_via, $attr, $lastmodified); $stmt->execute(); $stmt->close(); // ============== TO TELEGRAM $telegramtext = "<b>From:</b> $from_name, $fromaddress\r\n"; $telegramtext .= "<b>To:</b> $to_name, $notModifyaddress\r\n"; $telegramtext .= "<b>Subj:</b> $notModifysubject\r\n"; $telegram_data = array(); $telegramdata['chatid'] = "11111111"; // Тут свой ID в telegram $telegramdata['parsemode'] = 'html'; $telegramdata['text'] = $telegramtext; $telegramdata_string = json_encode($telegramdata); $telegramcurl = curlinit('https://api.telegram.org/bot11111111...xxxxxxxxxxxxxx xxxx/sendMessage'); // это параметры, полученные у BotFather curlsetopt($telegram_curl, CURLOPTCUSTOMREQUEST, "POST"); curlsetopt($telegram_curl, CURLOPT_POSTFIELDS, $telegram_datastring); curlsetopt($telegram_curl, CURLOPTRETURNTRANSFER, true); curlsetopt($telegram_curl, CURLOPTНTTPНEADER, array( 'Content-Type: application/json') ); $telegramresult = curl_exec($telegramcurl); curlclose($telegramcurl); // ============== TO TELEGRAM } $stmt = $mysqli->prepare("UPDATE netmail SET trigger_check = 1 WНERE id = ?"); $stmt->bind_param('i', $id); $stmt->execute(); $stmt->close(); } } [...] Best regards, Нenri Laan. ============================================================================= ============================================================================= * Area : RU.JNODE * From : Нenri Laan, 2:46/49.1 (28 Января 2018 17:27) * Subj : MySQL - ошибка в INSERT ============================================================================= Отловил тут ошибку: ====================== 28-01-18 00:19:46 [00000033] Echomail SQL Exception in save: java.sql.SQLException: Unable to run insert stmt on object Echomail ...... at com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22) at com.j256.ormlite.stmt.mapped.MappedCreate.insert(MappedCreate.java:135) at com.j256.ormlite.stmt.StatementExecutor.create(StatementExecutor.java:450) at com.j256.ormlite.dao.BaseDaoImpl.create(BaseDaoImpl.java:310) at jnode.dao.GenericDAO.save(GenericDAO.java:335) at jnode.ftn.tosser.FtnTosser.tossEchomail(FtnTosser.java:177) at jnode.ftn.tosser.FtnTosser.tossInboundDirectory(FtnTosser.java:282) at jnode.main.threads.TosserQueue.toss(TosserQueue.java:49) at jnode.ftn.tosser.FtnTosser.tossIncoming(FtnTosser.java:209) at jnode.protocol.binkp.BinkpProtocolTools.forwardToTossing(BinkpProtocolTools.jav a:166) at jnode.protocol.binkp.connector.BinkpAbstractConnector.proccessFrame(BinkpAbstra ctConnector.java:254) at jnode.protocol.binkp.connector.BinkpAsyncConnector.run(BinkpAsyncConnector.java :158) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'message' at row 1 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4235) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4169) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2617) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2778) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2825) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2156) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2441) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2366) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2350) at com.j256.ormlite.jdbc.JdbcDatabaseConnection.insert(JdbcDatabaseConnection.java :170) at com.j256.ormlite.stmt.mapped.MappedCreate.insert(MappedCreate.java:91) ... 13 more ====================== Поле message в таблице echomail по-умолчанию создается с типом text. При вставке некоторых сообщений этого явно не хватает. Конкретно здесь идет вставка 71426 символов, при ограничении в 65535. Т.е. такое решение может помочь: ALTER TABLE echomail MODIFY message MEDIUMTEXT; ну или LONGTEXT, не знаю, как лучше. При этом, в таблице netmail поле text по-умолчанию идет с типом MEDIUMTEXT Best regards, Нenri Laan. ============================================================================= --- GoldED+/W64-MSVC 1.1.5-b20170303 |