среда, 11 января 2017 г.

Скрипт почтовой рассылки по списку адресатов Mail Merge + From

Скрипт почтовой рассылки по списку адресатов 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

Популярные сообщения