Hi All,
Would love a little help with a program that I have been left by a friend, that recently passed, and as a legacy to him, would really love to keep it going and ideally expand its distribution around our company.
I have the program running but have come across a stumbling block when trying to send emails from within the program.
Unfortunately, he passed away before we finished the handover.
I maybe in the wrong forum so any guidance gratefully received.
Where is the best place to post some coding that is causing me the problem?
Depending on what language the program was written in, you might already be in the right place. Should it be a shell script, "Shell Programming and Scripting" is preferred. Did you check the links bottom left under "More UNIX and Linux Forum Topics You Might Find Helpful".
Hi RudiC,
Thank you for taking the trouble to reply to my very vague posting.
This build system was originally written on a Linux/GNU system.
# !/bin/bash
Really back to basics for me but pleased to have it running albeit with a few niggles.
------ Post updated 08-06-18 at 01:44 AM ------
This is the email coding that I use to send individual emails but for some reason it will not let me select the email I wish to send.
I thought it was just a question of removing the hashtag and voila?
# !/bin/bash
# Email Creation
# Make sure the file contains only one message and is "compacted"...
# Make sure that a dummy attachment was done, if applicable
# Slice this off, just after the end of the main message.
# NB FileSpec (See below) items are looked for within the user's subdir ONLY...
# This means that CollectUserFiles may need to be re-run before CreateEmails
# i.e. Files MUST have already been collected by ./conv08
# Attachments
# Mode : NoAttach # The default if none specified...
# Mode : Auto # Attach the "FileSpec" files from the Users sub-directories
# FileSpec : # The default is '*' if none specified...
# DON'T HAVE _ (Underscore) Characters in any file names (messes with sed)...
# Ditto spaces, they can be a pain in the backside...
clear
#emlFileName="FileName[:Mode[:FileSpec]]"
#emlFileName="$EmailDir/00-Initial.eml:Auto:*.png"
#emlFileName="$EmailDir/00-Intro.eml:Auto"
#emlFileName="$EmailDir/01-Added-To-List.eml"
#emlFileName="$EmailDir/01-Follow-Up.eml"
#emlFileName="$EmailDir/02-Intro-No-Reply.eml"
#emlFileName="$EmailDir/02-Opt-In.eml"
#emlFileName="$EmailDir/02-Opt-In-Final.eml"
#emlFileName="$EmailDir/02-Opt-In-No-Reply.eml"
#emlFileName="$EmailDir/02-Removed-From-List.eml"
#emlFileName="$EmailDir/03-Diagrams-Offer.eml"
#emlFileName="$EmailDir/04-Diagrams-Added.eml:Auto:Diagrams*.pdf"
#emlFileName="$EmailDir/04-Diagrams-SentLate.eml:Auto:Diagrams*.pdf"
#emlFileName="$EmailDir/04-Intro-MakeIB.eml:Auto:*MakeIB*"
#emlFileName="$EmailDir/04-Intro-P-Swap.eml:Auto"
#emlFileName="$EmailDir/20-Latest.eml:Auto"
#emlFileName="$EmailDir/20-Latest-Delayed.eml"
#emlFileName="$EmailDir/20-Latest-Req-Feedback.eml"
#emlFileName="$EmailDir/20-LinkMove.eml:Auto"
#emlFileName="$EmailDir/30-DiaryEntries.eml:Auto:Help.Add-DE.txt;*.DE*"
#emlFileName="$EmailDir/31-DiaryEntries-PreInstalled.eml:Auto:*.ods"
#emlFileName="$EmailDir/99-GenericReUseMe.eml"
#emlFileName="$EmailDir/99-HandOver.eml"
#emlFileName="$EmailDir/99-Shell-No-Attach.eml"
#UserListFileName="$UserListFileName.unconfirmed"
LessUsers=0 # Bodge to change the count value, if necessary...
TotalUsers=$((TotalUsers-LessUsers))
if [ -z "$emlFileName" ]; then
ERROR "No emlFileName selected..."
exit 1
fi
if [ "$OSdetected" = "Linux" ]; then
hostname="$HOSTNAME"
else
# ... on a Mac, this may get appended with .local or .lan (LAN)
hostname="`echo $HOSTNAME | cut -d '.' -f1`"
fi
hostname=z
if [ ! "$hostname" = "main-pc" ] && [ ! "$hostname" = "irh-macbook" ]; then
echo "${ATTRBOLD}##########################################################################${ATTRCLEAR} "
echo ""
WARNING "hostname \"$hostname\" Has not been recognised and has been re-assigned the name \"deputy\""
hostname="deputy"
fi
Runs through all the motions but will not send anything.
Sometimes it picks up the selected email but others it select default. Auto.
My Deputy code is below.
# #!/bin/bash
# This file must be amended to suit the RosterDiary deputy's email account.
# Set up Thunderbird for RosterDiary's email account.
# Start Thunderbird
# Write a message to send from this account.
# Make sure you are OFFLINE.
# Sending the message whilst OFFLINE will send it to the Thunderbird Admin "outbox" folder.
# Retrieve this so you can view it, ascertain the details below.
# Key them here, below, SAVE THE FILE!
#
#
#
SendFromAccount="hotmail.com"
XIdentityKey="id2" # X-Identity-Key:
XAccountKey="account3" # X-Account-Key:
SendFromField="Paul Overington <user.name@hotmail.com>" # From:
ReplyTo="user.name@hotmail.com"
FCCField="imap://user.namer%40hotmail.com@imap-mail.outlook.com/Sent"
UserAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:52.0) Gecko/20100101 Thunderbird/52.9.1"
OutboxFileName="imap://user.name%40hotmail.com@imap-mail.outlook.com/Outbox" # "Outbox" for results
------ Post updated at 03:00 AM ------
This is the ./conv09 for the sending of emails.
#!/bin/bash
# Create emails for individual users.
# The attachement files must already be located in each user's directory...
# WARNING - User files with _ (Underscore) characters in the name will mess up...
if [ ! -r "./conv.conf" ]; then
echo "$0: ./conv.conf is missing"
exit 1
fi
. "./conv.conf"
if [ ! -r "$0.conf" ]; then
echo "$0: $0.conf is missing"
exit 1
fi
. "$0.conf"
if [ -r "$0.conf.$hostname" ]; then
. "$0.conf.$hostname"
for ReqdVar in SendFromAccount XIdentityKey XAccountKey SendFromField ReplyTo FCCField UserAgent OutboxFileName
do
if [ -z "`eval echo '$'$ReqdVar`" ]; then
ERROR "$ReqdVar= is not set in \"$0.conf.$hostname\""
exit
fi
done
else
ERROR "$0.conf.$hostname was not found"
cat << 'UntilHere'
The file is expected to contain the following variables:
SendFromAccount=
XIdentityKey= # X-Identity-Key:
XAccountKey= # X-Account-Key:
SendFromField= # From:
ReplyTo=
FCCField=
UserAgent=
OutboxFileName=
These can be ascertained by creating a dummy email using Mozilla Thunderbird,
then viewing the file in a text editor. All values are mandatory.
Multiple "SendFromAccount" blocks can be specified, eg Hotmail, gMail, etc
FOR EXAMPLE:
case "$SendFromAccount" in
"Hotmail")
XIdentityKey= # X-Identity-Key:
XAccountKey= # X-Account-Key:
SendFromField= # From:
ReplyTo=
FCCField=
UserAgent=
OutboxFileName=
;;
*)
WARNING "Unrecognised SendFromAccount \"$SendFromAccount\""
;;
esac
UntilHere
fi
echo ""
echo "$ATTRBOLD### `basename $0` ###$ATTRCLEAR : Create Emails"
Boundary="^ boundary=" # This is a grep string for "drafts"
HTMLindent=" " # 4 Spaces
NewLine="<br>\\n"
NBSpace="\�"
FSWidth=8
if [ "$1" = "--append" ]; then
OutboxMode="append"
else
OutboxMode="overwrite"
fi
# Stick a : on the end to make the cut work if the there is no delimiter
emlFileName="${emlFileName}:"
AttachMode="`echo "$emlFileName" | cut -f 2 -d ':'`"
FileSpec="`echo "$emlFileName" | cut -f 3 -d ':'`"
emlFileName="`echo "$emlFileName" | cut -f 1 -d ':'`"
[ -z "$AttachMode" ] && AttachMode="NoAttach"
if [ "$AttachMode" = "Auto" ]; then
[ -z "$FileSpec" ] && FileSpec='*'
fi
echop "HOSTNAME" "$hostname"
echop "UserListFileName" "$UserListFileName"
echop "emlFileName" "$emlFileName"
echop "AttachMode" "$AttachMode"
if [ "$AttachMode" = "Auto" ]; then
echop "UsersDir" "$UsersDir"
echop "SubDir" "$SubDir"
echop "FileSpec" "$FileSpec"
# echop "Boundary" "$Boundary"
fi
echop "SendFromAccount" "$SendFromAccount"
echop "OutboxFileName" "$OutboxFileName"
echop "OutboxMode" "$OutboxMode" # overwrite/append
if [ "$CRON" = "1" ]; then
:
else
echo ""
WARNING "Please check all of the above settings, then:"
pressenter
fi
if [ ! -r "$UserListFileName" ]; then
echo ""
ERROR "File not found: UserListFileName \"$UserListFileName\""
echo "Check conv.conf"
exit 1
fi
if [ ! -r "$emlFileName" ]; then
echo ""
ERROR "File not found: emlFileName \"$emlFileName\""
echo "Check conv.conf"
exit 1
fi
get_mimetype()
{
# warning: assumes that the passed file exists
file --mime-type "$1" | sed 's/.*: //'
}
MakeFileSpecFileList() # NB Not for '*'
{
[ -f "$0.tmp.$UserWholeName.filelist" ] && rm -f "$0.tmp.$UserWholeName.filelist"
WhatsLeft="${FileSpec};" # Graft on a ';' to make the cut work correctly
while true;
do
ThisSearchTerm="`echo "$WhatsLeft" | cut -d ';' -f 1 | sed 's/ \t//'`"
WhatsLeft="`echo "$WhatsLeft" | cut -d ';' -f 2- | sed 's/ \t//'`"
find "$UsersDir/$UserWholeName/$SubDir" -name "$ThisSearchTerm" -print | sort | sed 's/^/ /' > "$0.tmp.$UserWholeName.filelist.tmp"
if [ `cat "$0.tmp.$UserWholeName.filelist.tmp" | wc -l` -eq 0 ]; then
WARNING "No files found for \"$ThisSearchTerm\""
WarningCount=$((WarningCount+1))
else
cat "$0.tmp.$UserWholeName.filelist.tmp" >> "$0.tmp.$UserWholeName.filelist"
fi
rm -f "$0.tmp.$UserWholeName.filelist.tmp"
if [ -z "$WhatsLeft" ]; then
break
fi
done
if [ -f "$0.tmp.$UserWholeName.filelist" ]; then
sort -u "$0.tmp.$UserWholeName.filelist" > "$0.tmp.$UserWholeName.filelist.tmp" # Remove duplicates
mv -f "$0.tmp.$UserWholeName.filelist.tmp" "$0.tmp.$UserWholeName.filelist"
fi
}
FixDate() # The dates from stat are reversed...
{
YYYY=`echo $StatDate | cut -d '-' -f 1`
MM=`echo $StatDate | cut -d '-' -f 2`
DD=`echo $StatDate | cut -d '-' -f 3`
StatDate="$DD-$MM-$YYYY"
}
MakeHTMLFileList()
{
Tag=$1
[ -f "$0.tmp.$UserWholeName.HTMLFileList" ] && rm -f "$0.tmp.$UserWholeName.HTMLFileList"
touch "$0.tmp.$UserWholeName.HTMLFileList"
if [ "$Tag" = "UnzippedList" ]; then
while read ThisFile
do
if [ -f "$ThisFile" ]; then
WholeDateStamp=`stat --format="%y" "$ThisFile" | cut -d '.' -f 1`
StatDate="`echo $WholeDateStamp | cut -d ' ' -f 1`"
FixDate
StatTime="`echo $WholeDateStamp | cut -d ' ' -f 2`"
[ "$OSdetected" = "Darwin" ] && StatTime=`echo "$StatTime" | sed 's/.0000000000//'`
StatSize=`stat --format="%s" "$ThisFile"`
StatName="`stat --format="%n" "$ThisFile"`"
StatName="`basename $StatName`"
echo "$StatDate $StatTime $StatSize $StatName" >> "$0.tmp.$UserWholeName.HTMLFileList"
fi
done < "$0.tmp.$UserWholeName.filelist"
elif [ "$Tag" = "ZipFile" ]; then
if [ -f "$UsersDir/$UserWholeName/$ProjectName.$UserWholeName.zip" ]; then
WholeDateStamp=`stat --format="%y" "$UsersDir/$UserWholeName/$ProjectName.$UserWholeName.zip" | cut -d '.' -f 1`
StatDate="`echo $WholeDateStamp | cut -d ' ' -f 1`"
FixDate
StatTime="`echo $WholeDateStamp | cut -d ' ' -f 2`"
[ "$OSdetected" = "Darwin" ] && StatTime=`echo "$StatTime" | sed 's/.0000000000//'`
StatSize=`stat --format="%s" "$UsersDir/$UserWholeName/$ProjectName.$UserWholeName.zip"`
StatName="`stat --format="%n" "$UsersDir/$UserWholeName/$ProjectName.$UserWholeName.zip"`"
StatName="`basename $StatName`"
echo "$StatDate $StatTime $StatSize $StatName" > "$0.tmp.$UserWholeName.HTMLFileList"
fi
else
ERROR "Invalid Tag sent to MakeHTMLFileList"
exit 1
fi
if [ -z "$0.tmp.$UserWholeName.HTMLFileList" ]; then
return
fi
cat "$0.tmp.$UserWholeName.HTMLFileList" | sort --field-separator ' ' -k 4 > "$0.tmp.$UserWholeName.HTMLFileList.tmp"
mv -f "$0.tmp.$UserWholeName.HTMLFileList.tmp" "$0.tmp.$UserWholeName.HTMLFileList"
AttachFileCount=0
HTMLFileList="<tt>{{NewLine}}"
while read fileLineIn
do
FileDate=`echo "$fileLineIn" | cut -d ' ' -f 1`
FileTime=`echo "$fileLineIn" | cut -d ' ' -f 2`
FileSize=`echo "$fileLineIn" | cut -d ' ' -f 3`
FileName="`echo "$fileLineIn" | cut -d ' ' -f 4-`"
FileSize=`commaformat $FileSize`
Len=${#FileSize}
while [ $Len -le $FSWidth ]
do
FileSize="${NBSpace}$FileSize"
Len=$((Len+1))
done
HTMLFileList="${HTMLFileList}${HTMLindent}${FileDate} ${FileTime} ${FileSize} bytes - ${FileName}{{NewLine}}"
AttachFileCount=$((AttachFileCount+1))
done < "$0.tmp.$UserWholeName.HTMLFileList"
if [ "$Tag" = "UnzippedList" ]; then
if [ $AttachFileCount -eq 1 ]; then
HTMLFileList="${HTMLFileList}${HTMLindent}""You have 1 file!</tt>{{NewLine}}{{NewLine}}"
else
HTMLFileList="${HTMLFileList}${HTMLindent}""You have $AttachFileCount files!</tt>{{NewLine}}{{NewLine}}"
fi
else
HTMLFileList="${HTMLFileList}${HTMLindent}</tt>{{NewLine}}"
fi
### Warning! Filenames with _ chars in them will cause a sed warning...
cat "$0.tmp.$UserWholeName" | sed "s_{{$Tag}}_`echo -n "$HTMLFileList"`_" > "$0.tmp.$UserWholeName.tmp"
mv -f "$0.tmp.$UserWholeName.tmp" "$0.tmp.$UserWholeName"
cat "$0.tmp.$UserWholeName" | sed "s_{{NewLine}}_${NewLine}_g" > "$0.tmp.$UserWholeName.tmp"
mv -f "$0.tmp.$UserWholeName.tmp" "$0.tmp.$UserWholeName"
rm -f "$0.tmp.$UserWholeName.HTMLFileList"
}
if [ $AttachMode = "Auto" ]; then
BoundaryLine=`cat "$emlFileName" | grep -e "$Boundary"`
BoundaryLine=`echo $BoundaryLine | cut -d '=' -f 2 | tr -d '"' | tr -d '\r'`
if [ -z "$BoundaryLine" ]; then
echo "No boundary line found \"$Boundary\""
echo "Make sure the template email had an attachment..."
exit 1
fi
fi
rm -f "$0.tmp.newfile"
touch "$0.tmp.newfile"
# The original first "From - " line will inherit the emlFileName's datetamp
# From - Wed Jun 04 00:00:00 2014
CurrentDateStr="`date -r "$emlFileName" +"%a %b %d %T %Y"`"
cat "$emlFileName" | sed "s/^From -.*/From - $CurrentDateStr/" > "$emlFileName.tmp0"
mv -f "$emlFileName.tmp0" "$emlFileName"
# Adjust the "Date: " line to reflect the current date/time
#Date: Mon, 29 Dec 2014 17:47:33 +0000
CurrentDateStr="`date +"%a, %d %b %Y %T %z"`"
cat "$emlFileName" | sed "s/^Date:.*/Date: $CurrentDateStr/" > "$emlFileName.tmp0"
/bin/cp -f "$emlFileName.tmp0" "$emlFileName"
# Incorporate all the global "Include=Files"
WarningCount=0
grep -m 1 --quiet -e "{{Include=" "$emlFileName.tmp0"
while [ $? -eq 0 ];
do
IncludeFile=`grep -m 1 -e "{{Include=" "$emlFileName.tmp0" | cut -f 2 -d '=' | sed 's/}}//'`
if [ -f "$EmailDir/$IncludeFile" ]; then
LineNo=`grep -n -e "{{Include=$IncludeFile" "$emlFileName.tmp0" | cut -f 1 -d ':'`
head --lines=$((LineNo-1)) "$emlFileName.tmp0" > "$emlFileName.tmp1"
cat "$EmailDir/$IncludeFile" >> "$emlFileName.tmp1"
tail --lines=+$((LineNo+1)) "$emlFileName.tmp0" >> "$emlFileName.tmp1"
mv -f "$emlFileName.tmp1" "$emlFileName.tmp0"
else
WARNING "Include file not found: $EmailDir/$IncludeFile"
WarningCount=$((WarningCount+1))
fi
# Remove the {{Include=}} place-holder
cat "$emlFileName.tmp0" | sed "/{{Include=$IncludeFile}}/d" > "$emlFileName.tmp1"
mv -f "$emlFileName.tmp1" "$emlFileName.tmp0"
grep -m 1 --quiet -e "{{Include=" "$emlFileName.tmp0"
done
# Remove comments from the modified shell file,
# these must start in the first column
cat "$emlFileName.tmp0" | grep -v -e "^#" > "$emlFileName.tmp1"
mv -f "$emlFileName.tmp1" "$emlFileName.tmp0"
# Include the .conf file Mozilla tagging for whichever account is being used
cat "$emlFileName.tmp0" | sed "s/{{XIdentityKey}}/${XIdentityKey}/" > "$emlFileName.tmp1"
cat "$emlFileName.tmp1" | sed "s/{{XAccountKey}}/${XAccountKey}/" > "$emlFileName.tmp0"
cat "$emlFileName.tmp0" | sed "s/{{SendFromField}}/${SendFromField}/" > "$emlFileName.tmp1"
if [ -z "$ReplyTo" ]; then
cat "$emlFileName.tmp1" | sed "/Reply-To:/d" > "$emlFileName.tmp0"
else
cat "$emlFileName.tmp1" | sed "s/{{ReplyTo}}/${ReplyTo}/" > "$emlFileName.tmp0"
fi
cat "$emlFileName.tmp0" | sed "s^{{UserAgent}}^${UserAgent}^" > "$emlFileName.tmp1"
cat "$emlFileName.tmp1" | sed "s^{{FCCField}}^${FCCField}^" > "$emlFileName.tmp0"
rm -rf "$emlFileName.tmp1"
Today=`date +%Y/%m/%d` # Feed this string into date -d and you get 0000 for the time
DayNoToday=$((`date +%s -d $Today`/86400 ))
TwoWeeks=$((DayNoToday+15)) # Two weeks plus a day, because we started at 00:00
TwoWeeks=$((TwoWeeks*86400))
TwoWeeks="`date -d "@$TwoWeeks" "+%d/%m/%Y"`"
UserCount=0
while read userLineIn
do
if [ -z "$userLineIn" ]; then
continue
fi
if [ "${userLineIn:0:6}" = "break;" ]; then
INFORMATION "break; encountered..."
break
fi
userLineIn="`echo "${userLineIn}" | cut -d '#' -f 1 | sed 's/^[ \t]*//;s/[ \t]*$//'`"
if [ -z "$userLineIn" ]; then
continue
fi
UserCount=$((UserCount+1))
UserFirstName="`echo "$userLineIn" | cut -d ',' -f 1`"
echo "$UserFirstName" | grep --quiet -e ";"
if [ $? -eq 0 ]; then
UserSalutationName="`echo "$UserFirstName" | cut -d ';' -f 2`" # Must cut this first...
UserFirstName="`echo "$UserFirstName" | cut -d ';' -f 1`"
else
UserSalutationName="$UserFirstName"
fi
UserLastName="`echo "$userLineIn" | cut -d ',' -f 2`"
UserEmailAddress="`echo "$userLineIn" | cut -d ',' -f 3`"
UserSearchStr="`echo "$userLineIn" | cut -d ',' -f 4`"
UserWholeName="${UserFirstName}${UserLastName}"
# NB UserSearchStr could be used with flags to override the default data encoding...
echo ""
echo "User $UserCount"
echo "$UserFirstName $UserLastName"
echo " $UserEmailAddress"
if [ -z "$UserEmailAddress" ] || [ "$UserEmailAddress" = "noemail" ]; then
WARNING "User has a blank email address or it is set to \"noemail\"."
WARNING "Skipping this user..."
UserCount=$((UserCount-1))
continue
fi
rm -f "$0.tmp.$UserWholeName"
cp -f "$emlFileName.tmp0" "$0.tmp.$UserWholeName" ### First use of main emlFileName, post global SnR
# http://forensicswiki.org/wiki/Thunderbird_Header_Format
DatePart=$(printf "%x" `date +%s` | tr '[a-f]' '[A-F]')
RandomPart=$((RANDOM%10))'0'$((RANDOM%10))'0'$((RANDOM%10))'0'$((RANDOM%10))
# eg MessageID_Base="53B6D94E.3030709"
MessageID_Base="$DatePart.$RandomPart"
UserMessageIDLine="<${MessageID_Base}@${SendFromAccount}>"
cat "$0.tmp.$UserWholeName" | sed "s/{{MessageID}}/$UserMessageIDLine/" > "$0.tmp.$UserWholeName.tmp"
mv -f "$0.tmp.$UserWholeName.tmp" "$0.tmp.$UserWholeName"
# Need to do this first in case there are "tags" in the Personal Message file...
grep --quiet -e "{{PersonalMessage}}" "$0.tmp.$UserWholeName"
if [ $? -eq 0 ]; then
if [ -f "$EmailDir/PM.$UserWholeName.eml" ]; then
WARNING "Personal Message file PM.$UserWholeName.eml found!"
WarningCount=$((WarningCount+1))
LineNo=`grep -n -e "{{PersonalMessage}}" "$0.tmp.$UserWholeName" | cut -f 1 -d ':'`
head --lines=$((LineNo-1)) "$0.tmp.$UserWholeName" > "$0.tmp.$UserWholeName.tmp"
cat "$EmailDir/PM.$UserWholeName.eml" >> "$0.tmp.$UserWholeName.tmp"
tail --lines=+$((LineNo+1)) "$0.tmp.$UserWholeName" >> "$0.tmp.$UserWholeName.tmp"
mv -f "$0.tmp.$UserWholeName.tmp" "$0.tmp.$UserWholeName"
mv -f "$EmailDir/PM.$UserWholeName.eml" "$EmailDir/PM.$UserWholeName#.eml"
else
# Remove the {{PersonalMessage}} place-holder
#echo " No Personal Message file"
cat "$0.tmp.$UserWholeName" | sed "/{{PersonalMessage}}/d" > "$0.tmp.$UserWholeName.tmp"
mv -f "$0.tmp.$UserWholeName.tmp" "$0.tmp.$UserWholeName"
fi
fi
cat "$0.tmp.$UserWholeName" | sed "s/{{ProjectName}}/$ProjectName/" > "$0.tmp.$UserWholeName.tmp"
mv -f "$0.tmp.$UserWholeName.tmp" "$0.tmp.$UserWholeName"
cat "$0.tmp.$UserWholeName" | sed "s/{{VerNo}}/$VerNo/" > "$0.tmp.$UserWholeName.tmp"
mv -f "$0.tmp.$UserWholeName.tmp" "$0.tmp.$UserWholeName"
cat "$0.tmp.$UserWholeName" | sed "s/{{DateStamp}}/$DateStamp/" > "$0.tmp.$UserWholeName.tmp"
mv -f "$0.tmp.$UserWholeName.tmp" "$0.tmp.$UserWholeName"
cat "$0.tmp.$UserWholeName" | sed "s/{{SubDir}}/$SubDir/" > "$0.tmp.$UserWholeName.tmp"
mv -f "$0.tmp.$UserWholeName.tmp" "$0.tmp.$UserWholeName"
cat "$0.tmp.$UserWholeName" | sed "s/{{SalutationName}}/$UserSalutationName/" > "$0.tmp.$UserWholeName.tmp"
mv -f "$0.tmp.$UserWholeName.tmp" "$0.tmp.$UserWholeName"
cat "$0.tmp.$UserWholeName" | sed "s/{{FirstName}}/$UserFirstName/" > "$0.tmp.$UserWholeName.tmp"
mv -f "$0.tmp.$UserWholeName.tmp" "$0.tmp.$UserWholeName"
cat "$0.tmp.$UserWholeName" | sed "s/{{LastName}}/$UserLastName/" > "$0.tmp.$UserWholeName.tmp"
mv -f "$0.tmp.$UserWholeName.tmp" "$0.tmp.$UserWholeName"
cat "$0.tmp.$UserWholeName" | sed "s/{{EmailAddress}}/$UserEmailAddress/" > "$0.tmp.$UserWholeName.tmp"
mv -f "$0.tmp.$UserWholeName.tmp" "$0.tmp.$UserWholeName"
cat "$0.tmp.$UserWholeName" | sed "s/{{UserSearchStr}}/$UserSearchStr/" > "$0.tmp.$UserWholeName.tmp"
mv -f "$0.tmp.$UserWholeName.tmp" "$0.tmp.$UserWholeName"
cat "$0.tmp.$UserWholeName" | sed "s/{{DatedUsers}}/$DatedUsers/" > "$0.tmp.$UserWholeName.tmp"
mv -f "$0.tmp.$UserWholeName.tmp" "$0.tmp.$UserWholeName"
cat "$0.tmp.$UserWholeName" | sed "s/{{DatedRosters}}/$DatedRosters/" > "$0.tmp.$UserWholeName.tmp"
mv -f "$0.tmp.$UserWholeName.tmp" "$0.tmp.$UserWholeName"
cat "$0.tmp.$UserWholeName" | sed "s/{{TotalUsers}}/$TotalUsers/" > "$0.tmp.$UserWholeName.tmp"
mv -f "$0.tmp.$UserWholeName.tmp" "$0.tmp.$UserWholeName"
cat "$0.tmp.$UserWholeName" | sed "s/{{TotalRosters}}/$TotalRosters/" > "$0.tmp.$UserWholeName.tmp"
mv -f "$0.tmp.$UserWholeName.tmp" "$0.tmp.$UserWholeName"
cat "$0.tmp.$UserWholeName" | sed "s^{{TwoWeeks}}^$TwoWeeks^" > "$0.tmp.$UserWholeName.tmp"
mv -f "$0.tmp.$UserWholeName.tmp" "$0.tmp.$UserWholeName"
if [ $AttachMode = "Auto" ]; then
MakeFileSpecFileList
fi
if [ ! -s "$0.tmp.$UserWholeName.filelist" ]; then
if [ $AttachMode = "Auto" ]; then
WARNING "No files found for any search term..."
WarningCount=$((WarningCount+1))
fi
else
MakeHTMLFileList "ZipFile"
MakeHTMLFileList "UnzippedList"
NewBoundaryLine="${BoundaryLine}.$UserCount"
cat "$0.tmp.$UserWholeName" | sed "s/$BoundaryLine/$NewBoundaryLine/" > "$0.tmp.$UserWholeName.tmp"
mv -f "$0.tmp.$UserWholeName.tmp" "$0.tmp.$UserWholeName"
# Remove the existing final boundary line
cat "$0.tmp.$UserWholeName" | sed "s/--${NewBoundaryLine}--//" > "$0.tmp.$UserWholeName.tmp"
mv -f "$0.tmp.$UserWholeName.tmp" "$0.tmp.$UserWholeName"
# Now to add the attachements...
if [ ! -d "$UsersDir/$UserWholeName/${SubDir}" ]; then
echo "Cannot find user directory $UsersDir/$UserWholeName/${SubDir}"
echo "Aborting attachment collection..."
WarningCount=$((WarningCount+1))
echo "" >> "$0.tmp.newfile"
cat "$0.tmp.$UserWholeName" >> "$0.tmp.newfile"
rm -f "$0.tmp.$UserWholeName"
else
if [ "$FileSpec" = '*' ]; then
UserZipFile="`find "$UsersDir/$UserWholeName" -name '*.zip' -print`"
if [ -z "$UserZipFile" ]; then
UserUnzippedFiles="`find "$UsersDir/$UserWholeName/$SubDir" -type f -name '*' ! -name '*.zip' -print`"
echo "$UserUnzippedFiles" > "$0.tmp.$UserWholeName.filelist"
else
echo "$UserZipFile" > "$0.tmp.$UserWholeName.filelist"
fi
else
: # MakeFileSpecFileList output will be remain as created
fi
fi
ItemCount=0
if [ ! -d "$UsersDir/$UserWholeName/${SubDir}" ]; then
: # Warning message already done
else
echo " Adding attachment(s):"
while read AttachmentFile
do
echo " AttachmentFile: $AttachmentFile"
if [ ! -r "$AttachmentFile" ]; then
WARNING "Cannot find file \"$AttachmentFile\""
WarningCount=$((WarningCount+1))
continue
fi
AttachContentDisposition="attachment;"
AttachFileName=`basename "$AttachmentFile"`
# At the moment, everything is going to be base64 encoded...
fileext=${AttachmentFile##*.}
case $fileext in
"zip")
AttachContentType="application/zip;"
AttachContentTransferEncoding="base64"
;;
"ods")
AttachContentType="application/vnd.oasis.opendocument.spreadsheet;"
AttachContentTransferEncoding="base64"
;;
"pdf")
AttachContentType="application/pdf;"
AttachContentTransferEncoding="base64"
;;
"txt")
AttachContentType="text/plain; charset=UTF-8;"
AttachContentTransferEncoding="base64"
;;
"csv")
AttachContentType="text/plain; charset=UTF-8;"
AttachContentTransferEncoding="base64"
# AttachContentTransferEncoding="7bit"
;;
"png")
AttachContentType="image/png;"
AttachContentTransferEncoding="base64"
;;
"jpg")
AttachContentType="image/jpeg;"
AttachContentTransferEncoding="base64"
;;
*)
# get_mimetype() # Take a guess here?
WARNING "Unrecognised file extension \"$fileext\""
WarningCount=$((WarningCount+1))
continue
;;
# get_mimetype() # Take a guess here?
esac
echo "--${NewBoundaryLine}" >> "$0.tmp.$UserWholeName"
echo "Content-Type: $AttachContentType" >> "$0.tmp.$UserWholeName"
echo " name=\"$AttachFileName\"" >> "$0.tmp.$UserWholeName"
echo "Content-Transfer-Encoding: $AttachContentTransferEncoding" >> "$0.tmp.$UserWholeName"
echo "Content-Disposition: $AttachContentDisposition" >> "$0.tmp.$UserWholeName"
echo " filename=\"$AttachFileName\"" >> "$0.tmp.$UserWholeName"
echo "" >> "$0.tmp.$UserWholeName"
if [ "$AttachContentTransferEncoding" = "base64" ]; then
# The default wrap is 76, Thunderbird uses 72
base64 --wrap=72 "$AttachmentFile" > "$0.tmp.$UserWholeName.encoded"
cat "$0.tmp.$UserWholeName.encoded" >> "$0.tmp.$UserWholeName"
rm -f "$0.tmp.$UserWholeName.encoded"
else
WARNING "Unrecognised encoding type \"$AttachContentTransferEncoding\""
WarningCount=$((WarningCount+1))
continue
fi
ItemCount=$((ItemCount+1))
done < "$0.tmp.$UserWholeName.filelist"
rm -f "$0.tmp.$UserWholeName.filelist"
fi
echo "${NewBoundaryLine}--" >> "$0.tmp.$UserWholeName"
fi #if [ $AttachMode = "Auto" ]; then
echo "" >> "$0.tmp.newfile"
cat "$0.tmp.$UserWholeName" >> "$0.tmp.newfile"
rm -f "$0.tmp.$UserWholeName"
if [ "$AttachMode" = "Auto" ]; then
echo "ItemCount: $ItemCount"
fi
done < "$UserListFileName"
echo ""
rm -f "$emlFileName.tmp0"
OBdir="`dirname "$OutboxFileName"`"
[ ! -d "$OBdir" ] && mkdir -p "$OBdir"
[ -f "$OutboxFileName.msf" ] && rm -f "$OutboxFileName.msf"
if [ "$OutboxMode" = "overwrite" ]; then
mv -f "$0.tmp.newfile" "$OutboxFileName"
else
cat "$0.tmp.newfile" >> "$OutboxFileName"
rm -f "$0.tmp.newfile"
fi
unix2dos "$OutboxFileName"
echo ""
echo "Users : $UserCount"
echo "Warnings : $WarningCount"
exit 0
The whole program is huge and like you say my goal is to get it down to a sensible level, without losing its capability to compile etc, before I hand it over in a couple of years when retirement beckons.
Thats where the problem lies then. It goes through the motions but thats it.
You may want to draw / sketch the entire picture, showing all routines / scripts (not in their entirety, please!) and their interrelation or sequence they're called. I can see your little script, a ./conv08 , a ./conv09 ... is there more to it? Somewhere, there must be the command to finally send the mail.
just got back home.
it starts with ./conv right up to .conv09
When to gets to ,/con08 it then collects all the files and ./conv09 should send them all out.
Ned changed it so when it got to .conv09 it went to Deputy, thats me, then I configured that to suit my email which he recomneded I set up using Thunderbird.
Nightmare I know.
------ Post updated at 04:26 PM ------
# #!/bin/bash
# This file must be amended to suit the RosterDiary deputy's email account.
# Set up Thunderbird for RosterDiary's email account.
# Start Thunderbird
# Write a message to send from this account.
# Make sure you are OFFLINE.
# Sending the message whilst OFFLINE will send it to the Thunderbird Admin "outbox" folder.
# Retrieve this so you can view it, ascertain the details below.
# Key them here, below, SAVE THE FILE!
#
#
#
SendFromAccount="hotmail.com"
XIdentityKey="id2" # X-Identity-Key:
XAccountKey="account3" # X-Account-Key:
SendFromField="Paul Overington <user.name@hotmail.com>" # From:
ReplyTo="user.name@hotmail.com"
FCCField="imap://user.name%40hotmail.com@imap-mail.outlook.com/Sent"
UserAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:52.0) Gecko/20100101 Thunderbird/52.9.1"
OutboxFileName="imap://user.name%40hotmail.com@imap-mail.outlook.com/Outbox" # "Outbox" for results