Страницы

Поиск по вопросам

понедельник, 6 января 2020 г.

NPE в теле почтового сообщения. Java получение сообщений mail.ru

#java #javamail


При получении почтового сообщения с Mail.ru message.getContent() или message.isMimeType("text/plain")
вызывает возникновение NPE, хотя тема и отправитель читаются корректно. С Яндекса все
хорошо, с gmail тоже.
Сообщение отправляется с браузера (с Gmail), а не программно.
Сталкивался ли кто-то с таким? Код стандартный:

private Session session(String protocol, String host, Integer port) {
    final Properties properties = new Properties();
    properties.put("mail.store.protocol", protocol);
    properties.put(String.format("mail.%s.host", protocol), host);
    properties.put(String.format("mail.%s.port", protocol), String.valueOf(port));
    properties.setProperty(String.format("mail.%s.socketFactory.class", protocol),
"javax.net.ssl.SSLSocketFactory");
    properties.setProperty(String.format("mail.%s.socketFactory.fallback", protocol),
"false");
    properties.setProperty(String.format("mail.%s.socketFactory.port", protocol),
String.valueOf(port));
    properties.setProperty("mail.mime.decodetext.strict", "false");

    return Session.getInstance(properties);
}
public synchronized List receiveMessages(String protocol, String host, Integer
port, String username, String password) throws MessagingException {
    final Session session = session(protocol, host, port);

    store = session.getStore(protocol);
    store.connect(host, username, password);

    inbox = store.getFolder("INBOX");
    inbox.open(Folder.READ_WRITE);
    final Message[] messages = inbox.search(new FlagTerm(new Flags(Flags.Flag.SEEN),
false));

    return Lists.newArrayList(messages);
}


Stack Trace:

Caused by: java.lang.NullPointerException: null
at javax.mail.internet.MimeUtility.quote(MimeUtility.java:975) ~[mail-1.4.7.jar:1.4.7]
at javax.mail.internet.ParameterList.quote(ParameterList.java:672) ~[mail-1.4.7.jar:1.4.7]
at javax.mail.internet.ParameterList.access$200(ParameterList.java:76) ~[mail-1.4.7.jar:1.4.7]
at javax.mail.internet.ParameterList$ToStringBuffer.addNV(ParameterList.java:640)
~[mail-1.4.7.jar:1.4.7]
at javax.mail.internet.ParameterList.toString(ParameterList.java:621) ~[mail-1.4.7.jar:1.4.7]
at javax.mail.internet.ContentType.toString(ContentType.java:221) ~[mail-1.4.7.jar:1.4.7]
at com.sun.mail.imap.IMAPMessage.getDataHandler(IMAPMessage.java:644) ~[mail-1.4.7.jar:1.4.7]
at javax.mail.internet.MimeMessage.getContent(MimeMessage.java:1420) ~[mail-1.4.7.jar:1.4.7]
at com.brooma.legalsm.task.manager.util.MailParser.plainText(MailParser.java:44)
~[legalsm-task-manager-1.0.jar:na]
at com.brooma.legalsm.task.manager.util.MailParser.(MailParser.java:30) ~[legalsm-task-manager-1.0.jar:na]
at com.brooma.legalsm.task.manager.util.MailParser.create(MailParser.java:96) ~[legalsm-task-manager-1.0.jar:na]
at com.brooma.legalsm.task.manager.job.IssueFromEmailJob.processEmail(IssueFromEmailJob.java:83)
~[legalsm-task-manager-1.0.jar:na]
at com.brooma.legalsm.task.manager.job.IssueFromEmailJob.lambda$execute$0(IssueFromEmailJob.java:69)
~[legalsm-task-manager-1.0.jar:na]
at java.util.ArrayList.forEach(ArrayList.java:1249) ~[na:1.8.0_65]
at com.brooma.legalsm.task.manager.job.IssueFromEmailJob.execute(IssueFromEmailJob.java:69)
~[legalsm-task-manager-1.0.jar:na]
... 2 common frames omitted

    


