Работа с файлами Python

В данной статье мы рассмотрим встроенные средства python для работы с файлами: открытие / закрытие, чтение и запись.
Итак, начнем. Прежде, чем работать с файлом, его надо открыть. С этим замечательно справится встроенная функция open:
f = open('text.txt', 'r')
У функции open много параметров, они указаны в статье "Встроенные функции", нам пока важны 3 аргумента: первый, это имя файла. Путь к файлу может быть относительным или абсолютным. Второй аргумент, это режим, в котором мы будем открывать файл.
РежимОбозначение
'r'открытие на чтение (является значением по умолчанию).
'w'открытие на запись, содержимое файла удаляется, если файла не существует, создается новый.
'x'открытие на запись, если файла не существует, иначе исключение.
'a'открытие на дозапись, информация добавляется в конец файла.
'b'открытие в двоичном режиме.
't'открытие в текстовом режиме (является значением по умолчанию).
'+'открытие на чтение и запись
Режимы могут быть объединены, то есть, к примеру, 'rb' - чтение в двоичном режиме. По умолчанию режим равен 'rt'.
И последний аргумент, encoding, нужен только в текстовом режиме чтения файла. Этот аргумент задает кодировку.

Чтение из файла

Открыли мы файл, а теперь мы хотим прочитать из него информацию. Для этого есть несколько способов, но большого интереса заслуживают лишь два из них.
Первый - метод read, читающий весь файл целиком, если был вызван без аргументов, и n символов, если был вызван с аргументом (целым числом n).
>>> f = open('text.txt')
>>> f.read(1)
'H'
>>> f.read()
'ello world!\nThe end.\n\n'
Ещё один способ сделать это - прочитать файл построчно, воспользовавшись циклом for:
>>> f = open('text.txt')
>>> for line in f:
    line


'Hello world!\n'
'\n'
'The end.\n'
'\n'

Запись в файл

Теперь рассмотрим запись в файл. Попробуем записать в файл вот такой вот список:
>>> l = [str(i)+str(i-1) for i in range(20)]
>>> l
['0-1', '10', '21', '32', '43', '54', '65', '76', '87', '98', '109', '1110', '1211', '1312', '1413', '1514', '1615', '1716', '1817', '1918']
Откроем файл на запись:
>>> f = open('text.txt', 'w')
Запись в файл осуществляется с помощью метода write:
>>> for index in l:
    f.write(index + '\n')


4
3
3
3
3
Для тех, кто не понял, что это за цифры, поясню: метод write возвращает число записанных символов.
После окончания работы с файлом его обязательно нужно закрыть с помощью метода close:
>>> f.close()
Теперь попробуем воссоздать этот список из получившегося файла. Откроем файл на чтение (надеюсь, вы поняли, как это сделать?), и прочитаем строки.
>>> f = open('text.txt', 'r')
>>> l = [line.strip() for line in f]
>>> l
['0-1', '10', '21', '32', '43', '54', '65', '76', '87', '98', '109', '1110', '1211', '1312', '1413', '1514', '1615', '1716', '1817', '1918']
>>> f.close()
Мы получили тот же список, что и был. В более сложных случаях (словарях, вложенных кортежей и т. д.) алгоритм записи придумать сложнее. Но это и не нужно. В python уже давно придумали средства, такие какpickle или json, позволяющие сохранять в файле сложные структуры.
А на этом у меня пока всё, против вопросов/предложений не возражаю.

Загрузить Python бесплатно

Python — высокоуровневый язык программирования c минимумом синтаксиса и максимумом полезных функций. Авторы Python особо подчеркивают производительность разработчика и читаемость кода. Основные архитектурные черты языка — динамическая типизация, автоматическое управление памятью, полная интроспекция, механизм обработки исключений, поддержка многопоточных вычислений и удобные высокоуровневые структуры данных.
Python поддерживает структурную, объектно-ориентированную, функциональную, императивную и аспектно-ориентированную парадигмы. Код в Python организовывается в функции и классы, которые могут объединяться в модули (которые в свою очередь могут быть объединены в пакеты).

Основные особенности Python:

— Чистый читаемый синтаксис кода.
— Сильные возможности самоанализа.
— Интуитивная ориентация объекта.
— Натуральное выражение процедурного кода.
— Полная модульность, поддержка иерархических пакетов.
— Обработка ошибок в виде исключений.
— Высокоуровневые динамические типы данных.
— Огромная стандартная библиотека и набор сторонних модулей для решения любых задач.
— Дополнения и модули легко написать на других языках.
— Встраивание в приложения в виде скриптовой оболочки.

Скачать python

Загрузить C++ бесплатно


C++ — компилируемый статически типизированный язык программирования общего назначения.

Поддерживает такие парадигмы программирования как процедурное программирование, объектно-ориентированное программирование, обобщённое программирование, обеспечивает модульность, раздельную компиляцию, обработку исключений, абстракцию данных, объявление типов (классов) объектов, виртуальные функции. Стандартная библиотека включает, в том числе, общеупотребительные контейнеры и алгоритмы. C++ сочетает свойства как высокоуровневых, так и низкоуровневых языков. В сравнении с его предшественником — языком C, — наибольшее внимание уделено поддержке объектно-ориентированного и обобщённого программирования.

