72

I need to send email with html format. I have only linux command line and command "mail".

Currently have used:

echo "To: [email protected]" > /var/www/report.csv
echo "Subject: Subject" >> /var/www/report.csv
echo "Content-Type: text/html; charset=\"us-ascii\"" >> /var/www/report.csv

echo "<html>" >> /var/www/report.csv
mysql -u ***** -p***** -H -e "select * from users LIMIT 20" dev >> /var/www/report.csv
echo "</html>" >> /var/www/report.csv

mail -s "Built notification" [email protected] < /var/www/report.csv

But in my mail-agent i get only plain/text.

alt text

1
  • 9
    Readers of answers to this question beware: there are several different programs called mail, for example heirloom-mailx and bsd-mailx on Debian jessie. If a mail command from an answer here doesn't work for you, you're probably using the wrong mail. Refer to your distribution's package manager to install the correct package, and use the specific name of that binary (e.g. bsd-mailx on Debian) to resolve that issue. More details on this here: heirloom.sourceforge.net/mailx_history.html Commented Oct 18, 2017 at 7:52

11 Answers 11

67

This worked for me:

echo "<b>HTML Message goes here</b>" | mail -s "$(echo -e "This is the subject\nContent-Type: text/html")" [email protected]
Sign up to request clarification or add additional context in comments.

13 Comments

I'd say that's a bug in OSX's implementation of mail, though it'd need to be combined with other bugs to be exploitable. I'm sure there would be a few web scripts around that don't properly check for carriage returns in what they insert into subject lines.
works on AIX 7.1.0.0! Oh, and word to the wise, the backticks don't work (in ksh) but the $( ) do.
Worked on Debian Wheezy
Works on Godaddy and Amazon Linux
Doesn't work in Oracle Linux 7.4. Getting the context as text along with <b> tag.
Hello, please how did you fix it ? Thank you.
|
48

My version of mail does not have --append and it too smart for the echo -e \n-trick (it simply replaces \n with space). It does, however, have -a:

mail -a "Content-type: text/html" -s "Built notification" [email protected] < /var/www/report.html

6 Comments

Works on ubuntu 14.04.1 LTS, mail set to bsd-mailx
I use this way echo `curl -L www.google.es` | mail -a "Content-type: text/html" -s "website content" [email protected] instead of <. For my convenience, i create a /usr/local/bin script to bypass the most of the command. I just use wmail url email
I tried it but SpamAssassin gave me lower score than I got without the -a "Cont...", maybe beacuse I didn't have text as html
I get no such file or directory for content type with mail and mailx
I also get "Content-type: text/html: No such file or directory". Are you sure the "-a" is right ?
|
38

Send email using command Line

This answer is over 11 years old, these days I use python's import ezgmail for a 4 line plug, auth and play solution

Create a file named tmp.html with the following contents:

<b>my bold message</b>

Next, paste the following into the command line (parentheses and all):

(
  echo To: [email protected]
  echo From: [email protected]
  echo "Content-Type: text/html; "
  echo Subject: a logfile
  echo
  cat tmp.html
) | sendmail -t

The mail will be dispatched including a bold message due to the <b> element.

Shell Script

As a script, save the following as email.sh:

ARG_EMAIL_TO="[email protected]"
ARG_EMAIL_FROM="Your Name <[email protected]>"
ARG_EMAIL_SUBJECT="Subject Line"

(
  echo "To: ${ARG_EMAIL_TO}"
  echo "From: ${ARG_EMAIL_FROM}"
  echo "Subject: ${ARG_EMAIL_SUBJECT}"
  echo "Mime-Version: 1.0"
  echo "Content-Type: text/html; charset='utf-8'"
  echo
  cat contents.html
) | sendmail -t

Create a file named contents.html in the same directory as the email.sh script that resembles:

<html><head><title>Subject Line</title></head>
<body>
  <p style='color:red'>HTML Content</p>
</body>
</html>

Run email.sh. When the email arrives, the HTML Content text will appear red.

Related

3 Comments

echo | cat msg-headers - msg-body | sendmail -t (with msg-headers and msg-body as text files containing your headers and body, respectively)
This worked for me but how can we add an attachment when we are using sendmail
@DileepGogula See zedwood.com/article/bash-send-mail-with-an-attachment (linked from the "Related" part above in two clicks)
10

On OS X (10.9.4), cat works, and is easier if your email is already in a file:

cat email_template.html  | mail -s "$(echo -e "Test\nContent-Type: text/html")" [email protected]

Comments

7

The problem is that when redirecting a file into 'mail' like that, it's used for the message body only. Any headers you embed in the file will go into the body instead.

Try:

mail --append="Content-type: text/html" -s "Built notification" [email protected] < /var/www/report.csv

--append lets you add arbitrary headers to the mail, which is where you should specify the content-type and content-disposition. There's no need to embed the To and Subject headers in your file, or specify them with --append, since you're implicitly setting them on the command line already (-s is the subject, and [email protected] automatically becomes the To).

2 Comments

