[linux] Sending a mail from a linux shell script

I want to send an email from a Linux Shell script. What is the standard command to do this and do I need to set up any special server names?

This question is related to linux email shell sendmail

The answer is


If the server is well configured, eg it has an up and running MTA, you can just use the mail command.

For instance, to send the content of a file, you can do this:

$ cat /path/to/file | mail -s "your subject" [email protected]

man mail for more details.


The mail command does that (who would have guessed ;-). Open your shell and enter man mail to get the manual page for the mail command for all the options available.


Generally, you'd want to use mail command to send your message using local MTA (that will either deliver it using SMTP to the destination or just forward it into some more powerful SMTP server, for example, at your ISP). If you don't have a local MTA (although it's a bit unusual for a UNIX-like system to omit one), you can either use some minimalistic MTA like ssmtp.

ssmtp is quite easy to configure. Basically, you'll just need to specify where your provider's SMTP server is:

# The place where the mail goes. The actual machine name is required
# no MX records are consulted. Commonly mailhosts are named mail.domain.com
# The example will fit if you are in domain.com and you mailhub is so named.
mailhub=mail

Another option is to use one of myriads scripts that just connect to SMTP server directly and try to post a message there, such as Smtp-Auth-Email-Script, smtp-cli, SendEmail, etc.


If you want a clean and simple approach in bash, and you don't want to use cat, echo, etc., the simplest way would be:

mail -s "subject here" [email protected] <<< "message"

<<< is used to redirect standard input. It's been a part of bash for a long time.


On linux, mail utility can be used to send attachment with option "-a". Go through man pages to read about the option. For eg following code will send an attachment :

mail -s "THIS IS SUBJECT" -a attachment.txt [email protected] <<< "Hi Buddy, Please find failure reports."


SEND MAIL FROM LINUX TO GMAIL

USING POSTFIX

1: install software

Debian and Ubuntu:

apt-get update && apt-get install postfix mailutils

OpenSUSE:

zypper update && zypper install postfix mailx cyrus-sasl

Fedora:

dnf update && dnf install postfix mailx

CentOS:

yum update && yum install postfix mailx cyrus-sasl cyrus-sasl-plain

Arch Linux:

pacman -Sy postfix mailutils

FreeBSD:

portsnap fetch extract update

cd /usr/ports/mail/postfix

make config

in configaration select SASL support

make install clean

pkg install mailx

2. Configure Gmail

/etc/postfix. Create or edit the password file:

vim /etc/postfix/sasl_passwd

i m using vim u can use any file editer like nano, cat .....

>Ubuntu, Fedora, CentOS,Debian, OpenSUSE, Arch Linux:

add this

where user replace with your mailname and password is your gmail password

[smtp.gmail.com]:587    [email protected]:password

Save and close the file and Make it accessible only by root: becouse its an sensitive content which contains ur password

chmod 600 /usr/local/etc/postfix/sasl_passwd

>FreeBSD:

directory /usr/local/etc/postfix.

vim /usr/local/etc/postfix/sasl_passwd

Add the line:

[smtp.gmail.com]:587    [email protected]:password

Save and Make it accessible only by root:

chmod 600 /usr/local/etc/postfix/sasl_passwd

3. Postfix configuration

configuration file main.cf

6 parameters we must set in the Postfix

Ubuntu, Arch Linux,Debian:

edit

 vim /etc/postfix/main.cf

modify the following values:

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

smtp_sasl_security_options which in configuration will be set to empty, to ensure that no Gmail-incompatible security options are used.

save and close

as like for

OpenSUSE:

vim /etc/postfix/main.cf

modify

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/ca-bundle.pem

it also requires configuration of file master.cf

modify:

vim /etc/postfix/master.cf

as by uncommenting this line(remove #)

#tlsmgr unix - - n 1000? 1 tlsmg

save and close

Fedora, CentOS:

vim /etc/postfix/main.cf

modify

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt

FreeBSD:

vim /usr/local/etc/postfix/main.cf

modify:

relayhost = [smtp.gmail.com]:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_security_options =
smtp_sasl_password_maps = hash:/usr/local/etc/postfix/sasl_passwd
smtp_tls_CAfile = /etc/mail/certs/cacert.pem

save and close this

4. Process Password File:

Ubuntu, Fedora, CentOS, OpenSUSE, Arch Linux,Debian:

postmap /etc/postfix/sasl_passwd

for freeBSD

postmap /usr/local/etc/postfix/sasl_passwd

4.1) Restart postfix

Ubuntu, Fedora, CentOS, OpenSUSE, Arch Linux,Debian:

systemctl restart postfix.service

for FreeBSD:

service postfix onestart
nano /etc/rc.conf

add

postfix_enable=YES

save then run to start

service postfix start

5. Enable "Less Secure Apps" In Gmail using help of below link

https://support.google.com/accounts/answer/6010255

6. Send A Test Email

mail -s "subject" [email protected]

press enter

add body of mail as your wish press enter then press ctrl+d for proper termination

if it not working check the all steps again and check if u enable "less secure app" in your gmail

then restart postfix if u modify anything in that

for shell script create the .sh file and add 6 step command as your requirement

for example just for a sample

#!/bin/bash
REALVALUE=$(df / | grep / | awk '{ print $5}' | sed 's/%//g')
THRESHOLD=80

if [ "$REALVALUE" -gt "$THRESHOLD" ] ; then
    mail -s 'Disk Space Alert' [email protected] << EOF
Your root partition remaining free space is critically low. Used: $REALVALUE%
EOF
fi

The script sends an email when the disk usage rises above the percentage specified by the THRESHOLD varialbe (80% here).


you can use 'email' or 'emailx' command.

(1) $ vim /etc/mail.rc # or # vim /etc/nail.rc

set from = [email protected] #
set smtp = smtp.exmail.gmail.com #gmail's smtp server 
set smtp-auth-user = [email protected] #sender's email address
set smtp-auth-password = xxxxxxx #get from gmail, not your email account passwd
set smtp-auth=login

Because if it is not sent from an authorized account, email will get to junk mail list.

(2) $ echo "Pls remember to remove unused ons topics!" | mail -s "waste topics" -a a.txt [email protected] #send to group user '[email protected]'


If both exim and ssmtp are running, you may enter into troubles. So if you just want to run a simple MTA, just to have a simple smtp client to send email notifications for insistance, you shall purge the eventually preinstalled MTA like exim or postfix first and reinstall ssmtp.

Then it's quite straight forward, configuring only 2 files (revaliases and ssmtp.conf) - See ssmtp doc - , and usage in your bash or bourne script is like :

#!/bin/sh  
SUBJECT=$1  
RECEIVER=$2  
TEXT=$3  

SERVER_NAME=$HOSTNAME  
SENDER=$(whoami)  
USER="noreply"

[[ -z $1 ]] && SUBJECT="Notification from $SENDER on server $SERVER_NAME"  
[[ -z $2 ]] && RECEIVER="another_configured_email_address"   
[[ -z $3 ]] && TEXT="no text content"  

MAIL_TXT="Subject: $SUBJECT\nFrom: $SENDER\nTo: $RECEIVER\n\n$TEXT"  
echo -e $MAIL_TXT | sendmail -t  
exit $?  

Obviously do not forget to open your firewall output to the smtp port (25).


Admitting you want to use some smtp server, you can do:

export SUBJECT=some_subject
export smtp=somehost:someport
export EMAIL=someaccount@somedomain
echo "some message" | mailx -s "$SUBJECT" "$EMAIL"

Change somehost, someport, and someaccount@somedomain to actual values that you would use. No encryption and no authentication is performed in this example.


Another option for in a bash script:

mailbody="Testmail via bash script"
echo "From: [email protected]" > /tmp/mailtest
echo "To: [email protected]" >> /tmp/mailtest
echo "Subject: Mailtest subject" >> /tmp/mailtest
echo "" >> /tmp/mailtest
echo $mailbody >> /tmp/mailtest
cat /tmp/mailtest | /usr/sbin/sendmail -t
  • The file /tmp/mailtest is overwritten everytime this script is used.
  • The location of sendmail may differ per system.
  • When using this in a cron script, you have to use the absolute path for the sendmail command.

You don't even need an MTA. The SMTP protocol is simple enough to directly write it to your SMTP server. You can even communicate over SSL/TLS if you have the OpenSSL package installed. Check this post: https://33hops.com/send-email-from-bash-shell.html

The above is an example on how to send text/html e-mails that will work out of the box. If you want to add attachments the thing can get a bit more complicated, you will need to base64 encode the binary files and embed them between boundaries. THis is a good place to start investigating: http://forums.codeguru.com/showthread.php?418377-Send-Email-w-attachments-using-SMTP


Examples related to linux

grep's at sign caught as whitespace How to prevent Google Colab from disconnecting? "E: Unable to locate package python-pip" on Ubuntu 18.04 How to upgrade Python version to 3.7? Install Qt on Ubuntu Get first line of a shell command's output Cannot connect to the Docker daemon at unix:/var/run/docker.sock. Is the docker daemon running? Run bash command on jenkins pipeline How to uninstall an older PHP version from centOS7 How to update-alternatives to Python 3 without breaking apt?

Examples related to email

Monitoring the Full Disclosure mailinglist require(vendor/autoload.php): failed to open stream Failed to authenticate on SMTP server error using gmail Expected response code 220 but got code "", with message "" in Laravel How to to send mail using gmail in Laravel? Laravel Mail::send() sending to multiple to or bcc addresses Getting "The remote certificate is invalid according to the validation procedure" when SMTP server has a valid certificate How to validate an e-mail address in swift? PHP mail function doesn't complete sending of e-mail How to validate email id in angularJs using ng-pattern

Examples related to shell

Comparing a variable with a string python not working when redirecting from bash script Get first line of a shell command's output How to run shell script file using nodejs? Run bash command on jenkins pipeline Way to create multiline comments in Bash? How to do multiline shell script in Ansible How to check if a file exists in a shell script How to check if an environment variable exists and get its value? Curl to return http status code along with the response docker entrypoint running bash script gets "permission denied"

Examples related to sendmail

Send mail via CMD console Relay access denied on sending mail, Other domain outside of network Using sendmail from bash script for multiple recipients sendmail: how to configure sendmail on ubuntu? VBScript to send email without running Outlook Send SMTP email using System.Net.Mail via Exchange Online (Office 365) Sending a mail from a linux shell script Sending HTML mail using a shell script Debugging PHP Mail() and/or PHPMailer How to send a html email with the bash command "sendmail"?