C++ широко используется для разработки программного обеспечения, являясь одним из самых популярных языков программирования. Область его применения включает создание операционных систем, разнообразных прикладных программ, драйверов устройств, приложений для встраиваемых систем, высокопроизводительных серверов, а также развлекательных приложений (игр). Существует множество реализаций языка C++, как бесплатных, так и коммерческих и для различных платформ. Например, на платформе x86 это GCC, Visual C++, Intel C++ Compiler,Embarcadero (Borland) C++ Builder и другие. C++ оказал огромное влияние на другие языки программирования, в первую очередь на Java и C#.

Синтаксис C++ унаследован от языка C. Одним из принципов разработки было сохранение совместимости с C. Тем не менее, C++ не является в строгом смысле надмножеством C; множество программ, которые могут одинаково успешно транслироваться как компиляторами C, так и компиляторами C++, довольно велико, но не включает все возможные программы на C.


Загрузить C++ бесплатно

Загрузить Java бесплатно

Загрузите Java на свой настольный компьютер сейчас!

Технология Java позволяет работать и играть в безопасной вычислительной среде. Обновление до последней версии Java повысит безопасность вашей системы, так как в состав более старых версий не входят последние обновления системы безопасности.
Благодаря Java можно играть в онлайн-игры, общаться с людьми по всему миру, подсчитывать проценты по закладным, просматривать изображения в формате 3D и выполнять множество других задач.

1С Перенос справочников и остатков из 1С:Предприятие 7.7 в 1С:Предприятие 8.

Инструмент: решение от разработчиков 1С, которое входит в комплект поставки 1С:Бухгалтерии 8.

Благодарности: Стоит выразить благодарность разработчикам 1С, которые создали отличный механизм конвертации данных.

Возможности конвертации данных

Из информационной базы конфигурации "Бухгалтерский учет для Украины", редакции 2.5 в конфигурацию "Бухгалтерия для Украины", редакция 1.1 переносится:
  • остатки по счетам бухгалтерского учета на конец завершенного отчетного (налогового) периода;
  • сведения об объектах аналитического учета.

Технические подробности

Чтобы перенести данные, понадобятся файлы, которые хранятся в папке Convert каталога шаблона конфигурации "Бухгалтерия для Украины". Обычно это здесь:
Расположение правил конвертации и обработки выгрузки из 1С:Бухгалтерии 7.7
Файлы:
  • V77Exp.ert - обработка выгрузки из конфигурации "Бухгалтерский учет для Украины",редакции 2.5 в файл;
  • BU77_80.xml - правила конвертации данных из бухгалтерии 7.7 в бухгалтерию 8;
  • BU77_80.txt – инструкция по переносу данных.
Конвертация выполняется в два этапа:
  • данные из информационной базы конфигурации "Бухгалтерский учет для Украины" выгружаются в отдельный файл (файл данных в формате *.xml);
  • полученный файл загружается в информационную базу конфигурации "Бухгалтерия 8 для Украины"

Переносим данные!


Шаг 1. Создайте архивную копию информационной базы "Бухгалтерский учет для Украины", редакции 2.5;
Шаг 2. Если релиз 1С:Бухгалтерии 7.7 для Украины ниже 7.70.266, то проведите обновление конфигурации до указанной или более поздней версии;
Шаг 3. Выполните регламентные операции по бухгалтерскому и налоговому учета за последний месяц;
Шаг 4. Скопируйте папку Convert (внутри находяться файлы V778Exp.ert и BU77_80.xml) из каталога установки шаблона конфигурации на рабочий стол Вашего компьютера
Готовимся к переносу данных из 1С. Копируем папку Convert в удобное место
Шаг 5. Запустите 1С:Бухгалтерию 7.7 в режиме 1С:Предприятие;
Запуск 1С:Бухгалтерии 7.7 в режиме 1С:Предприятие. Требуется выбрать нужную информационную базу

Шаг 6. Запустите внешнюю обработку V77Exp.ert (меню Файл – Открыть).
Открыть внешнюю обработку в 1С Предприятие 7.7
Внешняя обработка 1C расположена в папке Convert на рабочем столе. Открываем папку Convert
Открываем файл внешней обработки универсальной выгрузки данных из 1С Предприятия 7.7
Откроется обработка «Универсальная выгрузка данных в формате XML»
Форма обработки "Универсальная выгрузка данных в формате XML" для 1С 7.7 - выбор файлов и даты выгрузки остатков
В диалоге обработки укажите:
  • файл правил конвертации данных BU77_80.xml (поле "Имя файла правил", находится на рабочем столе в папке Convert);
  • файл, в который будут выгружены данные, например, Данные77.xml (поле "Имя файла данных", файл удобно создавать в той же папке Convert);
  • дату, на которую будут выгружаться остатки (поле "Дата начала").

