diff options
Diffstat (limited to 'FS/FS/Misc.pm')
-rw-r--r-- | FS/FS/Misc.pm | 227 |
1 files changed, 18 insertions, 209 deletions
diff --git a/FS/FS/Misc.pm b/FS/FS/Misc.pm index 2e383d549..df9717068 100644 --- a/FS/FS/Misc.pm +++ b/FS/FS/Misc.pm @@ -1,15 +1,11 @@ package FS::Misc; use strict; -use vars qw ( @ISA @EXPORT_OK $DEBUG ); +use vars qw ( @ISA @EXPORT_OK ); use Exporter; -use Carp; -use Data::Dumper; @ISA = qw( Exporter ); -@EXPORT_OK = qw( send_email send_fax ); - -$DEBUG = 0; +@EXPORT_OK = qw( send_email ); =head1 NAME @@ -41,19 +37,9 @@ I<to> - (required) comma-separated scalar or arrayref of recipients I<subject> - (required) -I<content-type> - (optional) MIME type for the body - -I<body> - (required unless I<nobody> is true) arrayref of body text lines - -I<mimeparts> - (optional, but required if I<nobody> is true) arrayref of MIME::Entity->build PARAMHASH refs or MIME::Entity objects. These will be passed as arguments to MIME::Entity->attach(). - -I<nobody> - (optional) when set true, send_email will ignore the I<body> option and simply construct a message with the given I<mimeparts>. In this case, -I<content-type>, if specified, overrides the default "multipart/mixed" for the outermost MIME container. +I<content-type> - (optional) MIME type -I<content-encoding> - (optional) when using nobody, optional top-level MIME -encoding which, if specified, overrides the default "7bit". - -I<type> - (optional) type parameter for multipart/related messages +I<body> - (required) arrayref of body text lines =cut @@ -61,7 +47,6 @@ use vars qw( $conf ); use Date::Format; use Mail::Header; use Mail::Internet 1.44; -use MIME::Entity; use FS::UID; FS::UID->install_callback( sub { @@ -70,111 +55,25 @@ FS::UID->install_callback( sub { sub send_email { my(%options) = @_; - if ( $DEBUG ) { - my %doptions = %options; - $doptions{'body'} = '(full body not shown in debug)'; - warn "FS::Misc::send_email called with options:\n ". Dumper(\%doptions); -# join("\n", map { " $_: ". $options{$_} } keys %options ). "\n" - } $ENV{MAILADDRESS} = $options{'from'}; my $to = ref($options{to}) ? join(', ', @{ $options{to} } ) : $options{to}; - - my @mimeargs = (); - my @mimeparts = (); - if ( $options{'nobody'} ) { - - croak "'mimeparts' option required when 'nobody' option given\n" - unless $options{'mimeparts'}; - - @mimeparts = @{$options{'mimeparts'}}; - - @mimeargs = ( - 'Type' => ( $options{'content-type'} || 'multipart/mixed' ), - 'Encoding' => ( $options{'content-encoding'} || '7bit' ), - ); - - } else { - - @mimeparts = @{$options{'mimeparts'}} - if ref($options{'mimeparts'}) eq 'ARRAY'; - - if (scalar(@mimeparts)) { - - @mimeargs = ( - 'Type' => 'multipart/mixed', - 'Encoding' => '7bit', - ); - - unshift @mimeparts, { - 'Type' => ( $options{'content-type'} || 'text/plain' ), - 'Data' => $options{'body'}, - 'Encoding' => ( $options{'content-type'} ? '-SUGGEST' : '7bit' ), - 'Disposition' => 'inline', - }; - - } else { - - @mimeargs = ( - 'Type' => ( $options{'content-type'} || 'text/plain' ), - 'Data' => $options{'body'}, - 'Encoding' => ( $options{'content-type'} ? '-SUGGEST' : '7bit' ), - ); - - } - - } - - my $domain; - if ( $options{'from'} =~ /\@([\w\.\-]+)/ ) { - $domain = $1; - } else { - warn 'no domain found in invoice from address '. $options{'from'}. - '; constructing Message-ID @example.com'; - $domain = 'example.com'; - } - my $message_id = join('.', rand()*(2**32), $$, time). "\@$domain"; - - my $message = MIME::Entity->build( - 'From' => $options{'from'}, - 'To' => $to, - 'Sender' => $options{'from'}, - 'Reply-To' => $options{'from'}, - 'Date' => time2str("%a, %d %b %Y %X %z", time), - 'Subject' => $options{'subject'}, - 'Message-ID' => "<$message_id>", - @mimeargs, + my @header = ( + 'From: '. $options{'from'}, + 'To: '. $to, + 'Sender: '. $options{'from'}, + 'Reply-To: '. $options{'from'}, + 'Date: '. time2str("%a, %d %b %Y %X %z", time), + 'Subject: '. $options{'subject'}, ); + push @header, 'Content-Type: '. $options{'content-type'} + if exists($options{'content-type'}); + my $header = new Mail::Header ( \@header ); - if ( $options{'type'} ) { - #false laziness w/cust_bill::generate_email - $message->head->replace('Content-type', - $message->mime_type. - '; boundary="'. $message->head->multipart_boundary. '"'. - '; type='. $options{'type'} - ); - } - - foreach my $part (@mimeparts) { - - if ( UNIVERSAL::isa($part, 'MIME::Entity') ) { - - warn "attaching MIME part from MIME::Entity object\n" - if $DEBUG; - $message->add_part($part); - - } elsif ( ref($part) eq 'HASH' ) { - - warn "attaching MIME part from hashref:\n". - join("\n", map " $_: ".$part->{$_}, keys %$part ). "\n" - if $DEBUG; - $message->attach(%$part); - - } else { - croak "mimepart $part isn't a hashref or MIME::Entity object!"; - } - - } + my $message = new Mail::Internet ( + 'Header' => $header, + 'Body' => $options{'body'}, + ); my $smtpmachine = $conf->config('smtpmachine'); $!=0; @@ -185,89 +84,6 @@ sub send_email { } -=item send_fax OPTION => VALUE ... - -Options: - -I<dialstring> - (required) 10-digit phone number w/ area code - -I<docdata> - (required) Array ref containing PostScript or TIFF Class F document - --or- - -I<docfile> - (required) Filename of PostScript TIFF Class F document - -...any other options will be passed to L<Fax::Hylafax::Client::sendfax> - - -=cut - -sub send_fax { - - my %options = @_; - - die 'HylaFAX support has not been configured.' - unless $conf->exists('hylafax'); - - eval { - require Fax::Hylafax::Client; - }; - - if ($@) { - if ($@ =~ /^Can't locate Fax.*/) { - die "You must have Fax::Hylafax::Client installed to use invoice faxing." - } else { - die $@; - } - } - - my %hylafax_opts = map { split /\s+/ } $conf->config('hylafax'); - - die 'Called send_fax without a \'dialstring\'.' - unless exists($options{'dialstring'}); - - if (exists($options{'docdata'}) and ref($options{'docdata'}) eq 'ARRAY') { - my $dir = $FS::UID::conf_dir. "cache.". $FS::UID::datasrc; - my $fh = new File::Temp( - TEMPLATE => 'faxdoc.'. $options{'dialstring'} . '.XXXXXXXX', - DIR => $dir, - UNLINK => 0, - ) or die "can't open temp file: $!\n"; - - $options{docfile} = $fh->filename; - - print $fh @{$options{'docdata'}}; - close $fh; - - delete $options{'docdata'}; - } - - die 'Called send_fax without a \'docfile\' or \'docdata\'.' - unless exists($options{'docfile'}); - - #FIXME: Need to send canonical dialstring to HylaFAX, but this only - # works in the US. - - $options{'dialstring'} =~ s/[^\d\+]//g; - if ($options{'dialstring'} =~ /^\d{10}$/) { - $options{dialstring} = '+1' . $options{'dialstring'}; - } else { - return 'Invalid dialstring ' . $options{'dialstring'} . '.'; - } - - my $faxjob = &Fax::Hylafax::Client::sendfax(%options, %hylafax_opts); - - if ($faxjob->success) { - warn "Successfully queued fax to '$options{dialstring}' with jobid " . - $faxjob->jobid - if $DEBUG; - return ''; - } else { - return 'Error while sending FAX: ' . $faxjob->trace; - } - -} - package Mail::Internet; use Mail::Address; @@ -322,9 +138,6 @@ sub Mail::Internet::mysmtpsend { # Send it - #warn "Headers: \n" . join('',@{$hdr->header}); - #warn "Body: \n" . join('',@{$src->body}); - my $ok = $smtp->mail( $envelope ) && $smtp->to(@addr) && $smtp->data(join("", @{$hdr->header},"\n",@{$src->body})); @@ -340,8 +153,6 @@ sub Mail::Internet::mysmtpsend { } package FS::Misc; -=back - =head1 BUGS This package exists. @@ -350,8 +161,6 @@ This package exists. L<FS::UID>, L<FS::CGI>, L<FS::Record>, the base documentation. -L<Fax::Hylafax::Client> - =cut 1; |