Правило Outlook не запускает скрипт, если не запускается вручную

Всякий раз, когда я добавляю свой скрипт в правило, которое я настроил в outlook, оно устанавливает мое правило только на стороне клиента. Правило используется, чтобы получить определенное слово в строке темы и определенное слово в теле, затем переместить письмо в подпапку "Входящие" и запустить скрипт. Текущее правило запускается, когда я получаю электронное письмо, перемещая его в указанную папку, но сценарий не запускается, пока я не нажму вручную правило, чтобы запустить его сейчас. Как я могу сделать это там, где он будет обрабатываться только на стороне сервера, чтобы мне не пришлось вручную запускать правило для запуска сценария. Вот мой сценарий ниже:

Public Sub Application_NewMail(myMail As MailItem)
Dim con As ADODB.Connection
Dim rs As ADODB.Recordset
Dim dbName As String
dbName = "M:\CRM\Custom CRM\CRM.accdb"
Set con = New ADODB.Connection

con.ConnectionString = _
    "Provider = Microsoft.ACE.OLEDB.12.0; " & _
    "Data Source = " & dbName & "; " & _
    "Persist Security Info = False; " & _
    "Mode = readwrite;"


con.Open

' Create 2 recordset objects for data manipulation throughout the project
Set rs = New ADODB.Recordset

With rs
    .CursorLocation = adUseClient
    .ActiveConnection = con
    .CursorType = adOpenDynamic
    .LockType = adLockOptimistic
End With


  Dim ns As Outlook.NameSpace
  Dim InBoxFolder As MAPIFolder
  Dim InBoxItem As Object 'MailItem
  Dim Contents As String, Delimiter As String
  Dim Prop, Result
  Dim i As Long, j As Long, k As Long

  Dim myOlApp As Object
  Set myOlApp = CreateObject("Outlook.Application")

  'Setup an array with all properties that can be found in the mail
  Prop = Array("Name", "Email", "Phone", "I am an")
  'The delimiter after the property
  Delimiter = ":"

  Set ns = Session.Application.GetNamespace("MAPI")


  'Access the inbox folder
  Set InBoxFolder = ns.GetDefaultFolder(olFolderInbox)
  Set InBoxFolder = InBoxFolder.Folders("MBAA LEADS")


 For Each InBoxItem In InBoxFolder.Items


'Only process mails
 If Not TypeOf InBoxItem Is MailItem Then GoTo SkipItem
'Already processed?
If Not InBoxItem.UnRead Then GoTo SkipItem
'Mark as read
InBoxItem.UnRead = False
'Get the body
Contents = InBoxItem.Body
'Create space for the result
ReDim Result(LBound(Prop) To UBound(Prop)) As String
'Search each property
i = 1

rs.Open ("Prospects")

rs.AddNew

For k = LBound(Prop) To UBound(Prop)
'MsgBox k

  'Find the property (after the last position)
  i = InStr(i, Contents, Prop(k), vbTextCompare)
  If i = 0 Then GoTo NextProp
  'Find the delimiter after the property
  i = InStr(i, Contents, Delimiter)
  If i = 0 Then GoTo NextProp
  'Find the end of this line
  j = InStr(i, Contents, vbCr)
  If j = 0 Then GoTo NextProp
  'Store the related part
  Result(k) = Trim$(Mid$(Contents, i + Len(Delimiter), j - i - Len(Delimiter)))


If (k = 0) Then

'First Name
rs![First Name] = StrConv(Trim(Mid(CStr(Result(k)), 1, InStr(CStr(Result(k)), " "))), vbProperCase)
'Last Name
rs![Last Name] = StrConv(Trim(Mid(CStr(Result(k)), InStrRev(CStr(Result(k)), " ") + 1)), vbProperCase)
MkDir ("M:\CRM\PROSPECTS\" & StrConv(Trim(Mid(CStr(Result(k)), 1, InStr(CStr(Result(k)), " "))), vbProperCase) & " " & StrConv(Trim(Mid(CStr(Result(k)), InStrRev(CStr(Result(k)), " ") + 1)), vbProperCase) & "")
'Copy Initial Email Inquiry
InBoxItem.SaveAs "M:\CRM\PROSPECTS\" & StrConv(Trim(Mid(CStr(Result(k)), 1, InStr(CStr(Result(k)), " "))), vbProperCase) & " " & StrConv(Trim(Mid(CStr(Result(k)), InStrRev(CStr(Result(k)), " ") + 1)), vbProperCase) & "\Initial Email-MBAA WEBSITE.msg"
ElseIf (k = 1) Then

rs![E-mail Address] = Trim(Mid(CStr(Result(k)), 1, InStr(CStr(Result(k)), " ")))
ElseIf (k = 2) Then

rs![Home Phone] = Result(k)

ElseIf (k = 3) Then
'Check customer type
    If CStr(Result(k)) Like "*Self Insured Group*" Then
        rs![Lead Type] = 1 'Self Insured Group
    ElseIf CStr(Result(k)) Like "*Insurance Company*" Then
        rs![Lead Type] = 2 'Insurance Company
    ElseIf CStr(Result(k)) Like "*Individual Patient*" Then
        rs![Lead Type] = 3 'Consumer
    ElseIf CStr(Result(k)) Like "*Attorney*" Then
        rs![Lead Type] = 4 'Attorney
    ElseIf CStr(Result(k)) Like "*Government*" Then
        rs![Lead Type] = 5 'Attorney
    ElseIf CStr(Result(k)) Like "*Physician*" Then
        rs![Lead Type] = 6 'Physician
    ElseIf CStr(Result(k)) Like "*International Company*" Then
        rs![Lead Type] = 7 'International Company
    ElseIf CStr(Result(k)) Like "*Broker*" Then
        rs![Lead Type] = 8 'Broker
    ElseIf CStr(Result(k)) Like "*Association/Organization*" Then
        rs![Lead Type] = 19 'Association/Organization
    ElseIf CStr(Result(k)) Like "*Other*" Then
        rs![Lead Type] = 9 'Other
    End If


End If

NextProp:
Next
rs![CreatedOn] = InBoxItem.SentOn
rs![Source] = 13 'MBAA WEBSITE
rs.Update
rs.Close


SkipItem:
Next
con.Close
End Sub

1 ответ

Решение

Я предполагаю, что ваш почтовый ящик находится на сервере Exchange или Office365 (который также является Exchange).

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

Единственный вариант для правила на стороне сервера, использующего сценарий или некоторый код на уровне сервера в качестве правила транспорта или агента транспорта.

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

Другие вопросы по тегам