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
=head1 DESCRIPTION
-An FS::cust_msg object represents a template-generated message sent to
-a customer (see L<FS::msg_template>). 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
+and sent to a customer (see L<FS::msg_template>). FS::cust_msg inherits
+from FS::Record. The following fields are currently supported:
=over 4
=item msgnum - template number
+=item msgtype - the message type
+
=item _date - the time the message was sent
=item env_from - envelope From address
my $error =
$self->ut_numbern('custmsgnum')
- || $self->ut_number('custnum')
- || $self->ut_foreign_key('custnum', 'cust_main', 'custnum')
+ || $self->ut_numbern('custnum')
+ || $self->ut_foreign_keyn('custnum', 'cust_main', 'custnum')
|| $self->ut_numbern('msgnum')
|| $self->ut_foreign_keyn('msgnum', 'msg_template', 'msgnum')
|| $self->ut_numbern('_date')
|| $self->ut_anything('body')
|| $self->ut_enum('status', \@statuses)
|| $self->ut_textn('error')
+ || $self->ut_enum('msgtype', [ '',
+ 'invoice',
+ 'receipt',
+ 'admin',
+ 'report',
+ ])
;
return $error if $error;
$self->SUPER::check;
}
+=item entity
+
+Returns the complete message as a L<MIME::Entity>.
+
+=item parts
+
+Returns a list of the MIME parts contained in the message, as L<MIME::Entity>
+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 SEE ALSO