forum.wfido.ru  

Вернуться   forum.wfido.ru > Прочие эхи > RU.FIDONET.DIGEST

Ответ
 
Опции темы Опции просмотра
  #1  
Старый 28.01.2018, 20:51
Vladimir Fyodorov
Guest
 
Сообщений: n/a
По умолчанию 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
Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 07:49. Часовой пояс GMT +4.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot