X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2FMisc.pm;h=bf286c0773d26569eebe4032296b83f3b1a7c4ae;hb=dad604abef4fbebc421e753ad5a141879faf67b9;hp=7a6a3b5b1560a76edbaa24d739635b7d122b2b2a;hpb=f163fa1c9f616fbbb5413e6fad09bd08957b0c3a;p=freeside.git
diff --git a/FS/FS/Misc.pm b/FS/FS/Misc.pm
index 7a6a3b5b1..bf286c077 100644
--- a/FS/FS/Misc.pm
+++ b/FS/FS/Misc.pm
@@ -12,7 +12,7 @@ use IPC::Run3; # for do_print... should just use IPC::Run i guess
#instead
@ISA = qw( Exporter );
-@EXPORT_OK = qw( send_email send_fax
+@EXPORT_OK = qw( generate_email send_email send_fax
states_hash counties state_label
card_types
generate_ps generate_pdf do_print
@@ -40,29 +40,173 @@ but are collected here to elimiate code duplication.
=over 4
+=item generate_email OPTION => VALUE ...
+
+Options:
+
+=item from
+
+Sender address, required
+
+=item to
+
+Recipient address, required
+
+=item subject
+
+email subject, required
+
+=item html_body
+
+Email body (HTML alternative). Arrayref of lines, or scalar.
+
+Will be placed inside an HTML
tag.
+
+=item text_body
+
+Email body (Text alternative). Arrayref of lines, or scalar.
+
+=back
+
+Returns an argument list to be passsed to L.
+
+=cut
+
+#false laziness w/FS::cust_bill::generate_email
+
+use MIME::Entity;
+use HTML::Entities;
+
+sub generate_email {
+ my %args = @_;
+
+ my $me = '[FS::Misc::generate_email]';
+
+ my %return = (
+ 'from' => $args{'from'},
+ 'to' => $args{'to'},
+ 'subject' => $args{'subject'},
+ );
+
+ #if (ref($args{'to'}) eq 'ARRAY') {
+ # $return{'to'} = $args{'to'};
+ #} else {
+ # $return{'to'} = [ grep { $_ !~ /^(POST|FAX)$/ }
+ # $self->cust_main->invoicing_list
+ # ];
+ #}
+
+ warn "$me creating HTML/text multipart message"
+ if $DEBUG;
+
+ $return{'nobody'} = 1;
+
+ my $alternative = build MIME::Entity
+ 'Type' => 'multipart/alternative',
+ 'Encoding' => '7bit',
+ 'Disposition' => 'inline'
+ ;
+
+ my $data;
+ if ( ref($args{'text_body'}) eq 'ARRAY' ) {
+ $data = $args{'text_body'};
+ } else {
+ $data = [ split(/\n/, $args{'text_body'}) ];
+ }
+
+ $alternative->attach(
+ 'Type' => 'text/plain',
+ #'Encoding' => 'quoted-printable',
+ 'Encoding' => '7bit',
+ 'Data' => $data,
+ 'Disposition' => 'inline',
+ );
+
+ my @html_data;
+ if ( ref($args{'html_body'}) eq 'ARRAY' ) {
+ @html_data = @{ $args{'html_body'} };
+ } else {
+ @html_data = split(/\n/, $args{'html_body'});
+ }
+
+ $alternative->attach(
+ 'Type' => 'text/html',
+ 'Encoding' => 'quoted-printable',
+ 'Data' => [ '',
+ ' ',
+ ' ',
+ ' '. encode_entities($return{'subject'}),
+ ' ',
+ ' ',
+ ' ',
+ @html_data,
+ ' ',
+ '',
+ ],
+ 'Disposition' => 'inline',
+ #'Filename' => 'invoice.pdf',
+ );
+
+ #no other attachment:
+ # multipart/related
+ # multipart/alternative
+ # text/plain
+ # text/html
+
+ $return{'content-type'} = 'multipart/related';
+ $return{'mimeparts'} = [ $alternative ];
+ $return{'type'} = 'multipart/alternative'; #Content-Type of first part...
+ #$return{'disposition'} = 'inline';
+
+ %return;
+
+}
+
=item send_email OPTION => VALUE ...
Options:
-I - (required)
+=over 4
+
+=item from
+
+(required)
+
+=item to
+
+(required) comma-separated scalar or arrayref of recipients
+
+=item subject
+
+(required)
+
+=item content-type
-I - (required) comma-separated scalar or arrayref of recipients
+(optional) MIME type for the body
-I - (required)
+=item body
-I - (optional) MIME type for the body
+(required unless I is true) arrayref of body text lines
-I - (required unless I is true) arrayref of body text lines
+=item mimeparts
-I - (optional, but required if I is true) arrayref of MIME::Entity->build PARAMHASH refs or MIME::Entity objects. These will be passed as arguments to MIME::Entity->attach().
+(optional, but required if I is true) arrayref of MIME::Entity->build PARAMHASH refs or MIME::Entity objects. These will be passed as arguments to MIME::Entity->attach().
-I - (optional) when set true, send_email will ignore the I option and simply construct a message with the given I. In this case,
+=item nobody
+
+(optional) when set true, send_email will ignore the I option and simply construct a message with the given I. In this case,
I, if specified, overrides the default "multipart/mixed" for the outermost MIME container.
-I - (optional) when using nobody, optional top-level MIME
+=item content-encoding
+
+(optional) when using nobody, optional top-level MIME
encoding which, if specified, overrides the default "7bit".
-I - (optional) type parameter for multipart/related messages
+=item type
+
+(optional) type parameter for multipart/related messages
+
+=back
=cut
@@ -587,7 +731,8 @@ sub _pslatex {
#my $sfile = shell_quote $file;
my @cmd = (
- 'latex', '-interaction=batchmode',
+ 'latex',
+ '-interaction=batchmode',
'\AtBeginDocument{\RequirePackage{pslatex}}',
'\def\PSLATEXTMP{\futurelet\PSLATEXTMP\PSLATEXTMPB}',
'\def\PSLATEXTMPB{\ifx\PSLATEXTMP\nonstopmode\else\input\fi}',
@@ -595,11 +740,14 @@ sub _pslatex {
"$file.tex"
);
- my $timeout = 60; #?
+ my $timeout = 30; #? should be more than enough
for ( 1, 2 ) {
+
+ local($SIG{CHLD}) = sub {};
run( \@cmd, '>'=>'/dev/null', '2>'=>'/dev/null', timeout($timeout) )
or die "pslatex $file.tex failed; see $file.log for details?\n";
+
}
}