Include Images in HTML email send from Unix Box - html

I have a script like this which sends html emails. I am trying to include images into my html emails. Is this possible ? File has to use this function. I'm not looking for some quick one liner instead of my function because of file manipulations I have done in my script. When I send out emails I back a [X] instead of my image.
Email function of my script.
#!/bin/bash
Email()
{
export MAILTO="ADC#aol.com"
export CONTENT="file"
export SUBJECT="Report"
(
echo "Subject: $SUBJECT"
echo "To : $MAILTO"
echo "MIME-Version: 1.0"
echo "Content-Type: text/html"
echo "Content-Disposition: inline"
cat "$CONTENT"
) | /usr/sbin/sendmail $MAILTO
}
Email
File I am sending "file"
<html>
<body>
<img src="/home/admin/Afriendlycow.png">
</body>
</html>
I attempt to try just the file name instead of the path such as Afriendlycow.png but it does not work also.

You are not attaching any images. A proper HTML email with images is a multipart/related containing one text/html part and one or more image/* parts. They should have a Content-Id: header with a unique identifier as its value; the HTML refers to them using <img src="cid:identifier">.

Related

Send email from Linux server as html - Content type and html tags also visible in email

I am trying to send an email as html.
#!/bin/sh
#MAIL_LIST="gangadhar.n#xx.com"
MAIL_SENDER=foo
fnSendEmail(){
echo ${BODY}| mail -r $MAIL_SENDER -s "$(echo "$MAIL_SUBJECT\nContent-Type: text/html")" "$MAIL_LIST"
}
MAIL_SUBJECT="Test email"
BODY="<html><body><div><h2>Hi All</h2><hr></div></body></html>";
fnSendEmail $BODY $MAIL_SENDER $MAIL_SUBJECT $MAIL_LIST
I am receiving email but html tags and Content type also visible in mails as below.
Subject as
"Test email\nContent-Type: text/html"
Email body as:
<html><body><div><h2>Hi All</h2><hr></div></body></html> NOTICE TO RECIPIENT: If you are not the intended recipient of this e-mail, you are prohibited from sharing, copying, or otherwise using or disclosing its contents. If you have received this e-mail in error, please notify the sender immediately by reply e-mail and permanently delete this e-mail and any attachments without reading, forwarding or saving them. Thank you.
Thank you in advance
I have done it using sendmail
#MAIL_LIST1="Gangadhar.N#xx.com"
MAIL_SENDER=dap
fnSendEmail(){
(
echo To: $MAIL_LIST
echo Cc: $MAIL_LIST
echo From: dap53
echo "Content-Type: text/html; "
echo Subject: $MAIL_SUBJECT
echo
echo $BODY
) | /usr/sbin/sendmail -t
}
MAIL_SUBJECT="Test email"
BODY="<html><body>Sample</body></html>"
fnSendEmail $BODY $MAIL_SENDER $MAIL_SUBJECT $MAIL_LIST
Use option -a to append content-type header, -s is for subject, change your fnSendEmail to following it should work
fnSendEmail(){
echo ${BODY}| mail -r $MAIL_SENDER -a "Content-type: text/html" -s "$(echo "$MAIL_SUBJECT\n")" "$MAIL_LIST"
}

need to send html mail with attachment in unix

I am facing problems in sending html mail with attachemnt.I will able to send mail with
attachment (plain text ) using mailx -s and uuencode command and also html mail
without attachment using sendmail option.
However I am not able to send html mail along with attachment.
Either one of it is working (html mail or attachment)
Below are the different ways I have tried. Could you please help me in resolving the same.
1) Failed because of illegal option base64
#!/usr/bin/ksh
export MAILTO="abc#abc.com"
export SUBJECT="Mail Subject"
export BODY="card_summary_mail.html"
export ATTACH="query5_result.csv"
(
echo "To: $MAILTO"
echo "Subject: $SUBJECT"
echo "MIME-Version: 1.0"
echo 'Content-Type: multipart/mixed; boundary="-q1w2e3r4t5"'
echo
echo '---q1w2e3r4t5'
echo "Content-Type: text/html"
echo "Content-Disposition: inline"
cat $BODY
echo '---q1w2e3r4t5'
echo 'Content-Type: application; name="'$(basename $ATTACH)'"'
echo "Content-Transfer-Encoding: base64"
echo 'Content-Disposition: attachment; filename="'$(basename $ATTACH)'"'
uuencode --base64 $ATTACH $(basename $ATTACH)
echo '---q1w2e3r4t5--'
) | /usr/lib/sendmail $MAILTO
2)
cib-sokay2{u384283}323:cat test_html2.sh
{
uuencode query5_result.csv query5_result.csv > attachment.txt
cat mail.html attachment.txt > attachment2.html
} | /usr/lib/sendmail -t abc#abc.com
-----------------------------------------------
3)
cib-sokay2{u384283}324:cat test_html3.sh
export MAILTO="abc#abc.com"
export CONTENT="mail.html"
export CONTENT_F="attachment.txt"
export SUBJECT="TEST EMAIL: TESTING HTML"
BOUNDARY='=== This is the boundary between parts of the message. ==='
{
print - "From: Someone <$MAILFROM>"
print - "To: Someone <${MAILTO}>"
print - 'Subject:' $SUBJECT
print - 'MIME-Version: 1.0'
print - 'Content-Type: MULTIPART/MIXED; '
print - ' BOUNDARY='\"$BOUNDARY\"
print -
print - ' This message is in MIME format. But if you can see this,'
print - " you aren't using a MIME aware mail program. You shouldn't "
print - ' have too many problems because this message is entirely in'
print - ' ASCII and is designed to be somewhat readable with old '
print - ' mail software.'
print -
print - "--${BOUNDARY}"
print - 'Content-Type: TEXT/PLAIN; charset=US-ASCII'
print -
cat $CONTENT
print -
print -
print - "--${BOUNDARY}"
print - 'Content-Type: TEXT/PLAIN; charset=US-ASCII; name='${CONTENT}
print - 'Content-Disposition: attachment; filename='${CONTENT_F}
print -
cat ${CONTENT}
print -
print - "--${BOUNDARY}--"
} | /usr/lib/sendmail ${MAILTO}
------------------------------------------------------------
cib-sokay2{u384283}326:cat test_html4.sh
#!/usr/bin/ksh
export MAILTO="abc#abc.com"
export CONTENT="mail.html"
export SUBJECT="subject of email"
(
echo "Subject: $SUBJECT"
# This appears in the mail body
cat $CONTENT
# The next line creates the attachment with a suitable extension to read
# with Windows notepad
unix2dos "attachment.txt" | uuencode myattach.txt
echo "."
) | /usr/lib/sendmail $MAILTO
-------------------------------------
Your first attempt is fairly close. Your second attempt seems to write something to a file which is then abandoned, and you feed empty input to sendmail. Your third attempt has a grave error in the MIME boundary and some peculiarities (why do you put the same content twice?), but is basically fairly similar to the first. Your fourth attempt looks fairly reasonable but old-fashioned, but could have failed because of false assumptions about how things need to be formatted (for example, if $CONTENT does not start with an empty line, your contents would go smack dab in the message headers, creating illegal headers and probably being rejected).
Assuming you have a command base64 on your system (it is included in GNU Coreutils since 6.0, almost ten years back), just replace the uuencode call with that, and fix the various minor formatting errors. Here is a refactored script which hopefully catches most of them.
#!/bin/sh
# No need to export anything, we are not passing these to child processes
MAILTO="abc#abc.com"
SUBJECT="Mail Subject"
BODY="card_summary_mail.html"
ATTACH="query5_result.csv"
( cat <<____HERE
To: $MAILTO
Subject: $SUBJECT
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="-q1w2e3r4t5"
... You could put a MIME preamble here but nobody ever reads it ...
---q1w2e3r4t5
Content-Type: text/html
Content-Disposition: inline
X-Notice: you need an empty line before the body here:
____HERE
cat "$BODY"
# also notice empty line at beginning of next snippet
cat <<____THERE
---q1w2e3r4t5
X-Notice: just "application" is incompletely specified
Content-Type: application/octet-stream; name="$(basename "$ATTACH")"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="$(basename "$ATTACH")"
X-Notice: another empty line
____THERE
base64 "$ATTACH"
echo '---q1w2e3r4t5--'
) | /usr/lib/sendmail "$MAILTO"
However, assembling your own MIME structure gets tired really fast -- I would recommend looking for a command-line MUA with proper attachment support (mutt is popular; some modern mail/mailx clones have similar facilities, but it's not standard).
Also, there is nothing ksh-specific here, so I changed the shebang.
Your first attempt is almost correct. Just replace --base64 by -m as shown below:
#!/usr/bin/ksh
export MAILTO="abc#abc.com"
export SUBJECT="Mail Subject"
export BODY="card_summary_mail.html"
export ATTACH="query5_result.csv"
(
echo "To: $MAILTO"
echo "Subject: $SUBJECT"
echo "MIME-Version: 1.0"
echo 'Content-Type: multipart/mixed; boundary="-q1w2e3r4t5"'
echo
echo '---q1w2e3r4t5'
echo "Content-Type: text/html"
echo "Content-Disposition: inline"
cat "$BODY"
echo '---q1w2e3r4t5'
echo 'Content-Type: application; name="'$(basename "$ATTACH")'"'
echo "Content-Transfer-Encoding: base64"
echo 'Content-Disposition: attachment; filename="'$(basename "$ATTACH")'"'
uuencode -m "$ATTACH" "$(basename "$ATTACH")"
echo '---q1w2e3r4t5--'
) | /usr/lib/sendmail $MAILTO

Generating customized HTML text with fields/placeholders at several places in body

I am trying to send out 100 emails with HTML text body as follows :
Hello XYZ, I went to your Company X in PlaceY yesterday and was
impressed. I want to propose to you ProductZ. XYZ would be benefited by Productz
Subheading in Bold Are you interested?
Thanks
I want a tool where I can input XYZ, X, PlaceY and ProductZ just once and it fill it everywhere instead of having me manually edit the whole thing, and gives me an HTML content I can copy paste to my email client (Thunderbird)
Any advice on such a tool/or process
Thanks
using php is very easy
only need to add a PHP tags to open before the code and after de code to close it , i give you a function that can do what you want to do
/* " <?PHP" <- to open the tag, and, "?>" <- to close the tag */
<?PHP function sendemail($XYZ, $X, $PlaceY, $ProductZ, $emailto)
{
$subject = "your subject here";
$body = "<html><body>Hello $XYZ, I went to your Company $X in $PlaceY yesterday and was impressed. I want to propose to you $ProductZ. $XYZ would be benefited by $Productz <br><br><b>Subheading in Bold<b><br> Are you interested?<br><br>Thanks</body></html>";
$headers = "From: fromemail#yourdomain.com \r\n" ;
$headers .= 'Content-Type: text/html; charset=ISO-8859-1' . "\r\n";
"X-Mailer: php";
if (mail($emailto, $subject, $body, $headers))
{
return 1;
}
} ?>