Ответы

Ответ 1



Это баг: https://kenai.com/bugzilla/show_bug.cgi?id=5978 Для решения необходимо использовать версию 1.5.5 и следующую зависимость: javax.mail javax.mail-api ${javax.mail.version}

Switch использование readonly переменных в case

#c_sharp #типы_данных


Имею следующий код

static void Main(string[] args)
        {
            string value = "value1";
            // switch с const переменными работает
            switch(value)
            {
                case ConstVariable.VALUE1:
                    Console.WriteLine(ConstVariable.VALUE1);
                    break;
                case ConstVariable.VALUE2:
                    Console.WriteLine(ConstVariable.VALUE2);
                    break;
                case ConstVariable.VALUE3:
                    Console.WriteLine(ConstVariable.VALUE3);
                    break;
            }

            // ЗДЕСЬ ОШИБКА!!! switch c readonly переменными не работает
            switch (value)
            {
                case ReadOnlyVariable.VALUE1:
                    Console.WriteLine(ConstVariable.VALUE1);
                    break;
                case ReadOnlyVariable.VALUE2:
                    Console.WriteLine(ConstVariable.VALUE2);
                    break;
                case ReadOnlyVariable.VALUE3:
                    Console.WriteLine(ConstVariable.VALUE3);
                    break;
            }
        }


        static class ReadOnlyVariable
        {
            public static readonly string VALUE1 = "value1";

            public static readonly string VALUE2 = "value2";

            public static readonly string VALUE3 = "value3";

        }

        static class ConstVariable
        {
            public const string VALUE1 = "value1";

            public const string VALUE2 = "value2";

            public const string VALUE3 = "value3";

        }


В блоке switch я могу использовать переменные const, но если я использую переменны
readonly, то получаю ошибку


  A constant value is expected


Почему так, разве переменные readonly на этапе компиляции не определяются?
    


Ответы

Ответ 1



readonly значит, что поле должно быть инициализировано в конструкторе и последующая модификация данного поля запрещена. Т.е. это гарантия того, что раз поле проинициализировано в конструкторе, оно больше не может быть изменено в других частях класса. Но это не делает его сущностью времени компиляции — нет, оно защищено от переинициализации, но не является константным. Подробнее в документации

Минусы хранения статей в файлах, а не в базе данных

#база_данных #cms #веб_программирование


Некоторые CMS используют для хранения статей не базу данных, а обычные текстовые
файлы. Хотелось бы узнать, какие в этом случае могут возникнуть проблемы при большом
количестве статей. 

Пока единственное, что приходит на ум - это поиск, но при желании и его можно ускорить,
если создавать индекс.

PS. Одним таким движком я давно уже пользуюсь и доволен, но статей на данный момент
не очень много.
    


Ответы

Ответ 1



Резервная копия. Придётся файлы копировать отдельно от базы. Если в это время происходят транзакции, то файлы могут оказаться немного не синхронизированными с базой. Индексация. Многие базы поддерживают полнотекстовый поиск и соответствующие индексы. По своим полям они точно ищут и индексируют, а вот внешние файлы - кто знает? Хотя конечно можно сделать поля специально для хранения индекса (грубо говоря из текста извлечь ключевые слова и поместить в это поле). Переключение с одной методы получения/записи данных на другую. Это просто неудобство. В некоторых случаях оно так и так будет (если пользоваться не привычным SELECT/INSERT, а каким-то более эффективным на больших данных поточным интерфейсом базы данных) В любом случае приходится предпринимать дополнительные усилия по синхронизации записей в БД и внешних файлов. Где это действительно важно, требуется задействовать базы данных и файловые системы с поддержкой распределённых транзакций, координировать транзакции бд и фс.

В чем отличие паттерна 'абстрактная фабрика' от паттерна 'строитель'?

#c_sharp #шаблоны_проектирования


