![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| morpheyushka |
|
||||
![]() Зеленый человек ![]() ![]() Профиль Группа: Участник Сообщений: 563 Регистрация: 26.2.2008 Где: Киев Репутация: нет Всего: 8 |
Мой скрипт ловит почту, вытягивает из письма все что нужно и ложу в БД (MS SQL Server 2000).
Если сохранять тело письма таким способом:
то в базу заносится ровно аж 80 символов...остальное нагло обрезает (длина поля установлена нормальная). Кстати, если через bind_param - результат аналогичен. Но если сделать так:
то весь текст отлично ложится в БД. В книжках написано, что экранирование обеими способами эквивалентно. Но выходит что не совсем. Кто нибудь может объяснить подобное...хочется все таки разобраться почему так. |
||||
|
|||||
| mvsgt |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 27.3.2009 Репутация: 1 Всего: 1 |
первое - это не экранирование, кстати.
Напишите как таблица описана. Один из вариантов, когда напишете, будет проверить - как bind_param воспринимает данные. По правилам надо указать тип данных, может быть автоопределение типа ошибается. Это сообщение отредактировал(а) mvsgt - 11.2.2010, 12:42 |
|||
|
||||
| morpheyushka |
|
|||
![]() Зеленый человек ![]() ![]() Профиль Группа: Участник Сообщений: 563 Регистрация: 26.2.2008 Где: Киев Репутация: нет Всего: 8 |
Может быть...я с Perl на Вы и шепотом. А как явно указать на требуемый тип? Id int 4 Subject varchar 8000 FromAddress varchar 8000 Body varchar 8000 |
|||
|
||||
| krypt3r |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 359 Регистрация: 9.6.2009 Репутация: 2 Всего: 16 |
NULL-байт случайно в данные не попадает?
|
|||
|
||||
| mvsgt |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 27.3.2009 Репутация: 1 Всего: 1 |
Например
Какие доступны типы - покажет программка:
Я нарывался на похожие проблемы с типами. Вообще то что у Вас действительно очень похоже на нулевой байт, но откуда он в почте может взяться? Посмотрите, по какому символу режется. |
||||
|
|||||
| morpheyushka |
|
|||
![]() Зеленый человек ![]() ![]() Профиль Группа: Участник Сообщений: 563 Регистрация: 26.2.2008 Где: Киев Репутация: нет Всего: 8 |
А как проверить на его наличие. не поверите - по любому, четко после 80 символа. Предложеный вариант не помог - то же самое, не больше 80 символов, остальное отрезает |
|||
|
||||
| morpheyushka |
|
|||
![]() Зеленый человек ![]() ![]() Профиль Группа: Участник Сообщений: 563 Регистрация: 26.2.2008 Где: Киев Репутация: нет Всего: 8 |
Ну в принципе, раз уже работает через quote - это тоже хорошо. Запросы четко составлены, изменяться не будут.
Меня другое интересует - хватит ли quote для экранирования строки в запросе...ничего плохого не пройдет через нее? |
|||
|
||||
| mvsgt |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 27.3.2009 Репутация: 1 Всего: 1 |
Не пройдёт, только производительность может быть несколько ниже - на порядок-два, в зависимости от базы.
вообще такое поведение bind_param совершенно неправильное, я бы на Вашем месте попытался понять в чём дело. |
|||
|
||||
| morpheyushka |
|
|||
![]() Зеленый человек ![]() ![]() Профиль Группа: Участник Сообщений: 563 Регистрация: 26.2.2008 Где: Киев Репутация: нет Всего: 8 |
Я это и пытаюсь сделать...руки еще не опустил. Просто проект нужно доделывать - делаю help desk. Для разработки остальных модулей системы и такой скрипт сойдет. А там как разберусь - исправлю А как можно это проверить? |
|||
|
||||
| mvsgt |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 27.3.2009 Репутация: 1 Всего: 1 |
||||
|
||||
| morpheyushka |
|
|||
![]() Зеленый человек ![]() ![]() Профиль Группа: Участник Сообщений: 563 Регистрация: 26.2.2008 Где: Киев Репутация: нет Всего: 8 |
||||
|
||||
| morpheyushka |
|
|||
![]() Зеленый человек ![]() ![]() Профиль Группа: Участник Сообщений: 563 Регистрация: 26.2.2008 Где: Киев Репутация: нет Всего: 8 |
Я так понимая, что NULL-байт будет иметь вид - 00. Так вот таких нет...проверил
|
|||
|
||||
| vadiml |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: 5 Всего: 7 |
А Вы не пробовали перед копированием в базу просто тупо порезать все ненужные символы? Это тупой и надёжный способ.
$body =~ s/[^0-9A-Za-zА-Яа-яЁё.....]//sg; # вместо ..... дописать нужные символы Если Вам нужен только текст, то это самый оптимальный вариант и давно проверенный вариант. Иначе можете порезать все непечатаемые/управляющие символы. |
|||
|
||||
| mvsgt |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 27.3.2009 Репутация: 1 Всего: 1 |
Вот что тупой - это точно. Ну можно лечить болезнь "насморк" исключением его из списка болезней. А можно найти окно, из которого дует. Если из тела письма что-то исключать, то это уже не то письмо, которое было вначале. Да и нету в письмах обычно никаких спецсимволов. |
|||
|
||||
| vadiml |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: 5 Всего: 7 |
mvsgt,
А это зависит от назначения копирования в базу, если нужен только тект писем -- то это оптимальный способ. Полностью письмо редко нужно. |
|||
|
||||
| mvsgt |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 27.3.2009 Репутация: 1 Всего: 1 |
||||
|
||||
| vadiml |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: 5 Всего: 7 |
"какая-то программа" текст от вложения (картинки, архива, ...) думаю отличить-таки сможет.
А для хранения в писем базе есть два основных повода: 1. это почтовая система и тут нужно всё письмо 2. это система автоматического разбора писем, типа модулей Mail::Lite, и для неё обычно нужен только текст письма Вот 2й вариант наиболее частый, да и автор темы пишет что ему нужно только тело письма. В других случаях хранить письма в базе обычно не оптимально, даже во многих мануалах по оптимизации баз пишут что бинарные данные лучше хранить в отдельных файлах, а в базе хранить только путь к ним. |
|||
|
||||
| gcc |
|
|||
![]() Агент алкомафии ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2691 Регистрация: 25.4.2008 Где: %&й Репутация: 1 Всего: 17 |
dbmail еще есть
удобно хранит в pgsql, на триггерах можно спам резать использовать белые/серые/черные списки, и даже есть веб-интерфейс чтобы почту получить без pop и imap, а именно из базы Это сообщение отредактировал(а) gcc - 18.2.2010, 15:38 |
|||
|
||||
| mvsgt |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 209 Регистрация: 27.3.2009 Репутация: 1 Всего: 1 |
||||
|
||||
| vadiml |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 27.7.2007 Репутация: 5 Всего: 7 |
А это зависит от того, как собирать письмо.
Но для авторазбора писем всегда известно в каком виде будут идти письма, т.к. изначально берутся 2-3 письма для создания шаблона для каждого типа писем, даже когда приходят письма из сотни разных мест. Разбирать "сферического коня в вакууме" с неизвестными целями никто не будет. Я таким занимался на нескольких работах совершенно не связанных между собой тематически -- и написанием рассылок, и их обработчиками (на последней только добавлял обработчики в уже готовую систему) -- везде всегда известно что намечается обрабатывать даже при невозможности повлиять на формат входящих писем. |
|||
|
||||
| morpheyushka |
|
||||
![]() Зеленый человек ![]() ![]() Профиль Группа: Участник Сообщений: 563 Регистрация: 26.2.2008 Где: Киев Репутация: нет Всего: 8 |
Кстати...это как раз в точку. Очень часто письма состоят из нескольких частей - текст и html. Поправте меня, если я не прав. Я так понимаю, что одна часть письма содержит что то одно. То есть в этом случае будет две части: 1. текст 2. html Если будет вложение - то это еще будет отдельная часть письма. И еще - всегда ли текст идет в первой части? Для примера:
Так вот...пока что в 0-ой части всегда текст попадает. Просто html мне не к чему. |
||||
|
|||||
| tishaishii |
|
|||
![]() Создатель ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1262 Регистрация: 14.2.2006 Где: Москва Репутация: 4 Всего: 8 |
А как увидеть пример письма, которое режет?
У меня что-то так не получается, чтобы резало, только целиком в БД попадает. Может, баг в версии DBI? |
|||
|
||||
| morpheyushka |
|
|||
![]() Зеленый человек ![]() ![]() Профиль Группа: Участник Сообщений: 563 Регистрация: 26.2.2008 Где: Киев Репутация: нет Всего: 8 |
Да я даже пытаюсь просто строчку положить
и заносится только первые 80 символов |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |