johnajb has asked for the wisdom of the Perl Monks concerning the following question:

I have a simple pop3 script using Net::pop3. Here is what it does. It pops a mailbox and splits the emails into seperate .eml files. In those eml file there is a string that reoccurs. I need to remaove a blank line that occurs after the string "Content-Transfer-Encoding: 7bit" This blank line is making the email be non-mime compliant. Just that blank line in the email must go.
I will paste the script below. Thanks for the help
################################# use Net::POP3; # Constructors $pop = Net::POP3->new('redserv1', Timeout => 60); $i = int rand(10000000000000); if ($pop->login("capturemail", "redmap") > 0) { my $msgnums = $pop->list; # hashref of msgnum => size foreach my $msgnum (keys %$msgnums) { open(MAILBOX, ">$i.eml") or die "Cannot open Mailbox file $timestamp$i.eml"; print "Writing to $i.eml\n"; $i++; my $msg = $pop->get($msgnum); print MAILBOX @$msg; # $pop->delete($msgnum); close(MAILBOX) or die "Cannot close mailbox"; } } $pop->quit;

Code tags added by davido.

Replies are listed 'Best First'.
Re: remove a blank line after a string
by davido (Cardinal) on Jan 26, 2005 at 17:10 UTC

    Adding one line will do it. I'll demonstrate:

    my $msg = $pop->get($msgnum); pop @{$msg} if $msg->[-1] =~ /^\s+$/; # This is the additional line. print MAILBOX @$msg;

    That assumes that your description of the problem is correct; that there is one blank line at the end of the message, with nothing but whitespace in it (whitespace includes \n). This will essentially eliminate that last line if it only contains \s character(s).


    Dave

      Thanks for the reply. The blank line is actually in the middle of the message following the content type 7bit line. What might work is to get rid of all blank lines

        Ok, I misunderstood. This should do the trick:

        for ( 0 .. $#{$msg} ) { next unless $msg->[$_] =~ m/\QContent-Transfer-Encoding: 7bit\E/i; splice( @{$msg}, $_ + 1, 1 ) if $msg->[ $_ + 1 ] =~ m/^\s+$/; last; }

        This scans through the message until it finds the "Content-Transfer-Encoding: 7bit" string. The next line is then checked to see if it is blank except for whitespace, and if it is, it's deleted. And since we're done looking for the blank line, the loop is exited.


        Dave

HELP delete blank line in middle of email
by johnajb (Novice) on Jan 26, 2005 at 18:25 UTC
    Davido gave me one answer for the blank line at the bottom of the email. But this line is in the middle. Could i remove all blank spaces????? It would be better just to remove that blank line i list below. thanks I have a simple pop3 script using Net::pop3. Here is what it does. It pops a mailbox and splits the emails into seperate .eml files. In those eml file there is a string that reoccurs. I need to remaove a blank line that occurs after the string "Content-Transfer-Encoding: 7bit" This blank line is making the email be non-mime compliant. Just that blank line in the email must go.
    I will paste the script below. Thanks for the help
    ################################# use Net::POP3; # Constructors $pop = Net::POP3->new('redserv1', Timeout => 60); $i = int rand(10000000000000); if ($pop->login("capturemail", "redmap") > 0) { my $msgnums = $pop->list; # hashref of msgnum => size foreach my $msgnum (keys %$msgnums) { open(MAILBOX, ">$i.eml") or die "Cannot open Mailbox file $timestamp$i.eml"; print "Writing to $i.eml\n"; $i++; my $msg = $pop->get($msgnum); print MAILBOX @$msg; # $pop->delete($msgnum); close(MAILBOX) or die "Cannot close mailbox"; } } $pop->quit;

    Reparented by davido per consideration.

      I suppose that's the main reason for making email be non- mime compliant - the invalidation of the header.
      Email header have to be differed from body by new line. Otherwise email clients have no way to know what is body and what is header.
      Be sure to leave the blank line after header in case you want comliant email.
Re: remove a blank line after a string
by spongeboy (Novice) on Feb 23, 2005 at 01:48 UTC
    I like Davido's solution but prefer this for clarity, if not the extra characters (anti-golfing?)-
    For (0 .. $#{$msg} ) { If (msg->[$_] =~ m/\QContent-Transfer-Encoding: 7bit\E/i) { If ( next line is blank ) { Splice last; } } }
Re: remove a blank line after a string
by Frantz (Monk) on Jan 26, 2005 at 17:19 UTC
        Thanks for the reply. The blank line is actually in the middle of the message following the content type 7bit line.