Bash script to send Bulk email with Postfix and Gmail

Sometime it is needed send the same email at several people, unfortunately ours email services providers doesnt' allow this, usually there is a daily limit for the outgoing emails and if we put a lot of recipients in the Ccn field the email is marked as spam and it is blocked.

For sending Bulk email there are a lof of professional services but if we don't have to accomplish this task regularly and we don't need that all the recipients receive the email in the same time then we can use a different approach.

Gmail, for example, allow us to send an email at 500 recipients every 24 hours, but if we use the field CCn with a lot of recipients then the email si blocked. With these considerations we can send our email at 500 recipients, wait 24 hours and then send the same email at others 500 recipients. Obviously this is a tedious job but fortunately we can automatize it using Postfix ad a simple bash script.

As first thing we have to install and configure Postfix as smtp relay for Gmail, then we can use this really simple bash script:

#!/bin/bash
# License: GPL
#
# Author: Mentor <[email protected]>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
daily_emails='400'
pause_between_emails='10'
from="From: Name <[email protected]>"
notifications_email="[email protected]"
recipients=([email protected] [email protected] [email protected] [email protected])
subject="Lorem ipsum"
IFS='' read -r -d '' message <<"EOF"
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Tempus quam pellentesque nec nam aliquam sem et. Bibendum at varius vel pharetra vel turpis. Nibh praesent tristique magna sit amet purus. Sed odio morbi quis commodo odio aenean sed adipiscing diam. Dignissim convallis aenean et tortor at. Id donec ultrices tincidunt arcu non sodales neque. Aliquet risus feugiat in ante metus. Morbi leo urna molestie at elementum eu facilisis sed. Et egestas quis ipsum suspendisse ultrices gravida dictum fusce. Egestas erat imperdiet sed euismod nisi porta lorem. Ut morbi tincidunt augue interdum velit euismod in. Amet tellus cras adipiscing enim eu turpis. Convallis a cras semper auctor neque vitae. Quam viverra orci sagittis eu volutpat odio facilisis. Mattis molestie a iaculis at erat pellentesque. Congue quisque egestas diam in arcu cursus euismod quis. Vulputate enim nulla aliquet porttitor lacus luctus accumsan tortor posuere. Vel pharetra vel turpis nunc eget lorem.

Ut enim blandit volutpat maecenas volutpat blandit. Aliquam sem et tortor consequat id porta nibh venenatis cras. Dictumst quisque sagittis purus sit amet volutpat. Nec nam aliquam sem et. Ac turpis egestas maecenas pharetra convallis posuere morbi leo urna. Vel pharetra vel turpis nunc eget lorem. Duis ultricies lacus sed turpis tincidunt id aliquet risus feugiat. Aliquet sagittis id consectetur purus ut. Id interdum velit laoreet id donec. Dolor purus non enim praesent elementum facilisis. Laoreet id donec ultrices tincidunt. Imperdiet proin fermentum leo vel orci porta non pulvinar neque. Sem nulla pharetra diam sit. Bibendum neque egestas congue quisque egestas. Convallis a cras semper auctor neque vitae.

Nullam ac tortor vitae purus faucibus ornare suspendisse sed. Quis ipsum suspendisse ultrices gravida dictum fusce ut. Morbi tristique senectus et netus et malesuada fames. Mauris vitae ultricies leo integer malesuada nunc vel risus. Pellentesque nec nam aliquam sem et tortor consequat id. Amet tellus cras adipiscing enim eu turpis egestas. Tristique sollicitudin nibh sit amet commodo nulla facilisi nullam. Nulla facilisi morbi tempus iaculis urna id volutpat lacus. Tellus mauris a diam maecenas sed enim ut sem viverra. Praesent semper feugiat nibh sed pulvinar. Semper viverra nam libero justo laoreet. Amet mattis vulputate enim nulla aliquet porttitor. Enim sit amet venenatis urna. Dolor purus non enim praesent. Eget nunc scelerisque viverra mauris in aliquam sem.

Sit amet mauris commodo quis imperdiet massa. Purus ut faucibus pulvinar elementum. Nunc aliquet bibendum enim facilisis gravida neque. Vulputate sapien nec sagittis aliquam malesuada bibendum arcu. Cursus risus at ultrices mi tempus imperdiet nulla malesuada. Blandit cursus risus at ultrices mi tempus imperdiet nulla. Scelerisque varius morbi enim nunc faucibus a pellentesque. Dictum non consectetur a erat nam at lectus urna duis. Et netus et malesuada fames ac turpis egestas sed. Id aliquet lectus proin nibh nisl condimentum. Amet venenatis urna cursus eget nunc scelerisque. Purus semper eget duis at tellus at urna condimentum. Aliquet porttitor lacus luctus accumsan tortor posuere ac ut. Purus semper eget duis at tellus at urna. Arcu risus quis varius quam. Sed id semper risus in hendrerit gravida. Cursus euismod quis viverra nibh cras pulvinar mattis. Tincidunt augue interdum velit euismod.

Et magnis dis parturient montes. Consectetur libero id faucibus nisl. Eget nunc lobortis mattis aliquam faucibus purus in. Et leo duis ut diam quam nulla porttitor massa. Laoreet suspendisse interdum consectetur libero id. Vitae aliquet nec ullamcorper sit amet risus. Orci phasellus egestas tellus rutrum tellus. Ut enim blandit volutpat maecenas volutpat blandit aliquam. Vitae tempus quam pellentesque nec nam aliquam sem et tortor. Ipsum a arcu cursus vitae congue mauris.
EOF

partial_count='0'
total_count='0'

if [ -d /etc/postfix ]; then
        if ! [ ${#recipients[@]} -eq 0 ]; then
                echo "Start sending emails."
                echo "Start sending emails." | mail  -a "Content-Type: text/plain; charset=UTF-8" -a "$from" -e -s "Bulk email" $notifications_email
                for i in ${recipients[@]}; do
                        echo "$message" | mail  -a "Content-Type: text/plain; charset=UTF-8" -a "$from" -e -s "$subject" "$i"
                        partial_count=$((partial_count+1))
                        total_count=$((total_count+1))
                        echo "Sent email number $total_count"
                        if [ $partial_count -eq $daily_emails ]; then
                                echo "Reached max daily limit. Sleep for one day."
                                echo "Reached max daily limit. Sleep for one day." | mail  -a "Content-Type: text/plain; charset=UTF-8" -a "$from" -e -s "Bulk email" $notifications_email
				sleep $((86400-$(($daily_emails*$pause_between_emails))))
                                echo "Restart sending emails after sleeping."
                                echo "Restart sending emails after sleeping." | mail  -a "Content-Type: text/plain; charset=UTF-8" -a "$from" -e -s "Bulk email" $notifications_email
                                partial_count='0'
                        else
                                sleep $pause_between_emails
                        fi
                done
                echo "Operation coompleted."
                echo "Operation coompleted." | mail  -a "Content-Type: text/plain; charset=UTF-8" -a "$from" -e -s "Bulk email" $notifications_email
        fi
fi

The script is self explanatory, it is really simple and obviously can be improved.

Section: 

Comments

Add new comment