Шаг 7. Нажмите кнопку "Загрузить правила обмена". При этом в диалоге обработки заполнится список правил выгрузки данных (это может занять некоторое время).
Загрузка правил конвертации данных для 1С Бухгалтерии 7.7
Список правил представляет из себя перечень счетов, остатки которых могут быть конвертированы, и справочников, которые могут быть перенесены в конфигурацию "1С:Бухгалтерия 8 для Украины".
Шаг 8. На закладке "Параметры" укажите Фирму, для которой предполагается выгружать данные. Например, ООО «Добро».
Закладка "Параметры" обработки выгрузки данных из 7.7 - выбираем фирму, по которой выгружаем данные в 1С Бухгалтерию 8
Шаг 9. В списке правил выгрузки данных отметьте счета и справочники, которые нужно выгружать (конвертировать). Нажимаем кнопку "Выгрузить";
Выбор правил выгрузки данных и запуск процесса выгрузки в 1С:Бухгалтерии 7.7
Результаты выгрузки увидим в окне сообщений. В папке Convert будет создан файл Данные77.xml. Размер файла зависит от объема справочной информации и данных по остаткам.
1С:Предприятие. Выгрузка данных завершена (их бухгалтерии 7.7)
Шаг 10. В Ярлык 1С Предприятие 8 1С:Бухгалтерии 8  (версии не ниже 1.1.1, в нашем примере 1.6.5) создайте новую информационную базу из шаблона;
Окно запуска 1С:Предприятия 8 - нажимаем кнопку "Добавить..."
1С Предприятие 8 - добавление информационной базы - создание новой информационной базы
1С Предприятие 8 - создание новой информационной базы из шаблона
Указываем наименование новой информационной базы в 1С Предприятие 8, например "Бухгалтерия для Украины"
Выбираем каталог информационный базы в 1С 8
Шаг 11. Выполните первый запуск новой информационной базы в режиме 1С:Предприятие.
Выполняем первый запуск новой информационной базы "Бухгалтерия для Украины" в режиме 1С:Предприятие
Начальное заполнение информационной базы проходит автоматически. Информацию о результатах заполнения можно найти в окне сообщений. Стартовый помощник нужно закрыть.
Окно - 1С:Предприятие - Бухгалтерия для Украины, редакция 1.1
Шаг 12. Установите настройки учета. Откройте форму настройки Предприятие - Настройки параметров учета
Меню "Предприятие" - "Настройки параметров учета" в 1С Бухгалтерии 8 для Украины
Перейдите на закладку "Запасы" и установите следующие флажки.
  • Группа "Бухгалтерский учет":
    • Вести учет по партиям;
    • Вести складской учет;
    • Вести суммовой учет по складам.
  • Группа "Налоговый учет":
    • вести складской учет.
Форма настройки параметров учета, закладка "Запасы" - 1С Бухгалтерия 8 для Украины
Остальные флажки на данной закладке должны быть сняты. В окне сообщений будет сообщаться об изменении в аналитике счетов учета.
Окно сообщений, в котором сообщается об изменении в аналитике счетов учета в 1С Бухгалтерии 8
Шаг 13. Через меню Сервис – Прочие обмены данными – Универсальный обмен данными в формате XML откройте форму загрузки данных
Меню "Сервис" – "Прочие обмены данными" – "Универсальный обмен данными в формате XML" в 1С:Бухгалтерии 8 для Украины, релиз 1.6.5
В открывшемся диалоге перейдите на закладку "Загрузка данных", укажите имя файла данных. В нашем примере файл с данными называется Данные77.xml и находится в папке Convert на рабочем столе Вашего компьютера.
Важно: Для пользователей базовой версии 1С:Бухгалтерии 8. Перед загрузкой данных в справочнике «Организации» нужно вручную изменить код элемента «Наша организация» на значение кода из версии 1С:Бухгалтерия 7.7. В противном случае загрузка не выполнится, т.к. будет предпринята попытка создать вторую фирму в одной базе. Подробней читайте об особенностях базовой версии.
Нажмите кнопку "Загрузить данные".
Обработка в 1С 8 "Универсальный обмен данными в формате XML (2.0.24)" . Закладка "Загрузка данных". Выбор файла для загрузки. Нажать кнопку "Загрузить данные".
Время загрузки зависит от объема данных.
1С:Предприятие 8: "Загрузка данных завершена!"
Результаты загрузки данных в 1С:Бухгалтерию 8 для Украины отображаются в окне сообщений.
Окно "Служебные сообщения". Результаты загрузки данных в 1С:Бухгалтерию 8 для Украины
Шаг 14. Данные о льготах сотрудников по НДФЛ необходимо внести вручную. Для этого используется специальный документ "Заявление на применение льготы НДФЛ". Открывается через меню Зарплата – Учет НДФЛ и взносов - Заявление на применение льготы НДФЛ.

Результаты конвертации данных

После переноса данных остается просмотреть результаты и приступать к работе с программой 1С:Бухгалтерия 8 для Украины!
Результаты переноса данных из конфигурации 1С:Бухгалтерии 7.7 в 1С:Бухгалтерию 8 для Украины

1С Как программно создать документ в 8.2


Рассмотрим на примере документа «Реализация товаров и услуг», входящего в типовую конфигурацию 1С 8 Бухгалтерия, как программно можно создать документ и программно наполнить его данными.
Добавить документ средствами встроенного языка 1С можно, воспользовавшись методом «СоздатьДокумент» (данный метод встроен в платформу 1С 8 для объекта «ДокументМенеджер»).
После добавления документа необходимо заполнить все обязательные реквизиты: «Дата», «Организация», «Контрагент», «Склад», «Способ зачета авансов».
Номер документа — это стандартный реквизит, который автоматически заполнится при записи документа.
Если мы хотим отразить в базе данных реализацию товаров — тогда заполняем табличную часть — «Товары» (для реализации услуг — соответственно «Услуги»).
Добавляем необходимое количество строк, в каждой строке заполнив реквизиты табличной части.
После наполнения документа обязательно необходимо применить метод «Записать» (данный метод встроен в платформу 1С 8 для объекта «ДокументОбъект»).
Пример кода по программному созданию документа 1С 8:
Как программно создать документ в 1С
На следующей картинке Вы можете посмотреть, что будет из себя представлять форма документа «Реализация товаров и услуг», созданного нами программно.
Как программно создать документ в 1С
Ну вот и все.

1С Простейший вариант создания отчета СКД

