Пересылка почты автоматически - PullRequest
0 голосов
/ 30 декабря 2018

Я получаю электронные письма с темами вида «### auto fax», где «###» - это переменное количество цифр.Каждое из этих сообщений должно быть отправлено на «###@mail2fax.com».Я ищу идеи о том, как автоматизировать это.

1 Ответ

0 голосов
/ 01 января 2019

Ваше добавление «и мне нужно быть в офисе» может быть проблемой.Я домашний пользователь Outlook.Если я хочу, чтобы Outlook выполнял какие-либо действия, пока меня нет, я должен оставить свой компьютер включенным.Я предполагаю, что вы являетесь пользователем Outlook Exchange.Вы можете оставить инструкции, которые будут выполняться, пока вас нет, даже если ваш компьютер включен.Однако по соображениям безопасности по умолчанию вы не можете оставлять инструкции для пересылки электронной почты за пределы вашей компании.Насколько я понимаю, вам нужно будет переслать письма «Авто факс» коллеге.Поскольку мы надеемся автоматизировать этот процесс, это не должно быть навязыванием вашему коллеге.Вам нужно будет создать версию своего правила и макроса и установить ее на компьютер вашего коллеги, но это не должно быть слишком сложно, если я правильно прочитал эту функцию.Дело в том, что это не будет частью этого ответа.

Трудность с VBA состоит в том, что обычно есть несколько способов достижения того же эффекта.Это не имеет значения, если вы разрабатываете свой собственный VBA;выберите свой любимый способ достижения эффекта и экспериментируйте, пока не получите полное понимание этого фаворита.Однако, если вы просите о помощи или ищете полезные фрагменты кода, вы должны иметь базовые знания обо всех способах достижения эффектов, потому что другие не будут делиться вашим любимым.Возможно, вам придется понять, что делает фрагмент, а затем переписать его по-своему.Этот код написан с использованием моих любимых приемов.

Когда вы пишете макрос для обработки писем, у вас возникают две проблемы:

  • Как вы выбираете письма, которые хотите обработать?
  • Как вы обрабатываете выбранные письма?

Существует четыре метода выбора электронных писем:

  1. Пользователь выбирает одно или несколько электронных писем и затем запускает макрос обработки.
  2. Макрос сканирует одинили более папок, которые ищут сообщения с определенными характеристиками и затем обрабатывают их.
  3. Вы указываете Outlook отслеживать конкретную папку и запускать макрос каждый раз, когда в эту папку приходит новое письмо.
  4. Youустановите правило, чтобы выбрать электронные письма как прибывающие и связать макрос с этим правилом для их обработки.

Я полагаю, что метод 4 будет самым простым методом для реализации ваших требований.Тем не менее, он может быть недоступен.Он отлично работает в моей системе, но, очевидно, те, кто отвечает за установку Outlook Exchange, могут запретить это.Если метод 4 не работает для вас, я считаю, что метод 3 будет следующим лучшим методом.Однако в этом ответе будет использоваться метод 1.

Я использую метод 1 всякий раз, когда разрабатываю новый макрос обработки электронной почты.If дает мне полный контроль над тем, какие электронные письма обрабатываются в каком порядке.Я могу начать с простых писем и запускать макрос для одного и того же письма снова и снова, пока макрос не заработает так, как я хочу.После того, как я удовлетворюсь макросом, я могу переключиться на любой другой метод, наиболее подходящий.

Это первая версия моего макроса обработки:

Public Sub ForwardAndMoveEmail(ByRef ItemCrnt As Object)

  Dim FaxNum As String
  Dim ItemNew As MailItem
  Dim Subject As String

  If ItemCrnt.Class <> olMail Then
    ' Ignore item if it is not an email
    Exit Sub
  End If

  Subject = ItemCrnt.Subject
  If LCase(Right$(Subject, 9)) = " auto fax" Then
    ‘ Only process email if the subject ends with case-insensitive " auto fax"
    FaxNum = Mid$(Subject, 1, Len(Subject) - 9)
    With ItemCrnt
      Subject = "Fax from " & .Sender & " (" & .SenderEmailAddress & ")"
      Set ItemNew = .Forward
    End With
    With ItemNew
      .Subject = Subject
      ' Clear existing recipient(s)
      Do While .Recipients.Count > 0
        .Recipients.Remove (1)
      Loop
      .Recipients.Add FaxNum & "@mail2fax.com"
      .Save
    End With
  End If

  ItemCrnt.Move ItemCrnt.Parent.Parent.Folders("Faxed")

