Gmail is a widely used email service used by individuals and organizations. Typically, we download attachment from Gmail via web browser. But sometimes you may need to download attachment from Gmail via terminal. For example, you may need to download a CSV file from Gmail and run some commands or scripts on it automatically. You can easily do this using scripting languages such as Python, Perl or even shell script. In this article, we will learn how to download attachment from Gmail using shell script in Linux. It is useful for email attachment processing.
How to Download Attachment from Gmail Using Shell Script
We will basically be downloading email attachments hosted on a secure POP3 web server such as Gmail and save them to a local folder using fetchmail, procmail and munpack utility tools. Fetchmail is used to fetch email from remote servers, procmail utility is used to convert them into maildir format, as required by munpack and munpack is used to unpack the attachments.
1. Install Required Packages
Open terminal and run the following commands to install required packages.
$ sudo apt-get install fetchmail procmail mpack
2. Configure Fetchmail
Run the following command to create configuration file for fetchmail.
$ vi ~/.fetchmailrc
Add the following lines to provide information about your Gmail account. Replace the parts in bold with your Gmail address and password.
poll pop.gmail.com protocol pop3 timeout 300 port 995 username "<firstname.lastname@example.org>" password "<gmail password here>" keep mimedecode ssl sslcertck sslproto TLS1 mda "/usr/bin/procmail -m '/home/ubuntu/.procmailrc'"
Save and close the file. Please note, the last line above specifies the folder location where procmail will store downloaded emails. We will need this in the next step.
Since the above file contains Gmail username and password, we will make it secure by allowing only root user to be able to access it, using the following command.
$ chmod 700 ~/.fetchmailrc
3. Configure Procmail
Next, create configuration file for procmail with the following command.
$ vi ~/.procmailrc
Add the following lines to it, to link it with fetchmail.
LOGFILE=/home/ubuntu/.procmail.log MAILDIR=/home/ubuntu/ VERBOSE=on :0 Maildir/
The above configuration will set /home/ubuntu as the folder where emails are to be downloaded & saved. It needs to be the same directory mentioned in the last configuration line of fetchmail file in previous step. Only then fetchmail and procmail will be able to work together properly.
Next, run the following commands to create a bunch of directories required to download and save emails and attachments.
mkdir ~/Maildir/process mkdir ~/Maildir/process/landing mkdir ~/Maildir/process/extract mkdir ~/Maildir/process/store mkdir ~/Maildir/process/archive
Here is what each of the directories are required for:
- landing is where we first move new mails from procmail’s Maildir before extracting the attachments
- extract is where attachment extraction is performed
- store is the final destination of attachments
- archive is where the mail files are stored after the process is done. If you want to reprocess certain files, just move it back to landing
4. Create Shell Script to Download Gmail Attachment
Next, create an empty shell script to download Gmail attachment.
$ vi ~/scripts/getmail.sh
Add the following lines to it.
#!/bin/bash DIR=/home/ubuntu/Maildir LOG=/home/ubuntu/Maildir/getmail.log date +%r-%-d/%-m/%-y >> $LOG fetchmail mv $DIR/new/* $DIR/process/landing/ cd $DIR/process/landing/ shopt -s nullglob for i in * do echo "processing $i" >> $LOG mkdir $DIR/process/extract/$i cp $i $DIR/process/extract/$i/ echo "saving backup $i to archive" >> $LOG mv $i $DIR/process/archive echo "unpacking $i" >> $LOG munpack -C $DIR/process/extract/$i -q $DIR/process/extract/$i/$i done shopt -u nullglob echo "finishing.." >> $LOG mv $DIR/process/extract/* /$DIR/process/store/ echo "done!" >> $LOG
Save and close the file. The above script basically calls fetchmail to download emails, and moves their contents to various sub directories in /home/ubuntu/Maildir. From there, we use munpack to unpack the various attachments and even save backup to archive (optional).
Each set of attachments is kept on separate folder, with date & time of processing. Make the file executable with the following command.
$ sudo chmod +x ~/scripts/getmail.sh
You can run the script with the following command.
We will schedule a cronjob to automatically run the above script on a periodic basis. For this, open crontab with the following command.
$ crontab -e
Add the following line to it to run the script every day at 10.a.m.
0 10 * * * /home/ubuntu/scripts/getmail.sh >/dev/null 2>&1
Save and close the file to install the new cronjob.
In this article, we have learnt how to download Gmail attachments using shell script in Linux. You can customize it as per your requirement.