Наиболее эффективным объектом для создания отчетов в 1С 8.1, 
8.2, безусловно является СКД. Однако использование СКД «вчистую» не позволяет вносить параметры и отборы СКД иначе как непосредственно в настройки СКД, что не всегда удобно пользователям. Представленная методика позволяет использовать СКД с некой шаблонной формой, которая берет на себя обмен параметрами СКД и в тоже время, эта форма позволяет пользователю «покапаться» в недрах самой СКД. Шаблон легко модифицируется, скажем для ввода Параметров или Условного оформления.
Допустим требуется построить «Ведомость по взаиморасчетам» в УТ 10.3
 Итак начнем:
  1. Создаем внешний отчет, можно задать его имя «ВедомостьПоВзаиморасчетам»
  2. В этом-же окне создаем «Основную схему компоновки данных»
  3. В схеме добавляем новый набор данных, и, допустим при помощи конструктора запросов формируем нужный запрос, в текущем случае такой:
ВЫБРАТЬ

ВСКОИО.СуммаВзаиморасчетовНачальныйОстаток КАК ВзаиморасчетыНО,

ВСКОИО.СуммаВзаиморасчетовПриход КАК ВзаиморасчетыПриход,

ВСКОИО.СуммаВзаиморасчетовРасход КАК ВзаиморасчетыРасход,

ВСКОИО.СуммаВзаиморасчетовКонечныйОстаток КАК ВзаиморасчетыКО,

ВСКОИО.СуммаУпрНачальныйОстаток КАК СуммаУпрНО,

ВСКОИО.СуммаУпрПриход,

ВСКОИО.СуммаУпрРасход,

ВСКОИО.СуммаУпрКонечныйОстаток КАК СуммаУпрКО,

ВСКОИО.Регистратор,

ВСКОИО.ДоговорКонтрагента,

ВСКОИО.ДоговорКонтрагента.Владелец КАК Контрагент,

ВСКОИО.ДоговорКонтрагента.Организация КАК Организация,

ВСКОИО.Период

ИЗ

РегистрНакопления.ВзаиморасчетыСКонтрагентами.ОстаткиИОбороты ({(&ДатаНачала)}, {(&ДатаКонца)}, Регистратор, ДвиженияИГраницыПериода, ) КАК ВСКОИО

  1. Обращаем внимание, что для верной работы отчета, нужно в Полях СКД для измеренияДоговорКонтрагента в ролях выставить флаг «Обязательное», остальные настройки — по желанию (тех, что есть по умолчанию — вполне достаточно).
    Запрос 
  2. Во вкладке СКД «Ресурсы» - добавляем все количественные ресурсы с функцией «Сумма»
     
  3. Во вкладке СКД «Настройки» - добавляем группировки, например: Организация, Контрагент, ДоговорКонтрагента, Детальные Записи, в «выбранных полях» добавляем нужные, например: Период, Регистратор, и все ресурсы, которые можно объединить в группы,
    Ресурсы
    в «отборе» добавляем нужные по умолчанию отборы, снимая флажки использования, напримерКонтрагент, Организация, ДоговорКонтрагента.
    отборы
    Собственно СКД готова, но вот формы у нее все еще нет, если на этом этапе закончить построение, то 1С сама сформирует форму по умолчанию.
  1. Создаем ФормуОтчета: она стандартная — её нужно наполнить содержимым, причем это содержимое чаще всего переходит из одного отчета в другой с минимальными корректировками. Собственно говоря этот этап и предлагается «шаблонизировать».
А именно вставить готовую форму из уже существующего отчета, подвергнув минимальным изменениям. В рассматриваемом случае из обработки «Шаблон отчета». Здесь нужно обратить внимание на то, что после вставки формы из шаблона отчета, нужно проверить два поля вновь вставленной формы: это в «Основных» Тип значения (нужно установить Тип текущего (редактируемого) отчета), и Заголовок
  1. Также, возможно, потребуются правки модуля вставленной формы, чаще всего это Процедура ОсновнаяПанельСформировать(Кнопка), здесь в строках типа
ПараметрНастройки=Настройки.ПараметрыДанных.Элементы.Найти("ДатаНачала");

ПараметрНастройки.Значение=ДатаНачала;

ПараметрНастройки.Использование=Истина;

в СКД передаются параметры из формы. Остальное, думаю, понятно из текста модуля формы.
  1. Теперь, необходимо указать вставленную (и, возможно откорректированную) форму в качестве основной в поле Форма отчета.
  2. Сохраняем и запускаем в режиме 1С:Предприятие.

Java прием и отправка почты

JavaMail API – это свободно распространяемая библиотека, с помощью которой приложение может получать доступ к почтовым серверам, позволяя создавать, отправлять и получать электронные письма, в том числе и с вложениями, а также удалять письма с сервера.
Данная библиотека поддерживает следующие протоколы: 
  • SMTP, сокращение от Simple Mail Transfer Protocol, протокол, который определяет механизм для доставки электронной почты. Любой клиент электронной почты, при передаче почты, соединяется с сервером SMTP, который, в свою очередь, доставляет сообщение на сервер SMTP получателя. А затем получатель извлекает сообщение с помощью POP или IMAP.
  • POP, сокращение от Post Office Protocol. В настоящее время его третья версия известна как POP3. Большинство почтовых серверов используют этот протокол, чтобы обеспечить получение сообщений пользователем. В действительности POP3 гарантирует лишь, что каждый пользователь имеет свой собственный почтовый ящик.
  • IMAP, сокращение от Internet Message Access Protocol. Представляет собой более продвинутый протокол для получения сообщений. При использовании IMAP, почтовый сервер должен поддерживать этот протокол. IMAP предоставляет клиентскому приложению доступ к удаленным хранилищам сообщений, как если бы они были локальные. По сравнению с POP, IMAP значительно сильнее нагружает сервер.
