2017-01-20 7 views
0

Всякий раз, когда я добавляю свой скрипт к правилу, имеющему настройку в 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

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

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

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

Я бы предположил, что вы разложите действие на 2 части, это будет правило на стороне сервера и будет работать с Outlook или без него, а затем правило, которое вы можете запустить «по требованию», чтобы выполнить более сложные биты. Он не полностью автоматизирован, но, по крайней мере, вы можете перенести элементы в какую-то временную папку и уйти с пути.