[pve-devel] [RFC manager] vzdump: use sendmail from tools

Thomas Lamprecht t.lamprecht at proxmox.com
Mon Apr 4 16:23:09 CEST 2016


use the factored out sendmail from the PVE::Tools package

Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
---
 PVE/VZDump.pm | 114 +++++++++++++++++-----------------------------------------
 1 file changed, 33 insertions(+), 81 deletions(-)

diff --git a/PVE/VZDump.pm b/PVE/VZDump.pm
index d951e79..a4fa8c1 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 = <TMP>) { print MAIL encode8bit ("${fill}$vmid: $line"); }
+	while (my $line = <TMP>) { $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 "<html><body>\n";
-
-    print MAIL "<table border=1 cellpadding=3>\n";
-
-    print MAIL "<tr><td>VMID<td>NAME<td>STATUS<td>TIME<td>SIZE<td>FILENAME</tr>\n";
+    my $html = "<html><body>\n";
+    $html .= "<table border=1 cellpadding=3>\n";
+    $html .= "<tr><td>VMID<td>NAME<td>STATUS<td>TIME<td>SIZE<td>FILENAME</tr>\n";
 
     my $ssize = 0;
 
@@ -487,56 +441,54 @@ sub sendmail {
 
 	    $ssize += $task->{size};
 
-	    print MAIL sprintf ("<tr><td>%s<td>%s<td>OK<td>%s<td align=right>%s<td>%s</tr>\n", 
+	    $html .= sprintf ("<tr><td>%s<td>%s<td>OK<td>%s<td align=right>%s<td>%s</tr>\n",
 				$vmid, $name,
 				format_time($task->{backuptime}),
 				format_size ($task->{size}),
 				escape_html ($task->{tarfile}));
 	} else {
-	    print MAIL sprintf ("<tr><td>%s<td>%s<td><font color=red>FAILED<td>%s<td colspan=2>%s</tr>\n",
- 
-				$vmid, $name, format_time($task->{backuptime}), 
+	    $html .= sprintf ("<tr><td>%s<td>%s<td><font color=red>FAILED<td>%s<td colspan=2>%s</tr>\n",
+				$vmid, $name, format_time($task->{backuptime}),
 				escape_html ($task->{msg}));
 	}
     }
 
-    print MAIL sprintf ("<tr><td align=left colspan=3>TOTAL<td>%s<td>%s<td></tr>",
+    $html .= sprintf ("<tr><td align=left colspan=3>TOTAL<td>%s<td>%s<td></tr>",
  format_time ($totaltime), format_size ($ssize));
 
-    print MAIL "</table><br><br>\n";
-    print MAIL "Detailed backup logs:<br>\n";
-    print MAIL "<br>\n";
-    print MAIL "<pre>\n";
-    print MAIL escape_html($cmdline) . "\n";
-    print MAIL "\n";
+    $html .= "</table><br><br>\n";
+    $html .= "Detailed backup logs:<br /><br />\n";
+    $html .= "<pre>\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 = <TMP>) {
 	    if ($line =~ m/^\S+\s\d+\s+\d+:\d+:\d+\s+(ERROR|WARN):/) {
-		print MAIL encode8bit ("$vmid: <font color=red>". 
-				       escape_html ($line) . "</font>"); 
+		$html .= encode8bit ("$vmid: <font color=red>".
+				       escape_html ($line) . "</font>");
 	    } else {
-		print MAIL encode8bit ("$vmid: " . escape_html ($line)); 
+		$html .= encode8bit ("$vmid: " . escape_html ($line));
 	    }
 	}
 	close (TMP);
-	print MAIL "\n";
+	$html .= "\n";
     }
-    print MAIL "</pre>\n";
+    $html .= "</pre></body></html>\n";
+    # end html part
 
-    print MAIL "</body></html>\n";
+    my $subject = "vzdump backup status ($hostname) : $stat";
 
-    # end html part
-    print MAIL "\n--$boundary--\n";
+    my $dcconf = PVE::Cluster::cfs_read_file('datacenter.cfg');
+    my $mailfrom = $dcconf->{email_from} || "root";
 
-    close(MAIL);
+    PVE::Tools::sendmail($mailto, $subject, $text, $html, $mailfrom, "vzdump backup tool");
 };
 
 sub new {
-- 
2.1.4




More information about the pve-devel mailing list