Для понимания принципов использования библиотеки JavaMail API необходимо определить несколько ключевых понятий:
Message - абстрактный класс, который представляет собой сообщения электронной почты. JavaMail реализует RFC822 и MIME стандарты обмена сообщениями. MimeMessage класс расширяет Message для работы с сообщениями, имеющими MIME-тип. 
Структура сообщения:
  • Простое сообщение имеет один объект контента:
  • Multipart сообщение представляет собой контейнер объектов BodyPart. Структура BodyPart объекта похожа на структуру Message объекта. Каждый объект BodyPart содержит атрибуты и содержимое, но атрибуты Bodypart объекта ограничиваются теми, которые определены в интерфейсе Part.  Содержимое BodyPart объекта – это DataHandler, который содержит либо данные или другой  Multipart объект.
image
Store - абстрактный класс, который представляет собой хранилище сообщений поддерживаемых почтовым сервером и сгруппированных по владельцу. Store использует отдельный протокол доступа. 
Folder - абстрактный класс, который предоставляет возможность иерархически организовывать сообщения. Папки могут содержать сообщения и другие папки. Почтовый сервер по умолчанию предоставляет каждому пользователю папку, а пользователи обычно, создают и заполняют вложенные подпапки. 
Transport - абстрактный класс, который представляет собой спецификацию протокола передачи. Transport использует объект конкретного протокола передачи, чтобы отправить сообщение.
Session - класс, который определяет основные сессии почты. Чтобы передать значения в объект сессии, могут быть использованы Properties. 
Authenticator – класс, который обеспечивает доступ к защищенным ресурсам с помощью имени пользователя и пароля. Ресурсами, может быть что угодно, начиная от простых файлов на серверах. Для JavaMail, ресурс – это сервер. Приложения используют этот класс при получении сессии. Когда требуется авторизация, система будет вызывать метод подкласса (например, getPasswordAuthentication). Этот метод подкласса может делать запросы аутентификации.
Ну а теперь пришло время посмотреть, как все это работает. 
Скачиваем библиотеку тут и импортируем ее в проект: 
http://www.oracle.com/technetwork/java/index-138643.html
Теперь посмотрим, как с помощью JavaMail API можно отправлять простые сообщения:
package ru.quizful; 
 
import javax.mail.*; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 
import java.io.UnsupportedEncodingException; 
import java.util.Properties; 
 
public class TestMail { 
    static final String ENCODING = "UTF-8"; 
 
    public static void main(String args[]) throws MessagingException, UnsupportedEncodingException { 
        String subject = "Subject"; 
        String content = "Test"; 
        String smtpHost="smtp.rambler.ru"; 
        String address="test@rambler.ru"; 
        String login="test"; 
        String password="test"; 
        String smtpPort="25";  
        sendSimpleMessage (login, password, address, address, content, subject, smtpPort, smtpHost);         
    } 
 
    public static void sendSimpleMessage(String login, String password, String from, String to, String content, String subject, String smtpPort, String smtpHost)  
        throws MessagingException, UnsupportedEncodingException { 
        Authenticator auth = new MyAuthenticator(login, password); 
 
        Properties props = System.getProperties(); 
        props.put("mail.smtp.port", smtpPort); 
        props.put("mail.smtp.host", smtpHost); 
        props.put("mail.smtp.auth""true"); 
        props.put("mail.mime.charset", ENCODING); 
        Session session = Session.getDefaultInstance(props, auth); 
 
        Message msg = new MimeMessage(session); 
        msg.setFrom(new InternetAddress(from)); 
        msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to)); 
        msg.setSubject(subject); 
        msg.setText(content); 
        Transport.send(msg); 
    } 
} 
 
class MyAuthenticator extends Authenticator { 
    private String user; 
    private String password; 
 
    MyAuthenticator(String user, String password) { 
        this.user = user; 
        this.password = password; 
    } 
 
    public PasswordAuthentication getPasswordAuthentication() { 
        String user = this.user; 
        String password = this.password; 
        return new PasswordAuthentication(user, password); 
    } 
}
Итак, сначала нам необходимо узнать параметры почтового сервера с которого мы будем отправлять письмо, а именно надо узнать хост SMTP протокола и его порт (обычно это 25 порт). Далее указываем свои существующие данные для авторизации на сервере, а также адрес получателя (в моем примере я для простоты отправлял письмо самому себе).  
Для отправки письма нам необходимо:
  • получить текущую сессию
  • создать новое сообщение
  • установить поля сообщения
  • отправить его
Для получения сессии используется метод Session.getDefaultInstance(Properties props, Authenticator authenticator) который возвращает объект сессии по умолчанию. Если по умолчанию он до сих пор не установлен, то новый объект сессии будет создан и установлен как объект по умолчанию. 
Параметр props – атрибуты новой сессии 
Параметр authenticator – объект Authenticator, который используется для того, чтобы проверить права доступа пользователя.
После получения сессии можно создать новое сообщение и задать его поля. Далее все просто – отправляем наше сообщение с помощью статического метода класса Transport.
Теперь попробуем отправить Multipart сообщение, а именно письмо с вложением. Вот вариант реализации:
package ru.quizful; 
 