don't have that option on my mail command mail: invalid option -- a Usage: mail [-iInv] [-s subject] [-c cc-addr] [-b bcc-addr] to-addr ... [-- sendmail-options ...] mail [-iInNv] -f [name] mail [-iInNv] [-u user]
@nylund: mail (GNU Mailutils 2.2). this is off ubuntu 12.04, but will be in older versions as well, given this answer's almost 3 years old now.
3

With heirloom-mailx you can change sendmail program to your hook script, replace headers there and then use sendmail.

The script I use (~/bin/sendmail-hook):

#!/bin/bash

sed '1,/^$/{
s,^\(Content-Type: \).*$,\1text/html; charset=utf-8,g
s,^\(Content-Transfer-Encoding: \).*$,\18bit,g
}' | sendmail $@

This script changes the values in the mail header as follows:

  • Content-Type: to text/html; charset=utf-8
  • Content-Transfer-Encoding: to 8bit (not sure if this is really needed).

To send HTML email:

mail -Ssendmail='~/bin/sendmail-hook' \
    -s "Built notification" [email protected] < /var/www/report.csv

4 Comments

For some reason I can't get this to work in a function, but you can indeed use this as a separate executable file. This worked when other suggestions on this page did not.
You can't get this work as a function because mail's process spawned don't have access to functions in your bash script
[Can't figure out how to take this to a chat or PM.] Could I source my mail command? . mail -Ssendmail='~/bin/sendmail-hook' -s "Subject" [email protected] < inputfile
You cannot source it, because it is binary. You should create own bash script with those commands and (if you need that) source it.
2

you should use "append" mode redirection >> instead of >

1 Comment

I think this should have been a comment, not an answer.
2

I was struggling with similar problem (with mail) in one of my git's post_receive hooks and finally I found out, that sendmail actually works better for that kind of things, especially if you know a bit of how e-mails are constructed (and it seems like you know). I know this answer comes very late, but maybe it will be of some use to others too. I made use of heredoc operator and use of the feature, that it expands variables, so it can also run inlined scripts. Just check this out (bash script):

#!/bin/bash
recipients=(
    '[email protected]'
    '[email protected]'
#   '[email protected]'
);
sender='[email protected]';
subject='Oh, who really cares, seriously...';
sendmail -t <<-MAIL
    From: ${sender}
    `for r in "${recipients[@]}"; do echo "To: ${r}"; done;`
    Subject: ${subject}
    Content-Type: text/html; charset=UTF-8

    <html><head><meta charset="UTF-8"/></head>
    <body><p>Ladies and gents, here comes the report!</p>
    <pre>`mysql -u ***** -p***** -H -e "SELECT * FROM users LIMIT 20"`</pre>
    </body></html>
MAIL

Note of backticks in the MAIL part to generate some output and remember, that <<- operator strips only tabs (not spaces) from the beginning of lines, so in that case copy-paste will not work (you need to replace indentation with proper tabs). Or use << operator and make no indentation at all. Hope this will help someone. Of course you can use backticks outside o MAIL part and save the output into some variable, that you can later use in the MAIL part — matter of taste and readability. And I know, #!/bin/bash does not always work on every system.

Comments

2

I found a really easy solution: add to the mail command the modifier -aContent-Type:text/html.

In your case would be:

mail -aContent-Type:text/html -s "Built notification" [email protected] < /var/www/report.csv

5 Comments

But I get no such file or directory when am using this
@eightStacker: is there a file called report.csv in your /var/www directory? If not you should replace that with the file you want to send. Also [email protected] is an example, you have to replace that with the actual destinatary of your message
@Zafar same thing I told eightStacker :)
-a option is for "attachment"... I'm working with version "12.5 7/5/10" on a CentOS 7.4 server; in other comments they talk about --append, and this is not even an option ... why so many (apparently) mail implementations?
See also stackoverflow.com/a/48588035/874188 which discusses the many mail implementations and how to know which one you have.
1

Very old question, however it ranked high when I googled a question about this.

Find the answer here:

Sending HTML mail using a shell script

Comments

0

Try with :

echo "To: [email protected]" > /var/www/report.csv
echo "Subject: Subject" >> /var/www/report.csv
echo "MIME-Version: 1.0" >> /var/www/report.csv
echo "Content-Type: text/html; charset=\"us-ascii\"" >> /var/www/report.csv
echo "Content-Disposition: inline" >> /var/www/report.csv

echo "<html>" >> /var/www/report.csv
mysql -u ***** -p***** -H -e "select * from users LIMIT 20" dev >> /var/www/report.csv
echo "</html>" >> /var/www/report.csv

mail -s "Built notification" [email protected] < /var/www/report.csv

2 Comments

This does not work. $ lsb_release -a Distributor ID: Ubuntu Description: Ubuntu 10.04.4 LTS Release: 10.04 Codename: lucid
@Simone, this is not working perfectly because of order of MIME-Version and Content-Tye. You need to put this information prior to Subject to work for most of the unix/linux flavor.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.