diff --git a/PVE/VZDump.pm b/PVE/VZDump.pm index d951e79a..a4fa8c18 100644 --- a/PVE/VZDump.pm +++ b/PVE/VZDump.pm @@ -391,91 +391,45 @@ sub sendmail { my $hostname = `hostname -f` || PVE::INotify::nodename(); chomp $hostname; - my $boundary = "----_=_NextPart_001_".int(time).$$; - - my $rcvrarg = ''; - foreach my $r (@$mailto) { - $rcvrarg .= " '$r'"; - } - my $dcconf = PVE::Cluster::cfs_read_file('datacenter.cfg'); - my $mailfrom = $dcconf->{email_from} || "root"; - - open (MAIL,"|sendmail -B 8BITMIME -f $mailfrom $rcvrarg") || - die "unable to open 'sendmail' - $!"; - - my $rcvrtxt = join (', ', @$mailto); - - print MAIL "Content-Type: multipart/alternative;\n"; - print MAIL "\tboundary=\"$boundary\"\n"; - print MAIL "MIME-Version: 1.0\n"; - - print MAIL "FROM: vzdump backup tool <$mailfrom>\n"; - print MAIL "TO: $rcvrtxt\n"; - print MAIL "SUBJECT: vzdump backup status ($hostname) : $stat\n"; - print MAIL "\n"; - print MAIL "This is a multi-part message in MIME format.\n\n"; - print MAIL "--$boundary\n"; - - print MAIL "Content-Type: text/plain;\n"; - print MAIL "\tcharset=\"UTF8\"\n"; - print MAIL "Content-Transfer-Encoding: 8bit\n"; - print MAIL "\n"; - # text part - - my $fill = ' '; # Avoid The Remove Extra Line Breaks Issue (MS Outlook) - - print MAIL sprintf ("${fill}%-10s %-6s %10s %10s %s\n", qw(VMID STATUS TIME SIZE FILENAME)); + my $text = sprintf ("%-10s %-6s %10s %10s %s\n", qw(VMID STATUS TIME SIZE FILENAME)); foreach my $task (@$tasklist) { my $vmid = $task->{vmid}; if ($task->{state} eq 'ok') { - print MAIL sprintf ("${fill}%-10s %-6s %10s %10s %s\n", $vmid, - $task->{state}, + $text .= sprintf ("%-10s %-6s %10s %10s %s\n", $vmid, + $task->{state}, format_time($task->{backuptime}), format_size ($task->{size}), $task->{tarfile}); } else { - print MAIL sprintf ("${fill}%-10s %-6s %10s %8.2fMB %s\n", $vmid, - $task->{state}, + $text .= sprintf ("%-10s %-6s %10s %8.2fMB %s\n", $vmid, + $task->{state}, format_time($task->{backuptime}), 0, '-'); } } - print MAIL "${fill}\n"; - print MAIL "${fill}Detailed backup logs:\n"; - print MAIL "${fill}\n"; - print MAIL "$fill$cmdline\n"; - print MAIL "${fill}\n"; + + $text .= "Detailed backup logs:\n\n"; + $text .= "$cmdline\n\n"; foreach my $task (@$tasklist) { my $vmid = $task->{vmid}; my $log = $task->{tmplog}; if (!$log) { - print MAIL "${fill}$vmid: no log available\n\n"; + $text .= "$vmid: no log available\n\n"; next; } open (TMP, "$log"); - while (my $line = ) { print MAIL encode8bit ("${fill}$vmid: $line"); } + while (my $line = ) { $text .= encode8bit ("$vmid: $line"); } close (TMP); - print MAIL "${fill}\n"; + $text .= "\n"; } - # end text part - print MAIL "\n--$boundary\n"; - - print MAIL "Content-Type: text/html;\n"; - print MAIL "\tcharset=\"UTF8\"\n"; - print MAIL "Content-Transfer-Encoding: 8bit\n"; - print MAIL "\n"; - # html part - - print MAIL "\n"; - - print MAIL "\n"; - - print MAIL "\n"; + my $html = "\n"; + $html .= "
VMIDNAMESTATUSTIMESIZEFILENAME
\n"; + $html .= "\n"; my $ssize = 0; @@ -487,56 +441,54 @@ sub sendmail { $ssize += $task->{size}; - print MAIL sprintf ("\n", + $html .= sprintf ("\n", $vmid, $name, format_time($task->{backuptime}), format_size ($task->{size}), escape_html ($task->{tarfile})); } else { - print MAIL sprintf ("\n", - - $vmid, $name, format_time($task->{backuptime}), + $html .= sprintf ("\n", + $vmid, $name, format_time($task->{backuptime}), escape_html ($task->{msg})); } } - print MAIL sprintf ("", + $html .= sprintf ("", format_time ($totaltime), format_size ($ssize)); - print MAIL "
VMIDNAMESTATUSTIMESIZEFILENAME
%s%sOK%s%s%s
%s%sOK%s%s%s
%s%sFAILED%s%s
%s%sFAILED%s%s
TOTAL%s%s
TOTAL%s%s


\n"; - print MAIL "Detailed backup logs:
\n"; - print MAIL "
\n"; - print MAIL "
\n";
-    print MAIL escape_html($cmdline) . "\n";
-    print MAIL "\n";
+    $html .= "

\n"; + $html .= "Detailed backup logs:

\n"; + $html .= "
\n";
+    $html .= escape_html($cmdline) . "\n\n";
 
     foreach my $task (@$tasklist) {
 	my $vmid = $task->{vmid};
 	my $log = $task->{tmplog};
 	if (!$log) {
-	    print MAIL "$vmid: no log available\n\n";
+	    $html .= "$vmid: no log available\n\n";
 	    next;
 	}
 	open (TMP, "$log");
 	while (my $line = ) {
 	    if ($line =~ m/^\S+\s\d+\s+\d+:\d+:\d+\s+(ERROR|WARN):/) {
-		print MAIL encode8bit ("$vmid: ". 
-				       escape_html ($line) . ""); 
+		$html .= encode8bit ("$vmid: ".
+				       escape_html ($line) . "");
 	    } else {
-		print MAIL encode8bit ("$vmid: " . escape_html ($line)); 
+		$html .= encode8bit ("$vmid: " . escape_html ($line));
 	    }
 	}
 	close (TMP);
-	print MAIL "\n";
+	$html .= "\n";
     }
-    print MAIL "
\n"; - - print MAIL "\n"; - + $html .= "
\n"; # end html part - print MAIL "\n--$boundary--\n"; - close(MAIL); + my $subject = "vzdump backup status ($hostname) : $stat"; + + my $dcconf = PVE::Cluster::cfs_read_file('datacenter.cfg'); + my $mailfrom = $dcconf->{email_from} || "root"; + + PVE::Tools::sendmail($mailto, $subject, $text, $html, $mailfrom, "vzdump backup tool"); }; sub new {