import javax.activation.DataHandler; 
import javax.activation.DataSource; 
import javax.activation.FileDataSource; 
import javax.mail.*; 
import javax.mail.internet.*; 
import java.io.UnsupportedEncodingException; 
import java.util.ArrayList; 
import java.util.Properties; 
 
public class TestMail { 
    static final String ENCODING = "UTF-8"; 
 
    public static void main(String args[]) throws MessagingException, UnsupportedEncodingException { 
        String subject = "Subject"; 
        String content = "Test"; 
        String smtpHost="smtp.rambler.ru"; 
        String address="test@rambler.ru"; 
        String login="test"; 
        String password="test"; 
        String smtpPort="25"; 
 
        String attachment = "c:/attach.jpg"; 
        sendMultiMessage(login, password, address, address, content, subject, attachment, smtpPort, smtpHost); 
    } 
 
    public static void sendSimpleMessage(String login, String password, String from, String to, String content, String subject, String smtpPort, String smtpHost) throws MessagingException, UnsupportedEncodingException { 
        Properties props = System.getProperties(); 
        props.put("mail.smtp.port", smtpPort); 
        props.put("mail.smtp.host", smtpHost); 
        props.put("mail.smtp.auth""true"); 
        props.put("mail.mime.charset", ENCODING); 
 
        Authenticator auth = new MyAuthenticator(login, password); 
        Session session = Session.getDefaultInstance(props, auth); 
 
        Message msg = new MimeMessage(session); 
        msg.setFrom(new InternetAddress(from)); 
        msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to)); 
        msg.setSubject(subject); 
        msg.setText(content); 
        Transport.send(msg); 
    } 
 
    public static void sendMultiMessage(String login, String password, String from, String to, String content, String subject, String attachment, String smtpPort, String smtpHost) throws MessagingException, UnsupportedEncodingException { 
        Properties props = System.getProperties(); 
        props.put("mail.smtp.port", smtpPort); 
        props.put("mail.smtp.host", smtpHost); 
        props.put("mail.smtp.auth""true"); 
        props.put("mail.mime.charset", ENCODING); 
 
        Authenticator auth = new MyAuthenticator(login, password); 
        Session session = Session.getDefaultInstance(props, auth); 
 
        MimeMessage msg = new MimeMessage(session); 
 
        msg.setFrom(new InternetAddress(from)); 
        msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to)); 
        msg.setSubject(subject, ENCODING); 
 
        BodyPart messageBodyPart = new MimeBodyPart(); 
        messageBodyPart.setContent(content, "text/plain; charset=" + ENCODING + ""); 
        Multipart multipart = new MimeMultipart(); 
        multipart.addBodyPart(messageBodyPart); 
 
        MimeBodyPart attachmentBodyPart = new MimeBodyPart(); 
        DataSource source = new FileDataSource(attachment); 
        attachmentBodyPart.setDataHandler(new DataHandler(source)); 
        attachmentBodyPart.setFileName(MimeUtility.encodeText(source.getName())); 
        multipart.addBodyPart(attachmentBodyPart); 
 
        msg.setContent(multipart); 
 
        Transport.send(msg); 
    } 
} 
 
class MyAuthenticator extends Authenticator { 
    private String user; 
    private String password; 
 
    MyAuthenticator(String user, String password) { 
        this.user = user; 
        this.password = password; 
    } 
 
    public PasswordAuthentication getPasswordAuthentication() { 
        String user = this.user; 
        String password = this.password; 
        return new PasswordAuthentication(user, password); 
    } 
} 
Для отправки письма с вложением необходимо:
  • получить текущую сессию
  • создать новое сообщение
  • установить основные поля сообщения
  • добавить в сообщение часть с текстом письма
  • добавить в сообщение часть с вложением
  • отправить сообщение
Итак, ищем отличия. Во-первых, в методе main появился еще один параметр – attachment, содержащий путь к файлу который будет во вложении. Во-вторых, изменилось формирование письма, изучим его подробнее.
Также как и в предыдущем примере сначала мы получаем текущую сессию и создаем экземпляр MimeMessage, затем указываем основные параметры письма. Но теперь письмо состоит из двух частей: 
  • Первая часть содержит в себе контент – т.е содержимое письма (его текст). При этом для правильного отображения необходимо указать тип контента и его кодировку во избежание получения непонятных кракозябр в письме. Первая часть добавляется к сообщению.
  • Вторая часть должна содержать в себе вложение. Для этого мы получаем источник данных (DataSource) нужного файла и устанавливаем его в качестве DataHandler, также указываем имя файла. MimeUtility использована для ликвидации все тех же проблем с кодировкой. Добавляем вторую часть к сообщению.
Отправляем готовое сообщение все тем же незамысловатым методом.
Теперь давайте получим письма которые мы сами себе отправили!
Тут все немного сложнее…
package ru.quizful; 
import javax.activation.DataHandler; 
import javax.activation.DataSource; 
import javax.activation.FileDataSource; 
import javax.mail.*; 
import javax.mail.internet.*; 
import javax.mail.search.FlagTerm; 
import java.io.*; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.LinkedList; 
import java.util.Properties; 
 
public class TestMail { 
    static final String ENCODING = "UTF-8"; 
 
    public static void main(String args[]) throws MessagingException, IOException { 
        String subject = "Subject"; 
        String content = "Test"; 
        String smtpHost="smtp.rambler.ru"; 
        String address="test@rambler.ru"; 
        String login="test"; 
        String password="test"; 
        String smtpPort="25"; 
        String pop3Host="pop3.rambler.ru"; 
        receiveMessage(login, password, pop3Host); 
    } 
 
