Linux mailx + mutt command Examples - 4 ways to send Email with Attachment from RHEL 5 and 6 Server

One of the common task for programmers working in Linux machine is to send emails, for example, your Java applications are running on Linux like RHEL 5 or RHEL 6 version and you need to send a report of all the clients connecting to your application. An easy way to accomplish this is to write a shell script, which will dump all clients in the log file and then use grep command and generate a report. If you have to grep logs from multiple hosts, you can also use the SSH command to run the same command on multiple hosts. Once you have got the list of clients connecting to your application, you can just send the CSV file to yourself in an email or to your application DL, or a group of users you want to.

Now, the question is how to send an email from Linux? and more importantly how to send an email with attachments? Well, there are different options based on whether you are running on RHEL 5 or RHEL 6.

For example, my favorite way to send an email with attachment was by using the uuencode and mail command but, unfortunately, that didn't work when we migrated to RHEL 6. So, I had to use the mailx command with -a flag for attachments.

But, mailx is not the only way to send email from Linux, you can also use the mutt command if its available to you.

In this article, I'll show you how to send an email with body and attachment using mailx and mutt command from a Linux host. 

There may be a couple of more options but I haven't explored much, for me these two works fine in both RHEL 5 and RHEL 6 hosts and I was able to finish my scripts with these two commands. I'll explore more when I get some time but if you have some thoughts feel free to share with us and if you want to learn more, I suggest you go through Linux Administration Bootcamp course on Udemy.




How to send an email with body and attachment from Linux

I mostly use mailx for sending emails, hence most of the examples are of mailx command. It's also important to know the syntax of the mailx command, which will help you to understand the examples as we move one step at a time.

Syntax of mailx command :

mailx -eiIUdEFntBDNHRV~ -T FILE -u USER -h hops -r address -s SUBJECT -a FILE -q FILE -f FILE -A ACCOUNT -b USERS -c USERS -S OPTION users

You can see that -s is used for a subject and -a is used for attachment. You can also CC users using -c options and BCC users using -b option.

Now, one question, which may come to your mind is what would be the sender's email address when you send mail from Linux? Well, it depends on the user who is sending an email.

For example, if you log in using your personal use and send mail then it would be your email but if you log in as application user and send an email then it would be the email configured for that application user account.


Example 1 - Sending email from Linux

If you just want to send a simple email e.g. without attachment, you can simply use the mailx command to do that.

$ mailx -s "test" abc@gmail.com
This is simple email without attachment
EOT

This will send a send an email with subject as "test" to recipient abc@gmail.com. Once you type this command it will ask you to type the content in the body. Once you are done, you can press the Ctrl + D to end the typing and it will send the email.

Btw, If you are not familiar with Linux operating system and shell itself then Learn Linux in 5 Days and Level Up Your Career on Udemy is a good place, to begin with.

4 examples to Send Email with Attachment from Linux using mailx command


Example 2 - Writing body using echo

In the last example, you need to write the content of the body and then press the Ctrl + D to send the email, but if you already have a message written you can also use echo command along with mailx to send the email directly.

The output of echo can be used as the body as shown below:

$ echo "testing" | mailx -s "test" abc@gmail.com

This time mailx will not wait for your input and will directly send the email with text "texting" in the body.

Btw, if you are not familiar with essential Linux commands and shell built-ins like echo then I suggest you to first go through  Learn Basic Commands in Linux Shell to familiarize yourself with these basics commands.




Example 3 - Email with Attachment from Linux

This is the most popular use of mailx command for me. I always find using this option be it sending a file from Linux host to my windows host or writing scripts which sends email from a Linux machine. Until RHEL 5, my favorite way to send an attachment in the email was by using the uuencode command e.g.

$ gzip -c log.txt | uuencode log.gz | mail -s "log file for `date`" abc@gmail.com


This command will first compress the log.txt and then will send as attachment log.gz with subject "log file for a date" to abc@gmail.com, here date will be replaced by current date because we have used `date`, which will execute the date command and put its output here.

The gzip -c command writes output to standard output while keeping the original files unchanged i.e. not changing it as log.gz, which it does without -c option. If you want to learn more about gzip and other compression and archiving command then check out the  Linux Command Line Basics course on Udemy.  It's available in just $9.99 in Udemy's flash sale.

Email with Attachment from Linux


This command has served me well for a long time but unfortunately, it doesn't work in RHEL 6 hosts. If you try that command on an RHEL 6 hosts, instead of receiving an attachment, you will receive some gibberish in email body with no attachment.

So, how do we solve this problem? Is there any other way to send an email to attachment from RHEL 6 hosts? Well, yes, we'll use the mailx command with -a flag, which is used to attach a file.

Here is the example of a mailx command to send a file as an attachment to RHEL 6 servers:

$ echo "mailx works fine in RHEL 6" | mailx -s "texting" -a log.gz abc@gmail.com

This will send an email with the body as "mailx works fine in RHEL 6" and attachment as log.gz with the subject line as "texting".



Example 4 - Adding a User and CC and BCC

If you have to include other email address or user as CC or BCC while sending reports from Linux then you can use the mailx -c and mailx -b for adding users as shown in the following example:

$ echo "message" | mailx -s "test" -c group@gmail.com -b admin@gmail.com abc@gmail.com

This email will be sent to abc@gmail.com and cc'd to group@gmail.com and BCC to admin@gmail.com

The mailx command has several more options but I didn't need any more other than these. If you want to explore, you can use info mailx command to get more information about mailx. If you want to learn more you can also take Linux Command Line Interface (CLI) Fundamentals course from PluralSight.

How to to Send Email with Attachment from Linux using mailx command

Btw, if you don't like the mailx command then alternatively you can use mutt command. It can also attach a file to the email and can do whatever we have done using mailx in this article.

here is a simple example of using mutt command in Linux:

echo "message body" | mutt -s "subject" -a "file_path" "another_file" abc@gmail.com


You can also leave the echo command to enter message body interactively. Similar to mailx command, -flag allows you to attach files and you can add more than one files as well.

That's all about some of the useful options of mailx command to send emails from Linux. We have seen how to send an email with attachment in both RHEL 5 and RHEL 6 servers as well as examples of interactively typing a message and using echo command to send the mail without waiting for input. Now, you don't need to use tools like WinSCP or FileZilla to first copy your data into Windows machine and then send them as mail, you can directly send the mail from Linux now.


Further Learning
Linux Administration Bootcamp
Linux Command Line Interface (CLI) Fundamentals
Shell Scripting: Discover How to Automate Command Line Tasks


Other Linux Articles and Resources you may like
  • How to setup cron jobs in Linux (Crontab example)
  • 10 example of Networking commands in Unix (nslookup)
  • 5 Example of kill commands in Unix and Linux (example)
  • VI Editor examples and tips for beginners (vi examples)
  • How does nslookup command work in UNIX? (answer)
  • 10 examples of lsof command in Linux? (examples)
  • How to use the netstat command to find which process is listening on a port? (example)
  • Linux find + du + grep example (example)
  • 10 Examples of curl command in Linux (cURL)
  • 10 Examples of chmod command in Linux (chmod)
  • A Practical Guide to Linux Commands, Editors, and Shell Programming (guide)

Thanks for reading this article so far. If you like this article and my explanation of sending email from a Linux machine then please share with your friends and colleagues.

P. S. - If you are looking for some free online courses to start your Linux journey, you should check out my list of Free Linux Courses for Programmers, IT Professionals, and System Administrators.

No comments:

Post a Comment