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 )