    public static void receiveMessage(String user, String password, String host) throws MessagingException, IOException { 
        Authenticator auth = new MyAuthenticator(user, password); 
 
        Properties props = System.getProperties(); 
        props.put("mail.user", user); 
        props.put("mail.host", host); 
        props.put("mail.debug""false"); 
        props.put("mail.store.protocol""pop3"); 
        props.put("mail.transport.protocol""smtp"); 
 
        Session session = Session.getDefaultInstance(props, auth); 
        Store store = session.getStore(); 
        store.connect(); 
        Folder inbox = store.getFolder("INBOX"); 
        inbox.open(Folder.READ_WRITE); 
 
        Message[] messages = inbox.search(new FlagTerm(new Flags(Flags.Flag.SEEN), false)); 
        ArrayList<String> attachments = new ArrayList<String>(); 
 
        LinkedList<MessageBean> listMessages = getPart(messages, attachments); 
 
        inbox.setFlags(messages, new Flags(Flags.Flag.SEEN), true); 
        inbox.close(false); 
        store.close(); 
    } 
 
    private static LinkedList<MessageBean> getPart(Message[] messages, ArrayList<string> attachments) throws MessagingException, IOException { 
        LinkedList<MessageBean> listMessages = new LinkedList<MessageBean>(); 
        SimpleDateFormat f = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); 
        for (Message inMessage : messages) { 
            attachments.clear(); 
            if (inMessage.isMimeType("text/plain")) { 
                MessageBean message = new MessageBean(inMessage.getMessageNumber(), MimeUtility.decodeText(inMessage.getSubject()), inMessage.getFrom()[0].toString(), null, f.format(inMessage.getSentDate()), (String) inMessage.getContent(), falsenull); 
                listMessages.add(message); 
            } else if (inMessage.isMimeType("multipart/*")) { 
                Multipart mp = (Multipart) inMessage.getContent(); 
                MessageBean message = null; 
                for (int i = 0; i < mp.getCount(); i++) { 
                    Part part = mp.getBodyPart(i); 
                    if ((part.getFileName() == null || part.getFileName() == "") && part.isMimeType("text/plain")) { 
                        message = new MessageBean(inMessage.getMessageNumber(), inMessage.getSubject(), inMessage.getFrom()[0].toString(), null, f.format(inMessage.getSentDate()), (String) part.getContent(), falsenull); 
                    } else if (part.getFileName() != null || part.getFileName() != ""){ 
                        if ((part.getDisposition() != null) && (part.getDisposition().equals(Part.ATTACHMENT))) { 
                            attachments.add(saveFile(MimeUtility.decodeText(part.getFileName()), part.getInputStream())); 
                            if (message != null) message.setAttachments(attachments); 
                        } 
                    } 
                } 
                listMessages.add(message); 
            } 
        } 
        return listMessages; 
    } 
 
    private static String saveFile(String filename, InputStream input) { 
        String path = "attachments\\"+filename; 
        try { 
            byte[] attachment = new byte[input.available()]; 
            input.read(attachment); 
            File file = new File(path); 
            FileOutputStream out = new FileOutputStream(file); 
            out.write(attachment); 
            input.close(); 
            out.close(); 
            return path; 
        } catch (IOException e) { 
            e.printStackTrace(); 
        } 
        return path; 
    } 
} 
 
class MyAuthenticator extends Authenticator { 
    private String user; 
    private String password; 
 
    MyAuthenticator(String user, String password) { 
        this.user = user; 
        this.password = password; 
    } 
 
    public PasswordAuthentication getPasswordAuthentication() { 
        String user = this.user; 
        String password = this.password; 
        return new PasswordAuthentication(user, password); 
    } 
} 
 
И еще один класс: 
package ru.quizful; 
 
import java.io.Serializable; 
import java.util.ArrayList; 
 
public class MessageBean implements Serializable { 
    private String subject; 
    private String from; 
    private String to; 
    private String dateSent; 
    private String content; 
    private boolean isNew; 
    private int msgId; 
    private ArrayList<String> attachments; 
 
    public MessageBean(int msgId, String subject, String from, String to, String dateSent, String content, boolean isNew, ArrayList<String> attachments) { 
        this.subject = subject; 
        this.from = from; 
        this.to = to; 
        this.dateSent = dateSent; 
        this.content = content; 
        this.isNew = isNew; 
        this.msgId = msgId; 
        this.attachments = attachments; 
    } 
 
    public String getSubject() { 
        return subject; 
    } 
 
    public void setSubject(String subject) { 
        this.subject = subject; 
    } 
 
    public String getFrom() { 
        return from; 
    } 
 
    public void setFrom(String from) { 
        this.from = from; 
    } 
 
    public String getDateSent() { 
        return dateSent; 
    } 
 
    public void setDateSent(String dateSent) { 
        this.dateSent = dateSent; 
    } 
 
    public String getContent() { 
        return content; 
    } 
 
    public void setContent(String content) { 
        this.content = content; 
    } 
 
    public String getTo() { 
        return to; 
    } 
 
    public void setTo(String to) { 
        this.to = to; 
    } 
 
    public boolean isNew() { 
        return isNew; 
    } 
 
    public void setNew(boolean aNew) { 
        isNew = aNew; 
    } 
 
    public int getMsgId() { 
        return msgId; 
    } 
 
    public void setMsgId(int msgId) { 
        this.msgId = msgId; 
    } 
 
    public ArrayList<String> getAttachments() { 
        return attachments; 
    } 
 