End Sub

Элемент, который будетОбработанный является параметром для этого макроса.Обратите внимание, что я напечатал его как объект, а не как элемент MailItem.Затем обратите внимание, что первые операторы макроса проверяют, что элемент является MailItem (Class = olMail).С помощью метода 1 пользователь может выбрать что-то отличное от MailItem.Эта проверка гарантирует, что эта пользовательская ошибка не вызовет проблем для макроса.

Затем макрос проверяет, что субъект завершается в «авто факс», «авто факс», «авто факс» или любом другом варианте.С помощью метода 1 пользователь может выбрать неправильный MailItem.При использовании метода 3 каждое электронное письмо передается в макрос.Следовательно, проверка того, что это макрос для пересылки в службу факсов.

Если бы я заранее решил, какой метод выбора я собирался использовать, мне не нужно было бы выполнять все эти проверки.Я думаю, что возможность изменить метод выбора стоит дополнительных проверок.

Извлечение макросаглавные герои Субъекта.Я не проверяю, чтобы они были числовыми, хотя такую ​​проверку можно было бы добавить, если бы это было важно.

Макрос создает новую тему для переадресованной электронной почты.Я не знаю, хотите ли вы нового субъекта, но это демонстрирует, что вы можете сделать, если бы это было полезно.

Set ItemNew = .Forward создает элемент для пересылки.Обратите внимание, что этот оператор находится внутри блока With.Это то же самое, что и Set ItemNew = ItemCrnt.Forward.

. Затем макрос работает на ItemNew.Он изменяет тему, очищает существующих получателей и добавляет нового, а затем сохраняет новое письмо как черновик.

Последнее утверждение макроса - это то, что вы не просили, но может быть полезно,Я создал папку с именем «Отправлено по факсу» и перенес в нее исходное письмо.Это сохраняет исходное письмо без беспорядка в папке «Входящие».

