Скрипт почтовой рассылки по списку адресатов Mail Merge от имени дргого пользователя
Поставлена задача организовать mail рассылку под учетной запиью служеюного пользователя с использованием списку адресов из файла.
Word умеет использовать список входящих адресов, но не умеет делать рассылку от другого имени.
Outlook наоборот - может отправлять от другого имени, но не принимает список адресатов из файла.
Было принято решение написать свою утилиту для рассылки писем.
Алгоритм действий:
- берем word файл для рассылки, помещаем его в директорию ./mail/out
- утилита конвертирует doc файл в html, складывает в ./mail/html
- производится рассылка, word файл переносится в ./mail/history
Создаем дерево каталогов:
cd ~
mkdir -p ./mail/history ./mail/html ./mail/out
Два конф файла:
touch ./mail/address.txt
touch ./mail/theme.txt
в первый неободимо добавить адреса для рассылки. Один адрес - одна строка.
второй содержит subject письма
Код основного модуля send.sh
#!/bin/bash
work_dir_unix="$(dirname $BASH_SOURCE)"
date_pref=`date +%y%m%d`
if [ "$work_dir_unix" = '.' ]; then
work_dir_unix=`pwd`
fi
work_dir="$(cygpath -w "$work_dir_unix")"
cd "$work_dir"
# Очищаем данные предыдущей рассылки
rm -rf ./out/~*.doc* ./html/*.doc* > /dev/null 2>&1
if ls ./out/*.doc* > /dev/null 2>&1; then
mv ./out/*.doc* ./out/test.doc
file="$(basename ./out/*.doc* | head -1)"
echo -e "Document Found: $file"
else
echo -e "There are no DOC files in ./out/ "
exit 1
fi
# Конвертим Doc -> HTML
cscript //nologo convert.vbs "$work_dir/out/$file" "$work_dir/html/$file.html"
sed 's/test.doc.files\///g' -i ./html/test.doc.html
address="$(cat address.txt)"
echo -e "$address" | grep -v '#' | sed -e '/^$/d' | while read line; do
echo -e "Sending Mail: $line"
cscript //nologo mail.vbs "$line" "$work_dir/html/$file.html" "$work_dir/html/test.doc.files/"
done
mv "$work_dir/out/test.doc" "$work_dir/history/test_$date_pref.doc"
Основной модуль использует два vbs скрипта:
1. convert.vbs :
file=WSCript.Arguments(0)
html=WSCript.Arguments(1)
Set objWord = CreateObject("Word.Application")
Set objDoc = objWord.Documents.Open(file,True,True)
objDoc.SaveAS html,8
objDoc.Close
objWord.Quit
------------------------------------------------
2. mail.vbs :
Dim oMyMail
to_addr=WSCript.Arguments(0)
file2body=WSCript.Arguments(1)
objStartFolder=WSCript.Arguments(2)
Set fso = CreateObject("Scripting.FileSystemObject")
Set InpFile = fso.OpenTextFile("c:\cygwin\home\1\theme.txt",1,False,0)
subject=InpFile.ReadAll
InpFile.Close
Set fso = CreateObject("Scripting.FileSystemObject")
Set InpFile = fso.OpenTextFile(file2body,1,False,0)
att_to_body=InpFile.ReadAll
InpFile.Close
Set oMyMail = CreateObject("CDO.Message")
with oMyMail
.Bodypart.Charset = "windows-1251"
.To = to_addr
.From = "mailer@localhost.ru"
.Subject = subject
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(objStartFolder)
rem Wscript.Echo objFolder.Path
Set colFiles = objFolder.Files
REM НЕсколько форматов вложений
For Each objFile in colFiles
If UCASE(objFSO.GetExtensionName(objFile.name)) = "JPG" or _
UCASE(objFSO.GetExtensionName(objFile.name)) = "PNG" or _
UCASE(objFSO.GetExtensionName(objFile.name)) = "BMP" or _
UCASE(objFSO.GetExtensionName(objFile.name)) = "GIF" Then
file_name=objStartFolder+objFile.Name
Wscript.Echo "--> Attachment Found: " +file_name
.AddRelatedBodyPart file_name, objFile.Name, CdoReferenceTypeName
.Fields.Item("urn:schemas:mailheader:Content-ID") = "<objFile.Name>"
rem Wscript.Echo objFile.Name
End If
Next
.Fields.Update
.HTMLBody = att_to_body
with .Configuration.Fields
.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "127.0.0.1"
.Update
end with
.Send
end with
Комментариев нет:
Отправить комментарий