    public void setAttachments(ArrayList<String> attachments) { 
        this.attachments = new ArrayList<String>(attachments); 
    } 
}
Итак, о том, что тут делается. Для начала определим общую идею как все должно работать в теории и что для этого необходимо:
  • получаем текущую сессию
  • получаем доступ к хранилищу сообщений
  • получаем доступ к папке входящих сообщений в этом хранилище
  • извлекаем из папки все сообщения и начинаем их обработку, т.е извлечение полей сообщений
  • закрываем за собой папку и хранилище
Что нового в коде:
  1. Появился класс MessageBean – это бин в который мы будем сохранять данные из сообщения. Это сделано для удобства ибо в результате выполнения данного метода вы получите аккуратную коллекцию входящих сообщений с которыми можете потом делать что хотите.
  2. Появился метод getPart, в котором собственно выполняется обработка полученных сообщений, а именно: проверка типа сообщения, в соответствии с которым потом извлекается его содержимое, также данный метод формирует список экземпляров бина сообщения, который собственно и возвращается главному методу.
  3. Появился метод saveFile который сохраняет вложения из писем в каталог attachments. Тут все просто, так что описывать в подробностях не буду.
  4. Появился новый параметр pop3Host который содержит хост POP3 протокола, для входящей почты.
Приступим к более детальному осмотру кода.
Сначала как всегда мы получаем текущую сессию (обратите внимание что свойства, которые мы передаем внутрь метода getDefaultInstance, изменились). После этого из сессии мы получаем хранилище и подключаемся к нему используя метод connect класса Service. Далее мы можем получить из хранилища папку с входящими сообщениями используя метод getFolder, в данном случае мы получаем папку по ее имени. Этот метод по умолчанию возвращает нам закрытую папку, поэтому мы открываем ее на чтение и запись.
Теперь у нас есть доступ к папке. В данном примере, для того чтобы получить письма из папки я использовал поиск внутри каталога, критерием поиска был флаг письма, показывающий, что оно новое и еще не было прочитано, но на серверах POP3 эта функция не поддерживается (возвращаются вообще все письма), так что для получения писем можно использовать простой метод inbox.getMessages(); Оба этих метода возвращают массив сообщений, который передается внутрь метода getPart(), в котором, как уже было сказано выше выполняется проверка типа сообщения:
- Если это простое сообщение, то создается экземпляр бина, поля которого инициализируется содержимым сообщения
- Если это Multipart сообщение, то мы получаем содержимое письма как Multipart и начинаем просматривать части сообщений:
  • Если часть содержит простой контент, то он сохраняется в полях бина
  • Если часть содержит вложение, то выполняется метод saveFile(), который сохраняет вложение, а путь к нему сохраняет в бине.
Ну что ж, осталось только удалить за собой письма с сервера…
public class TestMail { 
    static final String ENCODING = "UTF-8"; 
    public static void main(String args[]) throws MessagingException, IOException { 
        String subject = "Subject"; 
        String content = "Test"; 
        String smtpHost="smtp.rambler.ru"; 
        String address="test@rambler.ru"; 
        String login="test"; 
        String password="test"; 
        String smtpPort="25"; 
        String pop3Host="pop3.rambler.ru"; 
 
        deleteMessage(login, password, pop3Host, 1); 
    } 
 
    public static void deleteMessage(String user, String password, String host, int n) throws MessagingException, IOException { 
        Authenticator auth = new MyAuthenticator(user, password); 
 
        Properties props = System.getProperties(); 
        props.put("mail.user", user); 
        props.put("mail.host", host); 
        props.put("mail.debug""false"); 
        props.put("mail.store.protocol""pop3"); 
        props.put("mail.transport.protocol""smtp"); 
 
        Session session = Session.getDefaultInstance(props, auth); 
        Store store = session.getStore(); 
        store.connect(); 
        Folder inbox = store.getFolder("INBOX"); 
        inbox.open(Folder.READ_WRITE); 
 
        inbox.setFlags(n, n, new Flags(Flags.Flag.DELETED), true); 
        inbox.close(true); 
        store.close(); 
    } 
} 
Что надо сделать для удаления письма:
  • получаем текущую сессию
  • получаем доступ к хранилищу сообщений
  • получаем доступ к папке входящих сообщений в этом хранилище
  • устанавливаем флаг сообщения DELETED = true
  • обязательно закрываем за собой папку и хранилище
В общем, то расписывать тут нечего, единственное могу поругаться на неудобную установку флага. Потому что он устанавливается, в данном случае по номеру сообщения, а чтобы его узнать надо снова получить все письма с сервера и посмотреть текущий номер нужного нам сообщения. Эту часть я опустил, так как она вся была описана выше. Номер сообщения можно получить с помощью метода getMessageNumber(). Итак зная номер сообщения мы устанавливаем у него флаг и все…теперь главное не забыть закрыть папку и хранилище, ибо именно в этот момент происходит удаление.
На этом я заканчиваю. Поэкспериментировать с протоколом IMAP увы не получилось, так как негде было тестировать код. Да и подустал я что-то, так что оставляю это вам.
Пользуясь всем этим великолепием мне удалось смастерить некое подобие почтового клиента, изготовленного во славу этого замечательного сайта...И клиент этот даже работает!...по крайней мере у меня. Вот как он выглядит:
 image
Исходники вы можете скачать его по адресу: http://rghost.ru/2460228
Информация по использованию в хелпе.
Исходники всех примеров приведенных выше можно скачать здесь: http://rghost.ru/2461932