- PVSM.RU - https://www.pvsm.ru -

Формирование подписи по шаблону в Outlook для организации, на компьютерах вне домена

Давно в компании используем MS Exch с AD, но большая часть компов в удаленных филиалах не заведены в домен, и так же давно нашего ГД раздражало, что народ в подписи использует все, что угодно, только не принятый корпоративным стандартном шаблон.

Подумав немного и прикинув дальнейшие нервные траты на объяснения почему это нельзя причесать, я решил что лучше сделать это.

Покопавшись в инете не нашел примеров реализации подписи по заранее написанному шаблону, и пришлось ваять самому.

Решил это оформить в виде запроса у пользователя через диалоговое окно его принадлежности к нужному объекту. Дабы не плодить кучу InputBox решил реализовать это через всплывающее окно IE, из которого в дальнейшем вытягиваются все нужные данные.

  • Запрос нужной информации у пользователя

Так как в компании используется 4 основных бренда с разными логотипами, пользователь должен выбрать свой самостоятельно, относительно выбранного бренда, в логотип будет вставляться своё изображение.

Для выбора должности и подразделения из списка используются datalist в котором предварительно описаны все возможные варианты. (Не придумал лучшего способа, если кто подскажет, как реализовать выбор из списка используя внешний файл справочник, будет супер.)

Так же в кусок выбора пользователем бренда вставлена обработка, так как у нас формат подразделений у одного бренда отличается, в зависимости от бренда выбирается формат заведения.

'запрос информации о компании
    Dim objIE
    Dim Brand 
    Set objIE = CreateObject( "InternetExplorer.Application" )
    objIE.Navigate "about:blank"
    objIE.Document.Title = "Запрос для подписи"
    objIE.ToolBar        = False
    objIE.Resizable      = False
    objIE.StatusBar      = False
    objIE.Width          = 600
    objIE.Height         = 250
    Do While objIE.Busy
        WScript.Sleep 200
    Loop
	objIE.Document.Body.InnerHTML = "<DIV align=""Left""><P>"&_
		"<datalist id=""rw""><option>Управляющий</option><option>Помощник</option></datalist>"&_
		"<datalist id=""obj""><option>Объект1</option><option>Объект2</option><option>Объект3</option></datalist>"&_
		"<input type='radio' name='RadioOption' value='1'>U
"&_
		"<input type='radio' name='RadioOption' value='2'>M
"&_
		"<input type='radio' name='RadioOption' value='3'>C<br>"&_
		"<input type='radio' name='RadioOption' value='4'>L<br>"&_
		"<input List='rw' name='Dol' >Должность<br>"&_
		"<input List='obj' name='objt' >Обьект<br>"&_
		"<input type='text' name='FIO' >Фамилия Имя<br>"&_
		"<input type='tel' name='tel' >Мобильный Телефон в формате +7(***)***-**-**<br>"&_
		"<input id='OK' type='hidden' value='0' name='OK'>"&_
		"<input type='submit' value='OK' onClick='VBScript:OK.Value=1'>"
    objIE.Visible = True
    Do While objIE.Document.All.OK.Value = 0
        WScript.Sleep 200
    Loop
    If objIE.Document.All.RadioOption(0).checked=true then Brand ="U"
    If objIE.Document.All.RadioOption(1).checked=true then Brand="M"
    If objIE.Document.All.RadioOption(2).checked=true then Brand="c"
    If objIE.Document.All.RadioOption(3).checked=true then Brand="L"
    
    If objIE.Document.All.RadioOption(0).checked=true then strCompany="U"
    If objIE.Document.All.RadioOption(1).checked=true then strCompany="M"
    If objIE.Document.All.RadioOption(2).checked=true then strCompany="C"
    If objIE.Document.All.RadioOption(3).checked=true then strCompany="L"

    If objIE.Document.All.RadioOption(3).checked=true then dolj= objIE.Document.All.Dol.Value+" кофейней" else dolj= objIE.Document.All.Dol.Value+" столовой"

    objtj= objIE.Document.All.objt.Value
    strMobile = objIE.Document.All.tel.Value
    strName = objIE.Document.All.FIO.Value
    objIE.Quit

На этом запрос у пользователя информации которую мы можем получить от него закончен.

  • Выяснение адреса почты

