My apologies, here is mimedefang-filter. ---- I believe it might be an issue with winmail.dat. as I've found this in the mail.info log... Question is, how can I ignore the winmail.dat and still recieve the pdf? If this is indeed the problem. I've asked our client to send in plain text for the time being but this is happening more and more frequently.

Do I not need the sub extract_tnef( $ ) at the end?



Jun 2 14:58:55 smtp1 mimedefang.pl[2032]: ytnef didn't find any attachments, but we are dropping the winmail.dat mime part anyway

Greped out most comments with # to make it smaller....



$AdminAddress = 'postmaster@localhost';
$AdminName = "MIMEDefang Administrator's Full Name";

$DaemonAddress = 'mimedefang@localhost';

$AddWarningsInline = 0;

md_graphdefang_log_enable('mail', 1);



$Stupidity{"NoMultipleInlines"} = 0;

detect_and_load_perl_modules();

sub filter_bad_filename  {
    my($entity) = @_;
    my($bad_exts, $re);

    # Bad extensions
#$bad_exts = '(ade|adp|app|asd|asf|asx|bas|bat|chm|cmd|com|cpl|crt|dll|exe|fxp|hlp|hta|hto|inf|ini|ins|isp|jse?|lib|lnk|mdb|mde|msc|msi|msp|mst|ocx|pcd|pif|prg|reg|scr|sct|sh|shb|shs|sys|url|vb|vbe|vbs|vcs|vxd|wmd|wmf|wms|wmz|wsc|wsf|wsh|\{[^\}]+\})'; $bad_exts = '(ade|adp|app|asd|asf|asx|bas|bat|chm|cmd|com|cpl|crt|dll|exe|fxp|hlp|hta|hto|inf|ini|ins|isp|jse?|lib|lnk|mde|mp3|msc|msi|msp|mst|ocx|pcd|pif|prg|reg|scr|sct|sh|shb|shs|sys|url|vb|vbe|vbs|vcs|vxd|wmd|wmf|wms|wmz|wsc|wsf|wsh|\{[^\}]+\})';

    # Do not allow:
    # - CLSIDs  {foobarbaz}
    # - bad extensions (possibly with trailing dots) at end
    $re = '\.' . $bad_exts . '\.*$';

    return 1 if (re_match($entity, $re));

    # Look inside ZIP files
    if (re_match($entity, '\.zip$') and
    $Features{"Archive::Zip"}) {
    my $bh = $entity->bodyhandle();
    if (defined($bh)) {
        my $path = $bh->path();
        if (defined($path)) {
        return re_match_in_zip_directory($path, $re);
        }
    }
    }
    return 0;
}

sub filter_begin {
    my($entity) = @_;
    # ALWAYS drop messages with suspicious chars in headers
    if ($SuspiciousCharsInHeaders) {
        md_graphdefang_log('suspicious_chars');
# action_quarantine_entire_message("Message quarantined because of suspicious characters in headers");
    # Do NOT allow message to reach recipient(s)
    return action_discard();
    }

    # Copy original message into work directory as an "mbox" file for
    # virus-scanning
    md_copy_orig_msg_to_work_dir_as_mbox_file();

    # Scan for viruses if any virus-scanners are installed
    my($code, $category, $action) = message_contains_virus();

    # Lower level of paranoia - only looks for actual viruses
    $FoundVirus = ($category eq "virus");

    # Higher level of paranoia - takes care of "suspicious" objects
    # $FoundVirus = ($action eq "quarantine");

    if ($FoundVirus) {
    md_graphdefang_log('virus', $VirusName, $RelayAddr);
    md_syslog('warning', "Discarding because of virus $VirusName");
    return action_discard();
    }

    if ($action eq "tempfail") {
    action_tempfail("Problem running virus-scanner");
md_syslog('warning', "Problem running virus scanner: code=$code, category=$category, action=$action");
    }
}