Не понял в чем различия между паттернами 'абстрактная фабрика' и 'строитель'. На
основе каких критериев выполняется выбор? Какие вопросы я должен задать себе, что бы
понять какой порождающий паттерн из двух приведенных мне использовать?
    


Ответы

Ответ 1



Абстрактная фабрика предоставляет интерфейс для создания семейств, связанных между собой, или независимых объектов, конкретные классы которых неизвестны. Строитель отделяет конструирование сложного объекта от его представления, позволяя использовать один и тот же процесс конструирования для создания различных представлений Основное различие между ними в том, что строитель делает акцент на пошаговом конструировании объекта, а абстрактная фабрика на создании семейств объектов. Строитель возвращает объект на последнем шаге, тогда как с точки зрения абстрактной фабрики продукт возвращается немедленно.

Ответ 2



Если на конкретных примерах, паттерн Строитель - SqlConnectionStringBuilder В них вы задаете параметры, хост, порт, авторизация, логин, пароль, потом вызываете метод ToString() И получаете конечный результат. С фабриками не так. Для инициализации вы вызываете не конструктор, а специальный фабричный метод абстрактного класса или родителя, который возвращает экземпляр нужного потомка. Например: WebRequest request = WebRequest.Create("http://localhost:8080"); вернет HttpWebRequest, а если вы вызовете с другим значением аргумента: WebRequest request = WebRequest.Create("ftp://localhost:21"); вернет FtpWebRequest.

Как исправить: Не удалось создать защищенный канал SSL/TLS?

#c_sharp #winforms



  System.Net.WebException: Запрос был прерван:Не удалось создать защищенный канал
SSL/TLS. в System.Net.HttpWebRequest.GetResponse()


string html = string.Empty;
string url = "https://google.com";

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.KeepAlive = true;

//на всякий пожарный добавил в решений этой ошибки видел подобое
request.Credentials = CredentialCache.DefaultCredentials;

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream))
{
    html = reader.ReadToEnd();
}

    


Ответы

Ответ 1



Попробуйте указать допустимые протоколы ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

удаление старых файлов с помощью find

#linux


Нужно написать команду, которая бы удаляла все файлы расширения .txt из папки /home/u20806/public_html,
которые были созданы или изменены 25 минут назад.

Сделал так: find /home/u20806/public_html -daystart -maxdepth 1 -mmin +25 -type f
-name "*.txt" \ -exec rm -f {} \; 

Выдает ошибку find: path must precede expression:
Usage: find [-H][-L][-P][-Olevel][-D help|tree|search|stat|rates|opt|exec][path...][expression]

Как переписать?
    


Ответы

Ответ 1



я вижу в этой команде две ошибки и одну неоптимальность: find /home/u20806/public_html -daystart -maxdepth 1 -mmin +25 -type f -name "*.txt" \ -exec rm -f {} \; во-первых, благодаря опции -daystart программа find «найдёт» не совсем то, что вам требуется: время (указанное опцией -mmin) будет «отсчитываться» не от текущего момента, а от начала этого дня (см. внимательней на описание опции -daystart в man find). во-вторых, параметр \ между -name и -exec не нужен и порождает описанную ошибку. в-третьих, и действие -exec ... лучше заменить на действие -delete. резюмируя, предложу написать, например, так: find /home/u20806/public_html -maxdepth 1 -mmin +25 -type f -name "*.txt" -delete

Посчитать размер файла в байтах на shell

#linux #shell


Основная задача - узнать размер файла. 
Изначально в проекте пользовался du -b file.txt.
Проект переехал на BusyBox. Теперь у команды du нет опции -b.
Каким образом еще можно посчитать размер файла в байтах.
    


Ответы

Ответ 1



Для получения подробной информации о файлах надо использовать команду stat: stat имя-файла -c %s Для получения информации в том же виде, как выдает du -b т.е. с именем файла после размера, можно использовать формат -c "%s %n"