Перенос письма outlook vba в другую папку
Как переместить электронные письма в указанную папку после назначения определенной категории в Outlook?
Предположим, вы назначили категорию полученному электронному письму в Outlook, после назначения категории вы хотите, чтобы это электронное письмо автоматически перемещалось в определенную папку электронной почты с именем категории. Например, электронное письмо с категорией «Личное» будет перемещено в папку с именем «Личный» в Outlook. Как этого добиться? Метод, описанный в этой статье, может помочь вам с легкостью решить проблему.
Переместите электронные письма в указанную папку после назначения определенной категории с помощью VBA
Приведенный ниже код VBA может помочь автоматически перемещать электронные письма в указанную папку после назначения определенной категории в Outlook. Пожалуйста, сделайте следующее.
1. нажмите другой + F11 , чтобы открыть Microsoft Visual Basic для приложений окно.
2. в Microsoft Visual Basic для приложений окно, дважды щелкните, чтобы открыть ThisOutlookSession (Код) окно. Затем скопируйте ниже код VBA в окно. Смотрите скриншот:
Код VBA: переместить электронные письма в указанную папку после назначения определенной категории
3. Save the code and restart the Outlook.
4. From now on, when assigning category to a receiving email, a folder with the category name will be created automatically under the Inbox folder with the email moved in. See screenshot:
Note: All emails assigned with the same category will be moved to the same folder automatically. But if a new category is assigned to an email, a new folder will be created automatically.
Пытаюсь написать макрос, который поможет сортировать входящие письма в Outlook 2010.
Задача:
Когда выделяешь письмо нужно по теме письма определять папку, где есть последнее письмо всей цепочки писем (цепочка - тема).
На панели должна быть кнопка, которая меняет свое название на "Переместить в ПАПКА". На кнопке должна подставляться определившаяся папка для выделенного письма.
По кнопке при нажатии переместить письмо в определившуюся папку.
Если выделено несколько писем: выдавать ошибку.
Если цепочки не найдено, то при нажатии на кнопку просить определить папку.
Я вывел кнопку со ссылкой на макрос через Настройку панели.
Начал писать и столкнулся, с нехваткой знания VBA и объектной модели Outlook.
Буду очень благодарен за любую помощь, даже маленькую, даже частичную: просто обращение к объектам или проверки тоже будут помогать.
Сделал скелет программы и ищу по крупицам информацию в нете.
Все недостающие части выделены в виде комментариев с логикой.
Outlook 2007 начал сам отправлять письма
Всем доброго времени суток! Outlook 2007 настроен через IMAP gmail. Зашел сегодня в Outlook, и.
Найти файл, и в папку где лежит этот файл скопировать другой файл)
Задача описана в названии, но повторюсь. Надо найти папку с известным названием файла (123.txt).
Outlook: как корректно внедрить file.msg в папку в Outlook
собственно вопрос. делаю так: Dim OL As Outlook.Application Dim newMail As Object Set OL =.
Начал писать игру
Всем привет! Начал писать игру. Это будет симулятор настольного хокея (стол, две ракетки, ворота и.
Друзья, помогите, пожалуйста,кто чем может.
Может циклы перебора, может способы выбрать самое последнее письмо с темой.
Начал писать статьи для начинающих
Ребята начинающие и тёртые радиолюбители, я начал на своём сайте цикл статей в помощь начинающим.
DVD-привод начал писать диски медленнее.
Добрый день. Подскажите, пожалуйста. С моим DVD приводом стало происходить что-то непонятное.
Начал писать бота для онлайн игры. Не понимаю содержимое пакетов и их построение
Хочу написать бота под онлайн рпг игру. Было несколько вариантов того, как будет работать бот.
Outlook не отправляет письма
Здравствуйте, работаю в организации, есть локальная сеть и несколько компьютеров с установленным MS.
Вкладка Office - включите редактирование и просмотр с вкладками в Office и сделайте работу намного проще .
3. Затем дважды щелкните, чтобы развернуть Project1 > Объекты Microsoft Outlook > ThisOutlookSession для открытия ВбаПроект.ОТМ редактор.
4. Затем скопируйте и вставьте приведенный ниже код VBA в редактор VbaProject.OTM, как показано на скриншоте выше.
5. Затем нажмите Сохраните кнопку, чтобы сохранить код VBA, а затем закройте Microsoft Visual Basic для приложений окно.
6. Щелкните правой кнопкой мыши Панель быстрого доступаИ выберите Настройка панели быстрого доступа из контекстного меню. Смотрите скриншот:
7. в Параметры Outlook диалоговое окно, вам необходимо:
1). Выбрать Макрос в Выберите команды из раскрывающийся список;
2). Выбрать Проект1. ThisOutlookSession в коробке под Выберите команды из раскрывающийся список;
3). Щелкните значок Добавить кнопка;
4). Щелкните значок OK кнопку.
Заметки:
1. Этот код VBA можно применять в Outlook 2007, 2010 и 2013; Но в Outlook 2007 вы можете напрямую щелкнуть Run кнопку для запуска кода.
2. Если в Outlook существует несколько учетных записей электронной почты, код VBA можно применить только к учетной записи, файл данных которой установлен по умолчанию. Вы можете проверить файл данных по умолчанию, нажав Файл > Инфо > Настройки учетной записи > Настройки учетной записи для открытия Настройки учетной записи диалоговое окно. Затем перейдите в Файл данных вкладка, вы увидите, что файл данных по умолчанию отмечен раньше.
3. Если вы хотите изменить файл данных по умолчанию на другую учетную запись электронной почты, выберите и выделите учетную запись, которую вы хотите установить по умолчанию, затем нажмите кнопку Установить по умолчанию в Настройки учетной записи диалоговое окно.
* Два способа переместить почтовый элемент в пользовательскую папку после отправки.
* Решение на клиентской стороне, не зависящее от поставщика почтового сервера.
* Лучшие способы распространения кода VBA среди пользователей.
Ограничения подхода на основе правил
Экран 1. Использование мастера Rules Wizard для применения правила к отправленным элементам |
Экран 2. Диалоговое окно выбора папки для мастера правил |
Экран 3. Диалоговое окно «Параметры ?почты» |
Решение VBA: используем события Send почтового элемента
Разочаровавшись в правилах и параметрах, я засучил рукава, приготовил кофе и взялся за работу.
Куда поместить код?
Один из основных вопросов, которые приходится решать при проектировании управляемых событиями программ, заключается в поиске места для размещения кода обработки событий. В случае неправильного выбора программа может оказаться неустойчивой. Подходящих вариантов может быть несколько, но в большинстве случаев одно из мест лучше остальных.
Я вспомнил о событии ItemAdd() папки назначения. Оно возникает всегда, когда в коллекцию Items добавляется один или несколько элементов. Но по зрелом размышлении я понял, что этому событию свойственны те же проблемы временного согласования, что и событию MailItem_Send(). Кроме того, необходимо дублировать программный код для всех папок назначения. Дублировать исходный текст не годится, забудьте об этой идее.
Экран 4. Папки Outlook |
Можно добраться до нужной папки с помощью кода:
BUSINESS_FOLDER — константа для имени папки. oBusinessFolder можно напрямую передать в подпрограмму MailItem.Move(), как требуется для объекта MAPIFolder. Аналогичным образом можно получить вложенную папку с помощью свойства коллекции Folders:
Set ObjFolder = Application.Session.GetDefaultFolder(olFolderInbox).Folders(" »)
Visual Basic Editor
Все приложения Microsoft Office поставляются с полнофункциональной средой разработки, именуемой Visual Basic Editor. Она обеспечивает интерфейс для доступа к объектным моделям приложения через программный код. В результате пользователь может вызывать методы объектов, задавать методы объектов и отвечать на события объектов. Для этих целей используется код VBA, особое подмножество языка Visual Basic.
Для доступа к Visual Basic Editor и другим инструментам разработки на ленте Office имеется вкладка Developer («Разработчик»). Но по умолчанию эта вкладка отключена, чтобы уменьшить уязвимость для вирусов и других вредоносных программ. Прежде чем воспользоваться этой вкладкой, необходимо выполнить следующие шаги.
1. В Outlook выберите Outlook Options («Параметры Outlook») на вкладке File («Файл»), чтобы открыть диалоговое окно Outlook Options.
2. В диалоговом окне Outlook Options нажмите кнопку Trust Center («Центр управления безопасностью»).
3. Щелкните Trust Center Settings («Параметры центра управления безопасностью»), а затем выберите параметр Macro Settings («Параметры макросов») слева.
4. Выберите удобный уровень безопасности Macro, с учетом того, что этот параметр влияет как на ваши, так и чужие макрокоманды. Если разрешить все макрокоманды, то Outlook будет отображать приглашение каждый раз при запуске макрокоманды. Таким образом, пользователь может решить, нужно ли запускать макрокоманду. Этот режим называется Notifications for all macros («Уведомления для всех макросов»).
5. Перезапустите Outlook, чтобы изменения вступили в силу.
Кнопка Visual Basic, которую мы видим на экране 5, находится на дальнем левом краю вкладки Developer. На экране 6 показан Visual Basic Editor.
Экран 5. Вкладка «Разработчик» с кнопкой Visual Basic |
Экран 6. Visual Basic Editor с видимой областью проверки |
Событие MailItem Send()
Чтобы события объекта были доступны в раскрывающемся списке Declarations («Объявления») в Visual Basic Editor (экран 7), нужно воспользоваться ключевым словом WithEvents для объявления объекта.
Экран 7. Раскрывающийся список «Объявления» в?Visual?Basic Editor |
Следующие объявления объектов позволяют обратиться к событию MailItem Send():
Коллекция Inspectors содержит объекты Inspector для всех открытых инспекторов (то есть окно, в котором отображается информация об элементе Outlook). Ссылка на коллекцию Inspectors задается в событии Application_StartUp():
End Sub
Привязка oMsg к текущему инспектору
Inspector, переданный подпрограмме, имеет свойство CurrentItem, которое относится к элементу, просматриваемому пользователем. Проверив свойство Class этого элемента, можно определить, действительно ли это почтовый элемент. Для такой цели можно воспользоваться константой с именем olMail. Также необходимо проверить уникальную строку идентификатора, которую поставщик хранилища Messaging API (MAPI) назначает при создании элемента в хранилище. Поэтому свойство EntryID назначается элементу Outlook только после того, как элемент сохранен или отправлен. Эта проверка, выполняемая фрагментом кода с меткой A в листинге 1, отличает новые элементы электронной почты от существующих. Назначение почтового элемента таким способом приводит к возникновению его событий, в том числе события Send.
Событие oMsg_Send в действии
Экран 8. Пример вывода события oMsg_Send Event |
Экран 9. Коллекция получателей MailItem |
Экран 10. Проверка правила отправки |
Альтернативное решение: использование события Items_ItemAdd папки Sent Items
Получение доступа к событию Items_ItemAdd() папки Sent Items
Событие ItemAdd() является членом объекта коллекции Items, поэтому необходимо использовать ключевое слово WithEvents в верхней части модуля ThisOutlookSession для объявления объекта типа Items:
Измененный код правила
Событие oSentItems_ItemAdd в действии
Экран 11. Пример события SentItems_ItemAdd |
Экран 12. Проверка правила отправки для MailItems |
Добавление других типов элементов не составляет труда; просто измените инструкцию If в Select Case и укажите целевые типы в списке с разделителями запятыми, как показано в листинге 4.
Запуск макрокоманды Move Sent MailItems по требованию
Простота и безопасность
Итак, в этой статье я рассказал о том, как использовать программный код VBA для расширения возможностей встроенных правил и параметров Outlook 2010. В частности, здесь показано два способа перемещения почтовых элементов в папку пользователя после отправки. Описанный метод гораздо безопаснее и проще многих решений, в которых применяются сложные процессы с временной синхронизацией, подверженные ошибкам вызовы Windows API или сторонние DLL-библиотеки. На клиентской стороне решение не зависит от поставщика почтового сервера и не привязано к Exchange Server. Более того, оно применимо для компании с любым количеством пользователей — от 50 до 5000.
Остается лишь найти оптимальный способ распространения кода VBA. Сделать это можно по-разному, причем в одних случаях требуется содействие пользователей, а в других можно действовать дистанционно:
* использовать команду File | Export (Файл | Экспорт) в VBA-среде Outlook для экспорта модулей как файлов. bas,. cls или. frm;
* копировать файл VbaProject.otm с компьютера, на котором были подготовлены макрокоманды, на компьютеры других пользователей, заменив существующий файл VbaProject.otm;
* использовать мастер Office Profile Wizard (Proflwiz.exe) для распространения проекта VBA.
Дополнительные материалы
«Microsoft Outlook Programming: Jumpstart for Administrators, Developers, and Power Users» Сью Мошер
Листинг 1. Код ThisOutlookSession для решения oMsg_Send
Листинг 2. Код ThisOutlookSession для решения Items_AddItem
Листинг 3. Программный код для обработки нескольких почтовых ящиков
Листинг 4: Программный код для добавления типов элементов
Автоматическое копирование вложений из писем в папку
Для автоматического копирования вложений из приходящих в Outlook писем в указанную папку можно воспользоваться правилом, исполняющим ниже прописанный скрипт VBA. Скрипт также модифицирует имя файла в соответствии с датой создания письма. Вариант из примера работает корректно для писем с одним вложением. Для писем с несколькими вложениями нужно изменить код в месте формирования имени файла.
- В Outlook откройте окно VBA. Можно воспользоваться сочетанием Alt + F11.
- Вставьте код, прописанный ниже, в раздел Modules. Слева найдите Modules. Если там нет раздела нет пункта Module, то создайте такой правым щелчком мыши по Modules. Или нажмите правой кнопкой по Modules, Insert -> Module.
- Скопируйте код в главное окно.
- Закройте VBA IDE.
- Создайте правило, вызывающее скрипт.
- В первом окне мастера создания нового правила выберите проверку входящих писем.
- В следующем окне выберите правила отбора писем.
- В третьем окне выберите «выполнить скрипт» (или «запустить скрипт»). Когда нажмете на подчеркнутое слов «скрипт», должен быть виден код, который был вставлен в консоль VBA.
- Нажмите «Завершить» и проверьте работу правила.
Public Sub saveAttachtoDisk(itm As Outlook.MailItem) Dim objAtt As Outlook.Attachment Dim saveFolder As String dateOfMailItem = Format(itm.ReceivedTime, "yyyy.mm.dd") saveFolder = "C:\\Test" If Dir(saveFolder, vbDirectory) = "" Then MkDir saveFolder End If For Each objAtt In itm.Attachments 'Проверяем наличие файла с таким же именем j = " " For i = 1 To 1000 If Not Dir(saveFolder & "\" & dateOfMailItem & j & objAtt.FileName) = "" Then j = "_" & i & "_" Else Exit For End If Next i 'Конец проверки objAtt.SaveAsFile saveFolder & "\" & dateOfMailItem & j & objAtt.FileName Set objAtt = Nothing Next End Sub
Решение проблем
Если часть созданного правила выполняется, но сам скрипт не срабатывает, то, возможно, дело в настройках безопасности Outlook 2010/2013/2016 (в Outlook 2007 и старше эта опция находится в Tools -> Macro Security). Чтобы макрос сработал:
Обработка msg-вложений
Ниже пример кода, который сохраняет каждое вложение из письма в папку с названием, совпадающим с темой письма. Если вложенные файлы сами являются письмами (т.е. имеют расширение *.msg), то сохраняются только вложения из них в подпапку с названием таким же, как тема вложенного *.msg файла.
Чтобы код работал нужно включить Microsoft Scripting Runtime как описано в другой статье.
Sub saveAttachtoDisk(itm As Outlook.MailItem) Dim objAtt As Outlook.Attachment Dim objAttachments As Outlook.Attachment Dim saveFolder As String Dim openMsg As MailItem dateOfMailItem = Format(itm.ReceivedTime, "yyyy.mm.dd") saveFolder = "C:\Test\" If Dir(saveFolder, vbDirectory) = "" Then MkDir saveFolder End If For t = 1 To Len(itm.Subject) s = Mid(itm.Subject, t, 1) If Not LCase(s) Like "[?/\|*<>:]" Then sSubject = sSubject & s End If Next t For Each objAtt In itm.Attachments saveFolderFull = saveFolder & sSubject If Dir(saveFolderFull, vbDirectory) = "" Then MkDir saveFolderFull End If 'Проверяем наличие файла с таким же именем j = " " For i = 1 To 1000 If Not Dir(saveFolderFull & "\" & dateOfMailItem & j & objAtt.FileName) = "" Then j = "_" & i & "_" Else Exit For End If Next i 'Конец проверки objAtt.SaveAsFile saveFolderFull & "\" & dateOfMailItem & j & objAtt.FileName 'Из msg файлов достаём вложения и удаляем If LCase(Right(objAtt.FileName, 4)) = ".msg" Then Set openMsg = Application.CreateItemFromTemplate(saveFolderFull & "\" & dateOfMailItem & j & objAtt.FileName) sSubject2 = "" For t = 1 To Len(openMsg.Subject) s = Mid(openMsg.Subject, t, 1) If Not LCase(s) Like "[?/\|*<>:]" Then sSubject2 = sSubject2 & s End If Next t If Dir(saveFolderFull & "\" & sSubject2, vbDirectory) = "" Then MkDir saveFolderFull & "\" & sSubject2 End If 'Сохраняем вложения из msg-файла For Each objAttachments In openMsg.Attachments objAttachments.SaveAsFile saveFolderFull & "\" & sSubject2 & "\" & dateOfMailItem & objAttachments.FileName Next openMsg.Close olDiscard Kill saveFolderFull & "\" & dateOfMailItem & j & objAtt.FileName 'Удаляем файл msg-файла End If Set objAtt = Nothing Next End Sub
Сохранение письма с вложениями на диск
Если нужно сохранить само письмо, а не только вложения, то код упрощается:
Public Sub saveAttachtoDisk(itm As Outlook.MailItem) 'Public Sub saveAttachtoDisk() Dim objAtt As Outlook.Attachment Dim saveFolder As String Dim t As Integer Dim s As String Dim sSubject As String 'Dim itm As Outlook.MailItem 'Set itm = Application.ActiveExplorer().Selection(1) saveFolder = "C:\Test" If Dir(saveFolder, vbDirectory) = "" Then MkDir saveFolder End If 'Удаление недопустимых символов из темы For t = 1 To Len(itm.Subject) s = Mid(itm.Subject, t, 1) If Not LCase(s) Like "[?/\|*<>:]" Then sSubject = sSubject & s End If Next t 'Проверяем наличие файла с таким же именем j = "" For i = 1 To 1000 If Not Dir(saveFolder & "\" & j & sSubject & ".msg") = "" Then j = "(" & i & ")_" Else Exit For End If Next i 'Конец проверки 'Сохранение вложения itm.SaveAs (saveFolder & "\" & j & sSubject & ".msg") End Sub
Читайте также: