Ubuntu. Sending emails with embedded images - email

I have Ubuntu server(16.04) + Nagios, also I have created a script that makes a screenshot(Nagios status) every night and sends this screenshot to two recipients. But occurs problem, I receive mail with images(embed in a body, not attachment) - is OK, but my friend receives the same mail with broken images(blank files in attachment).
Any suggestion, how to solve this problem?
Script code:
#!/bin/bash
cat <<EOT | /usr/sbin/sendmail -t
TO: #email1, #email2
SUBJECT: Report: Nagios Event Log $(date +%F --date=yesterday)
MIME-Version: 1.0
Content-Type: multipart/related;boundary="XYZ"
--XYZ
Content-Type: text/html; charset=ISO-8859-15
Content-Transfer-Encoding: 7bit
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-15">
</head>
<body bgcolor="#ffffff" text="#000000">
Hello Team,<br>Daily Nagios report of $(date +%F --date=yesterday) is generated.
<img src="cid:part1.06090408.01060107" alt="">
<br>Best Regards, Nagios Admin
</body>
</html>
--XYZ
Content-Type: image/png;name="Nagios-EventLog-`date +%F --date="yesterday"`.png"
Content-Transfer-Encoding: base64
Content-ID: <part1.06090408.01060107>
Content-Disposition: inline; filename="Nagios-EventLog-`date +%F --date="yesterday"`.png"
$(base64 /some_path/NagiosReport/Nagios-EventLog-`date +%F --date="yesterday"`.png)
--XYZ--
EOT

You lack a newline between the MIME headers and the base64 image data.
Running base64 in a command substitution inside a here document will probably produce overlong lines in the output. Try (rough pseudocode)
( cat <<EOF
From: blah blah ...
Subject: blah blah ...
:
--XYZ
Content-description: image/png; name=etc etc
EOF
base64 file
printf "\n--XYZ--\n" ) | sendmail -oi -t
(I'm assuming you did PATH=/usr/sbin:$PATH near the top of the script so you don't have to hard-code the path to sendmail.)
If improved knowledge of MIME isn't a personal development goal, probably use a program which knows how to do this properly. Many people use mutt to send mail on their behalf without having to worry about how exactly to do it right.
As a stylistic aside, running $(date +%F) multiple times seems clunky. Just run it once and capture the output in a variable. (In the pathological case, the script runs around midnight, and you get different dates in different parts of the message!)

Related

in Perl sendmail, why is my Image attachment becoming corrupt, sometimes?

I intend to rewrite this in Net::SMTP but right now i need a backup subroutine that doesn't "use" much, so;
The code works and sends emails, when received in most email service (Godaddy,ProtonMail) i get the full image, but in another (34SP) email service i only get the top half of the image.
my $msg = "From: John <$sender>
To: bob <$recipient>
Subject: $subject
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=\"BOUNDARY\"
--BOUNDARY
Content-Type: multipart/alternative; boundary=\"MSGBOUNDARY\"
--MSGBOUNDARY
Content-Type: text/html; charset=iso-8859-1
Content-Disposition: inline
<html><body>Hello, World<br><img src=\"cid:hello\"></body></html>
--MSGBOUNDARY
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Hello, World,[you're missing an image here]
--MSGBOUNDARY--
--BOUNDARY
Content-Type: image/jpeg
Content-Disposition: inline; filename=\"hello.jpg\"
Content-Transfer-Encoding: base64
Content-Id: <hello>
$jpgg
--BOUNDARY--";
open MAIL, "| $sendmail -t"
or die "Couldn't pipe to $sendmail";
print MAIL $msg;
close MAIL;
I've tested the 34SP email service by sending this first attachment from another location and it receives it fine, so it must be a problem with the code. If anyone can see something I've done wrong, I'd appreciate it.
EDIT(1); as per Polar Bears suggestion I've edited the code for easier reading, I've tested this version and am still getting the same issue.
Just a suggestion to change the code to following form
my $msg = "
From: John <$sender>
To: bob <$recipient>
Subject: $subject
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=\"BOUNDARY\"
--BOUNDARY
Content-Type: multipart/alternative; boundary=\"MSGBOUNDARY\"
--MSGBOUNDARY
Content-Type: text/html; charset=iso-8859-1
Content-Disposition: inline
<html><body>Hello, World<br><img src=\"cid:hello\"></body></html>
--MSGBOUNDARY
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Hello, World,[you're missing an image here]
--MSGBOUNDARY--
--BOUNDARY
Content-Type: image/jpeg
Content-Disposition: inline; filename=\"hello.jpg\"
Content-Transfer-Encoding: base64
Content-Id: <hello>
$jpgg
--BOUNDARY--
";
open MAIL, "| $sendmail -t"
or die "Couldn't pipe to $sendmail";
print MAIL $msg;
close MAIL;

sendmail using "<" fails but using "|" works, why?

Newbie question: I have a simple script that builds a text file with the sendmail headers, required blank line and then text body. When I run:
sendmail -t < email.txt
it fails with a "No recipient addresses found in header" error.
However, when I run:
cat email.txt | sendmail -t
it works and the recipients receive my email.
I'm just wondering why it is behaving this way.
I'm on an AIX 6100-09-12-1846 (oslevel -s) box.
I just tested on a Linux box and it worked both ways, so I can only assume that AIX handles it differently, but I don't know why.
Update:
The following contents are in "email.txt"
Subject: Test Email
To: foo#bar.com
From: Mail.Relay#bar.com
MIME-Version: 1.0
Content-Type: text/html
<HTML>
<HEAD>
<META http-equiv=Content-Type content="text/html; charset=windows-1252">
</HEAD>
<BODY lang=EN-US link=blue vlink=purple>
<FONT SIZE=8>
This is a test email.<BR/>
</FONT>
</BODY>
</HTML>
But only when using "|" into sendmail does it work, not when redirected using "<". I'm confused.
Any ideas?
Thanks,
racer

Email Attachments w/ base64 Encoding on Rhat

I am migrating from an old HP-UX box to a new Rhat box. Our ERP emailer program saves the email (including MIME headers) as "Email_msg_port.html" and the attachment in the user's home dir. No problem so far.
The emailer then issues the following command:
(cat Email_msg_8.html ; base64 /home/johnsmith/APMS9010.txt) | sendmail -t
The email itself is fine, but the attachment is always empty (though it says it is about 300 bytes).
My MIME header looks like this:
MIME-Version: 1.1
From: myEmail#myCompany.com
To: myEmail#myCompany.com
Subject: APMS9010.1 - Download Top Vendor Purchase - LIVE.DATA
Content-Type: multipart/mixed; boundary="_boundarystring"
This is a multi-part message in MIME format.
--_boundarystring
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: binary
Content-Disposition: inline
Content-Base: "http://myCompany.com/";
I have tried Content-Transfer-Encoding: binary (and 7bit)
Is my MIME stuff wrong, the base64 command wrong, both, or something else?
Thanks

How to embed HTML into an email

I am working on a remote server I want to pipe some HTML context to be displayed into an email. I have been using it as follows
| mail -s "subject" will#test.com
However when I get the email in my inbox I receive the raw HTML
?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- This file was created with the aha Ansi HTML Adapter. http://ziz.delphigl.com/tool_aha.php -->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="application/xml+xhtml; charset=UTF-8" />
<title>stdin</title>
</head>
<body>
How do I get an email to display the HTML commands as opposed to the raw format.
Cheers
You need to add MIME headers to your email to declare that body is not text/plain. The most portable way to to generate raw email message yourself and feed it to sendmail program ("sendmail by sendmail/postfix/exim/...)
#!/bin/sh
TO=will#test.com
# feed "here document" and STDIN to sendmail
(cat <<END; cat -) | /usr/sbin/sendmail -i $TO
Subject: SUBJECT
To: $TO
MIME-Version: 1.0
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: 8bit
END

Mailgraph.cgi script error

I have installed rrdtool 1.4.7 and on testing with http://localhost/mailgraph.cgi.I get the error below:
Premature end of script headers: mailgraph.cgi, referer: http://localhost/mailgraph.cgi.
How can i get over this.Thanx in advance
mailgraph.cgi does not send out HTML headers correctly.
Check the apache error/access log for details.
You could check the script itself from commadn line.
./mailgraph.cgi
It should output soething like this:
Content-type: text/html
<HTML>,<DOCTYPE (or some other HTML coode)
Check this link: http://oreilly.com/openbook/cgi/ch12_01.html
regards,