Так как мы предполагаем, что данный скрипт будет запускаться где уже есть настроенная в Outlook почта, то самым простым способом выяснить адрес почтовый, это заглянуть как она уже настроена, а не ждать что пользователь впишет её сам, ошибившись пару раз в точках и буквах.
Самый простои и логичный способ по моему — это выяснить имя пользователя залогиненого в систему, заглянуть ему в папочку с профилем и глянуть на имя OST файла, которое равнозначно адресу почтового ящика подключенного по MAPI.

On Error Resume Next
strComputer = "."
    Set objWMIService = GetObject("winmgmts:\" & strComputer & "rootcimv2")
    Set colItems = objWMIService.ExecQuery("Select * from Win32_ComputerSystem",,48)
    For Each objItem in colItems
        login_full =objItem.UserName
    Next
    Set objItem = Nothing: Set colItems = Nothing: Set objWMIService = Nothing
login_find = ""
login_pos = InStr(1,login_full,login_find)
login_len = len(login_full)
login = right(login_full,login_len-login_pos)

folder_find = "C:Users"&login&"AppDataLocalMicrosoftOutlook"

Set objShellApp = CreateObject("Shell.Application")
Set objFolder = objShellApp.NameSpace(folder_find)
Set objFolderItems = objFolder.Items()
objFolderItems.Filter 64+128, "*.ost"
For Each file in objFolderItems
    file_name = file
Next

file_len = len(file_name)
strEmail = left(file_name,file_len-4)

  • Формирование подписи для Outlook

Собрав все необходимые данные приступаем к формированию самой подписи.
Шаблона формируется 2, полный для новых сообщений, и короткий — для ответов.
В шаблоне есть несколько картинок, которые тянутся из корп файлового хранилища, к которому по умолчанию есть доступ на чтение у всех. И все лого тянутся оттуда.
Комменты скрипта по тексту кода

strZpov = "С уважением, "
strTitle = dolj+" "+objtj
strweb = "www.www.ru"
strLogo1 = "\cabinetСекретариатЛоготипы"&Brand&"_logo_wl.jpg" 'основной логотип
strLogo3 = "\cabinetСекретариатЛоготипыIns.jpg" ' значек instagram
strLogo2 = "\cabinetСекретариатЛоготипыF.JPG" ' значек facebook
strLogo4 = "\cabinetСекретариатЛоготипыline.png" ' просто горизонтальная линия
strLogo5 = "\cabinetСекретариатЛоготипыSave_wood.jpg" 'подпись о спасении леса

Set objWord = CreateObject("Word.Application")
Set objDoc = objWord.Documents.Add()
Set objSelection = objWord.Selection
Set objEmailOptions = objWord.EmailOptions
Set objSignatureObject = objEmailOptions.EmailSignature
Set objSignatureEntries = objSignatureObject.EmailSignatureEntries
Set objRange = objDoc.Range()

'формируем табличку в которую будут подставлены нужные записи в соответствующие блоки.
'большая подпись представляет из себя табличку из 3 строчных блоков, 2 строка разделена на 2 ячейки

objDoc.Tables.Add objRange,3,2
Set objTable = objDoc.Tables(1)

objTable.Rows(1).select  ' строка 1, выделяем 
objSelection.Cells.Merge ' обьеденяем в единую строку во всю ширину таблички

objTable.Cell(1, 1).select ' выделяем 1 строку и задаем ей ширину
objTable.Cell(1, 1).Width = 605

objselection.font.name = "Cambria"
objSelection.Font.Size = "10"
objSelection.Font.Color = RGB(88,89,91)

 ' начинаем наполнять ячейку текстом о сотруднике ( ФИО, Должность, обьект, моб, почта)
' адрес почты делаем кликабельным для быстрой отправки письма mailto:
objSelection.TypeText strZpov & strName & CHR(11)
objSelection.TypeText strTitle & CHR(11)
objSelection.Font.Bold = true
objSelection.TypeText strCompany & CHR(11)
objSelection.Font.Bold = false 
objSelection.TypeText strMobile  & CHR(11)
hyp.Range.Font.name = "Cambria"
hyp.Range.Font.Size = "10"
hyp.Range.Font.Name = "Cambria"
Set hyp = objSelection.Hyperlinks.Add(objSelection.Range, "mailto: " & strEmail,,, strEmail)
hyp.Range.Font.Name = "Cambria"
hyp.Range.Font.Size = "10"

'строка 2, ячейка 1, вставляем в нее логотип компании
objTable.Cell(2, 1).select
objTable.Cell(2, 1).Width = 150
objTable.Cell(2, 1).Text = objSelection.InlineShapes.AddPicture(strLogo1)

' строка 2 ячейка 2, вставляем текст с адресом и данными о компании
objTable.Cell(2, 2).select  
objselection.font.name = "Cambria"
objSelection.Font.Size = "9,5"
objSelection.Font.Color = RGB(88,89,91)
objSelection.TypeText "111111, Москва, Кремль д1 с10, " & CHR(11)

' Ниже кусочек кода, изначально хотел узнавать у пользователя и телефон подразделения
' если он пустой, то вставляется общий телефон, если не пустой, то вставляется указанный номер
'так же если используется добавочный номер, то можно его запрашивать в переменную strintPhone

if (strPhone <> "") then objSelection.TypeText "БЦ «Кремль», " & strPhone else objSelection.TypeText "БЦ «Кремль», +7(111)111-11-11"
if (strIntPhone <> "") then objSelection.TypeText " доб. " & strIntPhone & CHR(11) else objSelection.TypeText CHR(11) 


Set hyp = objSelection.Hyperlinks.Add(objSelection.Range, strWeb,,, strWeb) 
hyp.Range.Font.Name = "Cambria"
hyp.Range.Font.Size = "9,5"
objSelection.TypeText CHR(9)

set p_f = objSelection.InlineShapes.AddPicture(strLogo2)
Set hyp = objSelection.HyperLinks.Add(p_f, "https://www.facebook.com/kremlin/",,,"Image")
hyp.Range.Font.Name = "Cambria"
hyp.Range.Font.Size = "9,5"
objSelection.TypeText " "
set p_i = objSelection.InlineShapes.AddPicture(strLogo3)
Set hyp = objSelection.HyperLinks.Add(p_i, "https://www.instagram.com/kremlin/",,,"Image")
hyp.Range.Font.Name = "Cambria"
hyp.Range.Font.Size = "9,5"




objselection.font.name = "Cambria"
objSelection.Font.Size = "9,5"
objSelection.Font.Color = RGB(88,89,91)

objSelection.TypeText " @kremlin"
objTable.Rows(3).select ' строка 3, обьединяем в единую ячейку и вставляем лого - береги бумагу
objSelection.Cells.Merge

objTable.Cell(3, 1).select
objTable.Cell(3, 1).Width = 605
objTable.Cell(3, 1).Text = objSelection.InlineShapes.AddPicture(strLogo5)


'''
'данный код формирует из документа подпись и подпихивает его в outlook для новых писем
Set objSelection = objDoc.Range()
objSignatureEntries.Add "AD Signature", objSelection
objSignatureObject.NewMessageSignature = "AD Signature"
objDoc.Saved = True
objDoc.Close
objWord.Quit

'''
' Ниже формируется краткая подпись с теми же данными только для писем ответов
' дабы не захламлять переписку огромными подписями в ответах на письма используется
' сокращенный шаблон

Set objWord = CreateObject("Word.Application")
Set objDoc = objWord.Documents.Add()
Set objSelection = objWord.Selection
Set objEmailOptions = objWord.EmailOptions
Set objSignatureObject = objEmailOptions.EmailSignature
Set objSignatureEntries = objSignatureObject.EmailSignatureEntries
Set objRange = objDoc.Range()

objselection.font.name = "Cambria"
objSelection.Font.Size = "10"
objSelection.Font.Color = RGB(88,89,91)

objSelection.TypeText strZpov & strName & CHR(11)
objSelection.TypeText strTitle & CHR(11)
if (strMobile <> "") then objSelection.TypeText strMobile & "   |    "

if (strPhone <> "") then objSelection.TypeText strPhone else objSelection.TypeText "+7(111)111-11-11"
if (strIntPhone <> "") then objSelection.TypeText " доб. " & strIntPhone & CHR(11) else objSelection.TypeText CHR(11) 


'''


Set objSelection = objDoc.Range()
objSignatureEntries.Add "Short_Signature", objSelection
objSignatureObject.ReplyMessageSignature = "Short_Signature"

objDoc.Saved = True
objDoc.Close
objWord.Quit

Собственно итоговый вид подписей получается такой
Формирование подписи по шаблону в Outlook для организации, на компьютерах вне домена - 1
Формирование подписи по шаблону в Outlook для организации, на компьютерах вне домена - 2

Автор: fox_ch2

Источник [1]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/vbscript/278915

Ссылки в тексте:

[1] Источник: https://habr.com/post/354430/?utm_campaign=354430