diff --git a/Bugzilla/Mailer.pm b/Bugzilla/Mailer.pm index 7ae81299fde2aee4342a37b2401fd52a0b3aab0f..2d29dd8060bd6f4657b1b0bc6395456e700e0c35 100644 --- a/Bugzilla/Mailer.pm +++ b/Bugzilla/Mailer.pm @@ -12,13 +12,13 @@ use strict; use warnings; use parent qw(Exporter); -@Bugzilla::Mailer::EXPORT = qw(MessageToMTA build_thread_marker); - +@Bugzilla::Mailer::EXPORT = qw(MessageToMTA build_thread_marker generate_email); use Bugzilla::Constants; use Bugzilla::Error; use Bugzilla::Hook; use Bugzilla::MIME; use Bugzilla::Util; +use Bugzilla::User; use Date::Format qw(time2str); @@ -161,6 +161,67 @@ sub send_staged_mail { } } +sub generate_email { + my ($vars, $templates) = @_; + my ($lang, $email_format, $msg_text, $msg_html, $msg_header); + state $use_utf8 = Bugzilla->params->{'utf8'}; + + if ($vars->{to_user}) { + $lang = $vars->{to_user}->setting('lang'); + $email_format = $vars->{to_user}->setting('email_format'); + } else { + # If there are users in the CC list who don't have an account, + # use the default language for email notifications. + $lang = Bugzilla::User->new()->setting('lang'); + # However we cannot fall back to the default email_format, since + # it may be HTML, and many of the includes used in the HTML + # template require a valid user object. Instead we fall back to + # the plaintext template. + $email_format = 'text_only'; + } + + my $template = Bugzilla->template_inner($lang); + + $template->process($templates->{header}, $vars, \$msg_header) + || ThrowTemplateError($template->error()); + $template->process($templates->{text}, $vars, \$msg_text) + || ThrowTemplateError($template->error()); + + my @parts = ( + Bugzilla::MIME->create( + attributes => { + content_type => 'text/plain', + charset => $use_utf8 ? 'UTF-8' : 'iso-8859-1', + encoding => 'quoted-printable', + }, + body_str => $msg_text, + ) + ); + if ($templates->{html} && $email_format eq 'html') { + $template->process($templates->{html}, $vars, \$msg_html) + || ThrowTemplateError($template->error()); + push @parts, Bugzilla::MIME->create( + attributes => { + content_type => 'text/html', + charset => $use_utf8 ? 'UTF-8' : 'iso-8859-1', + encoding => 'quoted-printable', + }, + body_str => $msg_html, + ); + } + + my $email = Bugzilla::MIME->new($msg_header); + if (scalar(@parts) == 1) { + $email->content_type_set($parts[0]->content_type); + } else { + $email->content_type_set('multipart/alternative'); + # Some mail clients need same encoding for each part, even empty ones. + $email->charset_set('UTF-8') if $use_utf8; + } + $email->parts_set(\@parts); + return $email; +} + 1; __END__ @@ -173,6 +234,10 @@ Bugzilla::Mailer - Provides methods for sending email =over +=item C + +Generates a multi-part email message, using the supplied list of templates. + =item C Sends the passed message to the mail transfer agent. diff --git a/Bugzilla/Product.pm b/Bugzilla/Product.pm index 30ebc7c6cd564080589ad04db4aedcb59d63290a..0c0cb458d554b2def12164e35d848d8a4c9583de 100644 --- a/Bugzilla/Product.pm +++ b/Bugzilla/Product.pm @@ -22,7 +22,6 @@ use Bugzilla::Milestone; use Bugzilla::Field; use Bugzilla::Status; use Bugzilla::Install::Requirements; -use Bugzilla::Mailer; use Bugzilla::Series; use Bugzilla::Hook; use Bugzilla::FlagType; diff --git a/whine.pl b/whine.pl index 39c9aeed2e766824a900459c4364c6831ba82744..c81ca2022db3d8e6b32dfe1464569b17f6e75374 100755 --- a/whine.pl +++ b/whine.pl @@ -13,14 +13,13 @@ use 5.10.1; use strict; use warnings; - use lib qw(. lib); use Bugzilla; use Bugzilla::Constants; use Bugzilla::Search; use Bugzilla::User; -use Bugzilla::Mailer; +use Bugzilla::Mailer qw(MessageToMTA generate_email); use Bugzilla::Util; use Bugzilla::Group;