X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fcust_msg.pm;h=5309e25338f5b24356e3eeee46b4119deddfe1b6;hp=8d57a54accb642f282d203779920e40ff1204e03;hb=f122002060734955dee22d5d32a51d90af3a4489;hpb=e9e0cf0989259b94d9758eceff448666a2e5a5cc diff --git a/FS/FS/cust_msg.pm b/FS/FS/cust_msg.pm index 8d57a54ac..5309e2533 100644 --- a/FS/FS/cust_msg.pm +++ b/FS/FS/cust_msg.pm @@ -3,6 +3,7 @@ package FS::cust_msg; use strict; use base qw( FS::cust_main_Mixin FS::Record ); use FS::Record qw( qsearch qsearchs ); +use MIME::Parser; use vars qw( @statuses ); =head1 NAME @@ -22,9 +23,9 @@ FS::cust_msg - Object methods for cust_msg records =head1 DESCRIPTION -An FS::cust_msg object represents an email message generated by Freeside -and sent to a customer (see L). FS::cust_msg inherits -from FS::Record. The following fields are currently supported: +An FS::cust_msg object represents an email message generated by Freeside. +FS::cust_msg inherits from FS::Record. The following fields are currently +supported: =over 4 @@ -44,10 +45,14 @@ from FS::Record. The following fields are currently supported: =item header - message header -=item body - message body +=item body - message body (as a complete MIME document) + +=item preview - HTML fragment to show as a preview of the message =item error - Email::Sender error message (or null for success) +=item status - "prepared", "sent", or "failed" + =back =head1 METHODS @@ -136,12 +141,14 @@ sub check { || $self->ut_textn('env_to') || $self->ut_anything('header') || $self->ut_anything('body') + || $self->ut_anything('preview') || $self->ut_enum('status', \@statuses) || $self->ut_textn('error') || $self->ut_enum('msgtype', [ '', 'invoice', 'receipt', 'admin', + 'report', ]) ; return $error if $error; @@ -149,8 +156,75 @@ sub check { $self->SUPER::check; } +=item send + +Sends the message through its parent L. Returns an error +message on error, or an empty string. + +=cut + +sub send { + my $self = shift; + # it's still allowed to have cust_msgs without message templates, but only + # for email. + my $msg_template = $self->msg_template || 'FS::msg_template::email'; + $msg_template->send_prepared($self); +} + +=item entity + +Returns the complete message as a L. + +XXX this only works if the message in fact contains a MIME entity. Messages +created by external APIs may not look like that. + +=item parts + +Returns a list of the MIME parts contained in the message, as L +objects. + +=cut + +sub entity { + my $self = shift; + if ( !exists($self->{entity}) ) { + my $parser = MIME::Parser->new; + my $output_dir = "$FS::UID::cache_dir/cache.$FS::UID::datasrc/mimeparts"; + mkdir($output_dir) unless -d $output_dir; + $parser->output_under($output_dir); + $self->{entity} = + $parser->parse_data( $self->header . "\n" . $self->body ); + } + $self->{entity}; +} + +sub parts { + my $self = shift; + # return only the parts with bodies, not the multipart containers + grep { $_->bodyhandle } $self->entity->parts_DFS; +} + =back +=head1 SUBROUTINES + +=over 4 + +=item process_send CUSTMSGNUM + +Given a C value, sends the message. It must already +have been prepared (via L). + +=cut + +sub process_send { + my $custmsgnum = shift; + my $cust_msg = FS::cust_msg->by_key($custmsgnum) + or die "cust_msg #$custmsgnum not found"; + my $error = $cust_msg->send; + die $error if $error; +} + =head1 SEE ALSO L, L, L.