Рассмотрим ItemCrnt.Parent.Parent.Folders("Faxed").Это папка, в которую необходимо переместить элемент.Я связал вместе свойства вместе, что, вероятно, выглядит странно, но сразу же, как только вы их поймете.

  • ItemCrnt - исходный элемент почты.
  • ItemCrnt.Parent - это свойствоItemCrnt.У многих объектов есть родители.Для MailItem это папка, содержащая MailItem;то есть папка «Входящие».
  • `ItemCrnt.Parent.Parent является свойством папки« Входящие ».Для папки ее родителем является папка, в которой она находится.Поскольку папка «Входящие» является папкой верхнего уровня, ее родителем является хранилище, в котором она хранится.«Хранилище» - это файл, в котором Outlook хранит папки, элементы почты, элементы календаря, задачи и многое другое.
  • Пройдя весь путь до магазина, ItemCrnt.Parent.Parent.Folders("Faxed") переходит в папку внутримагазин.

Макрос, который вызывает ForwardAndMoveEmail:

Option Explicit
Sub SelectEmailsUser()

  Dim Exp As Explorer
  Dim ItemCrnt As Object
  Dim MailItemCrnt As Object

  Set Exp = Outlook.Application.ActiveExplorer

  If Exp.Selection.Count = 0 Then
    Call MsgBox("Please select one or more emails then try again", vbOKOnly)
    Exit Sub
  End If
  For Each ItemCrnt In Exp.Selection
    If ItemCrnt.Class = olMail Then
      Call ForwardAndMoveEmail(ItemCrnt)
    End If
  Next

End Sub

Не беспокойтесь об этом макросе на данном этапе.Изучите это позже, когда вы будете готовы разработать следующую обработку электронной почты.Это макрос, который я написал давным-давно.Каждый раз, когда я хочу протестировать новый макрос обработки электронной почты, я просто изменяю оператор Call ForwardAndMoveEmail(ItemCrnt) для вызова нового макроса.

Это не окончательная версия макроса обработки, хотя, вероятно, это финальная версия этого вечера,Пожалуйста:

  • Скопируйте два макроса в модуль Outlook.Два макроса могут быть в любом порядке, но Option Explicit должно быть в верхней части модуля.
  • Создать папку «По факсу».На том же уровне, что и папка «Входящие».
  • Выберите одно или несколько писем «Авто факс» и запустите макрос SelectEmailsUser.
  • Проверьте, что обработанные письма «Авто факс» теперь находятся в папке«Отправлено по факсу».
  • Просмотрите электронные письма в папке «Черновики».Я думаю, что эти письма неудовлетворительны.Позже я расскажу, почему и что, по моему мнению, вам следует сделать, чтобы они были удовлетворительными.

Часть 2

Я закончил первую часть этого ответа, сказавЯ не думал, что черновик электронного письма, созданного моим макросом, был удовлетворительным.

Проблема для меня заключается в том, что исходное электронное письмо возглавляется типичным «перенаправленным» заголовком: исходный отправитель, мое имя, дата отправки и тема,Автор электронного письма предположительно потратил некоторое время на создание текста электронного письма и не хотел бы, чтобы этот несоответствующий заголовок ставил перед ним текст.Итак, как мне было запретить включение этого заголовка в электронное письмо, отправленное на «mail2fax.com»?

Моей первой идеей было использование метода «Копировать» вместо метода «Вперед».Это дало удовлетворительный внешний вид, но было немного неловко.С выпиской Set ItemNew = ItemCrnt.Forward, ItemNew представляет собой черновик письма, готовый для завершения и сохраненный в папке «Черновики» или отправленный.Но с выпиской Set ItemNew = ItemCrnt.Copy, ItemNew является полученным письмом и, при сохранении, помещается в папку «Входящие».Я отправил скопированное электронное письмо, и внешний вид, когда он приходит на один из моих дополнительных адресов электронной почты, выглядит удовлетворительным.

Моя вторая идея нуждается в представлении.Письмо может иметь чее тела: простой текст, HTML или RTF.Я никогда не видел электронную почту, содержащую текст RTF (Rich Text Format).RTF был, вероятно, разумным форматом 20 лет назад, если вы хотели больше такого простого текста.Но сегодня HTML настолько мощен, что одну и ту же электронную почту можно переставить для большого экрана ПК, планшета или смартфона, чтобы его всегда было легко прочитать.Таким образом, для всех практических целей есть только два формата для электронной почты: простой текст и HTML.Если электронное письмо имеет как обычный текст, так и тело HTML, то это тело HTML будет показано читателю.Программист VBA может смотреть либо на одно, либо на оба тела, но читателю не говорят, что это текстовое тело.Очень редко я видел тщательно сконструированное текстовое тело, разработанное для почтового пакета, который не может обрабатывать HTML.Но обычно тело простого текста - это просто тело HTML с удаленными тегами HTML.

Моя вторая идея состояла в том, чтобы использовать метод «Вперед», а затем скопировать текст и тела HTML из исходного сообщения электронной почты.

В приведенном выше коде вы найдете:

.Subject = Subject
' Clear existing recipient(s)

Пожалуйста, замените эти две строки на:

.Subject = Subject
.Body = ItemCrnt.Body
.HtmlBody = ItemCrnt.HtmlBody
' Clear existing recipients

С этим изменением черновики писем не будут иметь «переадресован ».

Я полагаю, вы знаете, кому эти факсы отправляются по факсу.Я предлагаю вам связаться с одним или двумя и сказать, что вы собираетесь провести эксперимент.Они уже получили факсы, потому что вы используете интерфейс клавиатуры для пересылки этих писем.Отправьте несколько черновиков писем, созданных моим макросом, и спросите мнение получателей о новом появлении.Если они предпочитают новый внешний вид, мы будем готовы перейти к этапу 3: Автоматизация этих электронных писем.Если им не нравится новый внешний вид, вам нужно будет спросить их, что не так с новым внешним видом, и мы попытаемся решить проблему.

Часть 3

Пожалуйста, не следуйте инструкциям в этой части, пока не убедитесь, что электронные письма, созданные макросом ForwardAndMoveEmail, соответствуют требованиям.Эта часть посвящена автоматизации процесса, поэтому электронные письма будут отправлены без возможности проверить или исправить их перед отправкой.

Пожалуйста, внесите следующие изменения в макрос ForwardAndMoveEmail:

Заменить Public Sub ForwardAndMoveEmail(ByRef ItemCrnt As Object)

на Public Sub ForwardAndMoveEmail(ByRef ItemCrnt As MailItem).

При способе выбора электронной почты 1 возможно (сложно, но возможно) выбрать элементы, которые не являются MailItems с.Я установил тип ItemCrnt на Object, чтобы это не вызывало ошибку.Чтобы использовать макрос с правилом, ItemCrnt должно быть MailItem.

Эти операторы теперь избыточны:

If ItemCrnt.Class <> olMail Then
  ' Ignore item if it is not an email
  Exit Sub
End If   

Вы можете оставить эти операторы, поскольку они не причинят вреда.Кроме того, вы можете удалить их или поместить кавычки перед каждым оператором.

Заменить .Save на .Send.

В моей системе я могу прикрепить макрос к правилу.Если вы можете сделать то же самое, это будет самый простой подход.Однако некоторые ИТ-отделы считают, что присоединение макроса к правилу представляет угрозу безопасности и отключает его.Если вы обнаружите, что не можете прикрепить макрос к правилу, вам придется попробовать подход с использованием событий.При необходимости я добавлю дополнительные инструкции.

Приведенные ниже снимки экрана взяты из моей домашней установки Outlook.У вас есть функциональность, которой мне не хватает, поэтому экраны, которые вы видите, не будут идентичныТем не менее, мои скриншоты должны быть достаточно похожими на ваши, чтобы быть полезными.

Выберите одно из этих электронных писем с «автоматическим факсом».На вкладке «Главная» нажмите «Правила», затем «Создать правило ...».Вы получите всплывающее окно, подобное этому:

First screen of Create a rule

Я создал электронное письмо «Авто факс» в одной из моих дополнительных учетных записей и отправил его по адресумне основной аккаунт.Вот почему меня показывают как отправителя, так и получателя.Поскольку я выбрал электронное письмо «Авто факс», отображается его тема.Отредактируйте эту тему, чтобы удалить первые цифры.В поле рядом с темой появится галочка:

First screen of Create a rule after editing

Нажмите «Дополнительные параметры ...»чтобы получить это всплывающее окно:

Second screen of Create a rule

Обратите внимание, что объект в строке рядом с верхом не редактировался.Это не имеет значения;это значение в поле «Шаг 2» имеет значение.Обратите внимание, что если вы нажмете «Авто факс» в поле «Шаг 2», вы можете добавить дополнительные значения.Так что, если некоторые из этих писем имеют немного разные темы, вы можете добавить эти альтернативные значения.Нажмите «Далее», чтобы открыть всплывающее окно, подобное этому:

Third screen of Create a rule

В нижней части находится «Запустить скрипт».У вас будет больше опций, и, возможно, придется прокрутить вниз, чтобы увидеть эту опцию.Нажмите на поле рядом с этой опцией.«Запустите скрипт» появится в поле «Шаг 2».Нажмите «Запустить скрипт» в поле «Шаг 2».Вам будет предложено «Включить макросы», если вы еще этого не сделали.Появится новое всплывающее окно со всеми макросами, которые можно выбрать для этой опции.У меня есть несколько возможных макросов, поэтому я не буду показывать вам свой список.Вы должны увидеть только один макрос: ForwardAndMoveEmail.Чтобы появиться в этом списке, макрос должен быть Public, а первый параметр должен быть MailItem.Выберите ForwardAndMoveEmail, если он не выбран, и нажмите «ОК».«Запустить скрипт» теперь читается как «Запустить ForwardAndMoveEmail».Нажмите кнопку "Далее".Вы получите всплывающее окно исключений, которые, я полагаю, не имеют отношения к вам.Нажмите «Далее», чтобы получить последнее всплывающее окно:

Final screen of Create a rule

Вы можете установить флажок «Запустить это правило сейчас для сообщений, уже находящихся в« Входящие», Чтобы переслать любое из писем« Авто факс », которое уже получено, но не переслано.Нажмите «Готово».

Правило «Авто-факс» теперь действует, и любые письма «Авто-факс» будут автоматически пересылаться.Было бы неплохо проконтролировать папку «Отправленные по факсу» и проверить, что предполагаемые получатели получили свои факсы.

...