sub filter {
    my($entity, $fname, $ext, $type) = @_;

    return if message_rejected(); # Avoid unnecessary work

    # Block message/partial parts
    if (lc($type) eq "message/partial") {
        md_graphdefang_log('message/partial');
    action_bounce("MIME type message/partial not accepted here");
    return action_discard();
    }

    if (filter_bad_filename($entity)) {
        md_graphdefang_log('bad_filename', $fname, $type);
return action_drop_with_warning("An attachment named $fname was removed from this document as it\nconstituted a security hazard. If you require this document, please contact\nthe sender and arrange an alternate means of receiving it.\n");
    }

    # eml is bad if it's not multipart
    if (re_match($entity, '\.eml')) {
        md_graphdefang_log('non_multipart');
return action_drop_with_warning("A non-multipart attachment named $fname was removed from this document as it\nconstituted a security hazard. If you require this document, please contact\nthe sender and arrange an alternate means of receiving it.\n");
    }
    # This will clean up HTML if Anomy::HTMLCleaner is installed.
    # NOTE: We consider Anomy::HTMLCleaner to be TOO BUGGY for
    # production use.  Uncomment the next lines at your peril!
    #if ($Features{"HTMLCleaner"}) {
    #   if ($type eq "text/html") {
    #       return anomy_clean_html($entity);
    #   }
    #}

    # if this is a application/ms-tnef message then extract and delete it
    if (lc($type) eq "application/ms-tnef") {
        @tnef_files = extract_tnef( $entity );
    my $tnef_file_qty = @tnef_files;
    if( $tnef_file_qty > 0 ){
md_syslog( 'info', "ytnef extracted some files so we are now dropping the winmail.dat mime part" );
    } else {
md_syslog( 'info', "ytnef didn't find any attachments, but we are dropping the winmail.dat mime part anyway" );
    }
    return action_drop();
    }


    return action_accept();
}

sub filter_multipart {
    my($entity, $fname, $ext, $type) = @_;

    return if message_rejected(); # Avoid unnecessary work

    if (filter_bad_filename($entity)) {
        md_graphdefang_log('bad_filename', $fname, $type);
action_notify_administrator("A MULTIPART attachment of type $type, named $fname was dropped.\n"); return action_drop_with_warning("An attachment of type $type, named $fname was removed from this document as it\nconstituted a security hazard. If you require this document, please contact\nthe sender and arrange an alternate means of receiving it.\n");
    }

    # eml is bad if it's not message/rfc822
    if (re_match($entity, '\.eml') and ($type ne "message/rfc822")) {
        md_graphdefang_log('non_rfc822',$fname);
return action_drop_with_warning("A non-message/rfc822 attachment named $fname was removed from this document as it\nconstituted a security hazard. If you require this document, please contact\nthe sender and arrange an alternate means of receiving it.\n");
    }

    # Block message/partial parts
    if (lc($type) eq "message/partial") {
        md_graphdefang_log('message/partial');
    action_bounce("MIME type message/partial not accepted here");
    return;
    }

    return action_accept();
}


sub defang_warning {
    my($oldfname, $fname) = @_;
    return
    "An attachment named '$oldfname' was converted to '$fname'.\n" .
    "To recover the file, right-click on the attachment and Save As\n" .
    "'$oldfname'\n";
}