Send email HTML formatted with CGI - Perl

I'm trying to send an email with HTML content, but it doesn't send formatted.
This is my code,
print OUT "To: $email\n";
print OUT "From: $pedidos\n";
print OUT "CC: $pedidos\n";
print OUT "BCC: $tecnico\n";
print OUT "Subject: $subject\n";
print OUT "Content-type: text/html; charset=iso-8859-1\n\n";
print OUT "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0 Transitional//EN'>";
print OUT "<html><head><title>Title</title></head>";
(...more html...)
Any idea?
Thanks!
Well, for one thing, you left out
print OUT "MIME-Version: 1.0\n";
without which your Content-type header doesn't mean anything. I'm assuming that content going to OUT is correctly being emailed.

How can I send an HTML email with Perl?

I am trying to send an HTML email using Perl.
open(MAIL,"|/usr/sbin/sendmail -t");
## Mail Header
print MAIL "To: $to\n";
print MAIL "From: $from\n";
print MAIL "Subject: $subject\n\n";
## Mail Body
print MAIL "Content-Type: text/html; charset=ISO-8859-1\n\n"
. "<html><head></head><body>#emailBody";
close(MAIL)
Is that the correct way of doing it? It is not working for some reason. Thanks for your help.
Start with Email::Sender::Simple or Email::Sender.
There is a quickstart guide in CPAN, and Ricardo wrote a good use-me in his 2009 advent calendar
From the quickstart guide:
use strict;
use Email::Sender::Simple qw(sendmail);
use Email::Simple;
use Email::Simple::Creator;
my $email = Email::Simple->create(
header => [
To => '"Xavier Q. Ample" <x.ample#example.com>',
From => '"Bob Fishman" <orz#example.mil>',
Subject => "don't forget to *enjoy the sauce*",
'Content-Type' => 'text/html',
],
body => "<p>This message is short, but at least it's cheap.</p>",
);
sendmail($email);
The content type should be part of the mail header. Right now it's part of the mail body. The header is separated from the body by a double newline. So, removing the second newline after the subject header should fix the problem of content type not being correctly interpreted.
You should not really talk to sendmail directly via a pipe. Instead use a proper CPAN module.
Email::Sender is an example.
Mail::Sender has a specific guide on sending HTML messages
If you are just generating spewy emails and you don't need massive robustness or tweaking, you could always just take the shortcut way...
use Email::Stuff;
my $html = <<'END_HTML';
<html>
...
</html>
END_HTML
Email::Stuff->to('"Xavier Q. Ample" <x.ample#example.com>')
->from('"Bob Fishman" <orz#example.mil>')
->subject("Don't forget to *enjoy the sauce*")
->html_body($body)
->send;
Using html tag "pre" will be a simple way to send the script
output in HTML email.
open(MAIL, "|/usr/sbin/sendmail -t");
print MAIL "To: $EMAIL\n";
print MAIL "From: $FROM\n";
print MAIL "Subject: $SUBJECT";
print MAIL "Content-Type: text/html; charset=ISO-8859-1\n\n";
print MAIL < pre >\n$mailoutput< /pre >\n;
close(MAIL);
That will allow you to do all the formating in your script and will
get the same output in email as on screen. [ as you know make sure
no space before and after "pre" ]
I had a problem when sending a MIME multipart message from Perl using sendmail.
After a couple several hours of frustration I found that the entire message
needed to be in a variable with at single statement to send the message
to sendmail. So for example, if your message is contained completely in
a variable called $email_msg, sending the message through sendmail would look
like:
$mailprog = '/usr/sbin/sendmail';
open(MAIL,"|$mailprog -t");
print MAIL $email_msg;
close MAIL;
This works, while using many "print MAIL "message contents"" does not
seem to send a mail message that some mail readers can handle as expected.
This is using Perl 5.8.8 on a CentOS server.
You can use Email::MIME
my $message = Email::MIME->create(
header_str => [
From => 'no-reply#example.com',
To => $address,
Subject => encode_mimewords($subject,
Charset => 'utf-8', Encoding => 'B'),
'Content-Type' => 'text/html',
],
attributes => {
encoding => 'base64',
charset => 'UTF-8',
},
body_str => $message_body,
);
sendmail($message);