EMDIS-ECS
view release on metacpan or search on metacpan
lib/EMDIS/ECS/FileBackedMessage.pm view on Meta::CPAN
}
# create directory if it doesn't already exist
my $dirname = dirname($filename);
mkdir $dirname unless -e $dirname;
}
# don't overwrite $filename file if it already exists
my $fh;
if(-e $filename)
{
my $template = $filename . "_XXXXXX";
($fh, $filename) = tempfile($template);
return "send_this_message(): unable to open _XXXX file: " .
"$filename"
unless $fh;
}
else
{
$fh = new IO::File;
return "send_this_message(): unable to open file: " .
"$filename"
unless $fh->open("> $filename");
}
print $fh "Subject: $subject\n";
print $fh "To: $node->{addr}\n";
print $fh "From: " . $cfg->SMTP_FROM . "\n\n";
# copy data to $fh
$err = "Unable to position file pointer for file $this->{filename}" .
" to position $this->{data_offset}: $!"
unless seek $this->{file_handle}, $this->{data_offset}, 0;
my $buffer;
while(1)
{
if($err)
{
$node_tbl->unlock() unless $was_locked; # unlock if needed
close $fh;
unlink $filename;
return $err;
}
my $bytecount = read $this->{file_handle}, $buffer, 65536;
if(not defined $bytecount)
{
$err = "send_this_message(): Problem reading input file " .
"$this->{filename}: $!";
}
elsif($bytecount == 0)
{
last; # EOF
}
else
{
print $fh $buffer
or $err = "send_this_message(): Problem writing output " .
"file $filename: $!";
}
}
close $fh;
chmod $FILEMODE, $filename;
}
my $custom_headers = {};
$custom_headers->{'x-emdis-hub-rcv'} = $rcv_node_id;
$custom_headers->{'x-emdis-hub-snd'} = $cfg->THIS_NODE;
if($num_parts == 1)
{
# read all data, send single email message
$err = "send_this_message(): Unable to position file pointer for " .
"file $this->{filename} to position $this->{data_offset}: $!"
unless seek $this->{file_handle}, $this->{data_offset}, 0;
if(not $err)
{
my $all_data;
my $bytecount = read $this->{file_handle}, $all_data, $data_size;
if(not defined $bytecount)
{
$err = "send_this_message(): Problem reading input file " .
"$this->{filename}: $!";
}
elsif($bytecount != $data_size)
{
$err = "send_this_message(): Problem reading from input file " .
"$this->{filename}: expected $msg_part_size bytes, " .
"found $bytecount bytes.";
}
elsif($this->{is_meta_message}
and ($node->{encr_meta} !~ /true/io))
{
# don't encrypt meta-message
if(is_yes($cfg->ENABLE_AMQP) and exists $node->{amqp_addr_meta} and $node->{amqp_addr_meta}) {
# send meta-message via AMQP (if indicated by node config)
$err = send_amqp_message(
$node->{amqp_addr_meta},
$subject,
$node,
$custom_headers,
$all_data);
}
elsif(is_yes($node->{amqp_only})) {
$err = "send_this_message(): Unable to send email META message " .
"to node $rcv_node_id: amqp_only selected.";
}
else {
$err = send_email($node->{addr}, $subject, undef, $all_data);
}
}
else
{
# send encrypted message
$err = send_encrypted_message(
$node->{encr_typ},
$node->{addr_r},
$node->{addr},
$node->{encr_out_keyid},
$node->{encr_out_passphrase},
$node,
( run in 0.680 second using v1.01-cache-2.11-cpan-39bf76dae61 )