sub filter_end {
    my($entity) = @_;

    # If you want quarantine reports, uncomment next line
    # send_quarantine_notifications();

    # IMPORTANT NOTE:  YOU MUST CALL send_quarantine_notifications() AFTER
    # ANY PARTS HAVE BEEN QUARANTINED.  SO IF YOU MODIFY THIS FILTER TO
# QUARANTINE SPAM, REWORK THE LOGIC TO CALL send_quarantine_notifications()
    # AT THE END!!!

    # No sense doing any extra work
    return if message_rejected();


# Astro Modification: Change/Add the correct Reply-To for these shared mailboxes
    foreach $recip (@Recipients) {
        if(grep(/custrequest-andrea/i,$recip)) {
action_change_header("Reply-To", "custrequest-andrea\@example.com");
        }
        if(grep(/custrequest-kim/i,$recip)) {
action_change_header("Reply-To", "custrequest-kim\@example.com");
        }
        if(grep(/custrequest-mary/i,$recip)) {
action_change_header("Reply-To", "custrequest-mary\@example.com");
        }
        if(grep(/custrequest-teri/i,$recip)) {
action_change_header("Reply-To", "custrequest-teri\@example.com");
        }
        if(grep(/custrequest-tara/i,$recip)) {
action_change_header("Reply-To", "custrequest-tara\@example.com");
        }
    }

    # add the tnef files to the message
    foreach my $fname ( @tnef_files ) {
        local($/) = undef;
        open(FILE, "$fname");
    my $file = <FILE>;
        close(FILE);
    $file =~ s:^.*[\\/]::;
action_add_part($entity, "application/octet-stream", "base64", $file, $fname, "attachment"); md_syslog('info', "Added file $fname to message because it was extracted from the winmail.dat");
    }

    @tnef_files = ();

    # Spam checks if SpamAssassin is installed
    if ($Features{"SpamAssassin"} && !(grep(/192.168.100/,$RelayAddr))) {
    if (-s "./INPUTMSG" < 500*1024) {

        $SALocalTestsOnly = 0;

        my $hits;
        my $req;
        my $names = "...";
        my $report;
        #if($RelayAddr =~ /^192\.168\.100\./) {
        #$hits = int(0);
        #} else {
        ($hits, $req, $names, $report) = spam_assassin_check();
        #}
        if ($hits < 40) {
        $score = "*" x int($hits);
        } else {
        $score = "*" x 40;
        }

        action_change_header("X-Spam-Score", "$hits ($score) $names");

        if ($hits >= 15) {
                md_graphdefang_log('spam', $hits, $RelayAddr);
#if (($hits >= 6) && ($hits < 12) && !(grep(/192.168.100/,$RelayAddr))) { #action_add_header("X-Orig-Rcpts", join(", ",@Recipients));
            #foreach $recip (@Recipients) {
            #    delete_recipient($recip);
            #}
            #add_recipient("spam\@example.com");
            #open(FILE,">>/var/log/mimedefang.discardjunk");
            #print FILE "Score:$hits || $Subject\n";
            #close(FILE);
                #}
        #elsif (($hits >= 12) && !(grep(/192.168.100/,$RelayAddr))) {
                foreach $recip (@Recipients) {
                    delete_recipient($recip);
                }
            open(FILE,">>/var/log/mimedefang.discardjunk");
            print FILE "Score:$hits || $Subject\n";
            close(FILE);
        #}

        # If you find the SA report useful, add it, I guess...
        #action_add_part($entity, "text/plain", "-suggest",
        #                "$report\n",
        #        "SpamAssassinReport.txt", "inline");
        } #else {
            #        md_graphdefang_log('ham', $hits, $RelayAddr);
            #if ( !(grep(/192.168.100/,$RelayAddr))) {
            #    add_recipient("ham\@example.com");
            #}
        #}
    }
    }

    # I HATE HTML MAIL!  If there's a multipart/alternative with both
    # text/plain and text/html parts, nuke the text/html.  Thanks for
    # wasting our disk space and bandwidth...

    # If you want to strip out HTML parts if there is a corresponding
    # plain-text part, uncomment the next line.
    # remove_redundant_html_parts($entity);

    #md_graphdefang_log('mail_in');

    # Deal with malformed MIME.
    # Some viruses produce malformed MIME messages that are misinterpreted
    # by mail clients.  They also might slip under the radar of MIMEDefang.
    # If you are worried about this, you should canonicalize all
    # e-mail by uncommenting the action_rebuild() line.  This will
    # force _all_ messages to be reconstructed as valid MIME.  It will
    # increase the load on your server, and might break messages produced
    # by marginal software.  Your call.

    # action_rebuild();
}

sub extract_tnef( $ ) {

  my ( $entity ) = @_;
  my ( $body ) = $entity->bodyhandle;
  my @tnef_files = ();

  if( ! defined( $body ) ){
    return @tnef_files;
  }

  # Get filename
  my ( $path ) = $body->path;
  if( ! defined( $path ) ){
    return @tnef_files;
  }

  @new_files = `/usr/local/bin/ytnef -f Work $path`;

  foreach my $file ( @new_files ){
    chomp( $file );
    push( @tnef_files, $file );
    md_syslog( 'info', "Found file $file in winmail.dat attachment" );
  }

  return @tnef_files;

}


1;




On 06/03/2011 11:37 AM, David F. Skoll wrote:
On Fri, 03 Jun 2011 10:32:41 -0400
Aaron Enders<[email protected]>  wrote:

Issue: From external user mimedefang dropping the attachment. I can't
put a reason to this. I am hoping someone can help out. The source is
sending email as html(from outlook) with an inline jpg in their
signature. The attachment is supposed to be a PDF. Below is mail.log
extract and two email source, one worked one didn't..  Thank you for
any and all help!
It's completely impossible to diagnose this without seeing your
MIMEDefang filter.

Regards,

David.
_______________________________________________
NOTE: If there is a disclaimer or other legal boilerplate in the above
message, it is NULL AND VOID.  You may ignore it.

Visit http://www.mimedefang.org and http://www.roaringpenguin.com
MIMEDefang mailing list [email protected]
http://lists.roaringpenguin.com/mailman/listinfo/mimedefang

_______________________________________________
NOTE: If there is a disclaimer or other legal boilerplate in the above
message, it is NULL AND VOID.  You may ignore it.

Visit http://www.mimedefang.org and http://www.roaringpenguin.com
MIMEDefang mailing list [email protected]
http://lists.roaringpenguin.com/mailman/listinfo/mimedefang

Reply via email to