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

Guys, whenever I use Text::Wrap, long URLs (that are probably larger than the line) get dumped at the VERY bottom of the email.
Therefore a message like this:

click on this url
http://www.perlmonks.com/dir1/dir2/dir3/dir4.....dirn/file
for more info on how to use this module

would appear like this:

click on this url
for more info on how to use this module
http://www.perlmonks.com/dir1/dir2/dir3/dir4.....dirn/file

Thanks! Robert

Replies are listed 'Best First'.
Re: Long URLs and Text::Wrap
by George_Sherston (Vicar) on Nov 29, 2001 at 21:09 UTC
    I don't know the answer to your question, but I know the answer to a different question :) I just wonder if you need Text::Wrap? There's probably some other reason why you're using it, but if you're just concerned about url wrapping, and you're writing simple ascii emails, I'd have thought that you could solve any problems you might have by proper url encoding, in particular making sure there are no spaces in the url. I do something that looks exactly like what you're doing, and I feed my email messages straight to Mail::Sendmail and they come out fine, long urls wrapped automatically.

    § George Sherston
Re: Long URLs and Text::Wrap
by Fastolfe (Vicar) on Nov 30, 2001 at 00:41 UTC

    Sounds like the text 'click on this url' is being processed differently than the URL itself. Maybe you're printing one and passing the other to Text::Wrap?

    Give us a simplified test case that exhibits the problem you're seeing. Your description of the problem makes it sound like it's a logic problem with your code, not with Text::Wrap.

      OK Fastolfe, Thanks for writing.
      Here is my code:
      #! /usr/local/bin/perl use Text::Wrap; # Check Referring URL &check_url; # Code not included for clarity # Parse Form Contents &parse_form; # Code not included for clarity # Send E-Mail &send_mail; # This is the function we need to deal with! sub send_mail { my $count, $to, $name; # When these are commented out, the URL fits beautifully, # Only prob is that we need to wrap the text! $Text::Wrap::columns=60; $FORM{'message'} = wrap("","",$FORM{'message'}); if ($FORM{'fromemail'} eq "") { $FORM{'fromemail'} ="webmaster\@xxx +.com"; } if ($FORM{'from'} eq "") { $FORM{'from'} ="xxx.com"; } # Process form variables for up to 5 email addresses # sent in by the form. for ($count=1; $count<=5; $count++) { $to = 'email' . $count; $name = 'name' . $count; $type = 'email_type' . $count; if ($FORM{$to} ne "") { if ($FORM{$type} eq 'text') { open(MAIL,"|$mailprog -t"); print MAIL "To: $FROM{$name} <$FORM{$to}>\n"; print MAIL "From: $FORM{'from'} <$FORM{'fromemail'} +>\n"; print MAIL "Content-type: text\n"; print MAIL "Subject: National Biosolids Partnership + Web Site\n\n"; print MAIL "$FORM{'message'}\n"; close (MAIL); } else # it's HTML mail { # Grab the header $header = &GetTheHeader (); # Grab the footer $footer = &GetTheFooter (); # Format the message to HTML $message = $FORM{'message'}; $message =~ s/\n/<BR>/g; $message =~ s|(http\S+\s)|<A href="$1">$1</A>|g; open(MAIL,"|$mailprog -t"); print MAIL "To: $FROM{$name} <$FORM{$to}>\n"; print MAIL "From: $FORM{'from'} <$FORM{'fromemail'} +>\n"; print MAIL "Content-type: text/html\n"; print MAIL "MIME-Version: 1.0\n"; + print MAIL "Subject: National Biosolids Partnership + Web Site\n\n"; print MAIL "$header"; print MAIL "$message\n"; print MAIL "$footer"; close (MAIL); } } } print "Location: $FORM{'redirect'}\n\n"; }
      Cheers!
      Robert

        I said a simple test case, not your entire application. :)

        Before we begin, I need to state right off the bat: use strict and warnings and use CGI or die;

        Here is the test case I used. The results are not consistent with the problem you're seeing. See if you can reduce your application down to something as simple as this and see if your problem persists.

        #!/usr/bin/perl use strict; use warnings; use Text::Wrap; my $data; { local $/; $data = <DATA>; } $Text::Wrap::columns = 60; print "Before:\n"; print $data; print "\n"; print "After:\n"; print wrap("", "", $data); print "\n"; __DATA__ This is a block of text that will precede the URL that is being presen +ted THE URL http://xxx.yyy.com/admin/more_grassroots/bigalerts/thefeder +algovernment/oy_veit/email/the_email_template.html This is the concluding block of text that will appear AFTER the URL. If this block is NOT at the bottom of the email, then we need to fix t +he wrapping algorithm!
        This prints:
        ... After: This is a block of text that will precede the URL that is being presented THE URL http://xxx.yyy.com/admin/more_grassroots/bigalerts/thefeder algovernment/oy_veit/email/the_email_template.html This is the concluding block of text that will appear AFTER the URL. If this block is NOT at the bottom of the email, then we need to fix the wrapping algorithm!
        As expected.
        I agree, definitly make a simple example! You are concluding that Text::Wrap is the problem, but there is a lot more going on in there.

        Try peeking at $FORM{'message'} just before and just after the call to wrap, and see if it indeed got re-arranged at that point.

      Actual examples

      
      WHEN WRAP IS ENABLED
      ====================
      This is a block of text that will precede the URL
      that is being presented
      
      THE URL
      This is the concluding block of text that will appear AFTER
      the URL.
      
      If this block is NOT at the bottom of the email, then we
      need to fix the wrapping algorithm!
      
      http://xxx.yyy.com/admin/more_grassroot
      s/bigalerts/thefederalgovernment/oy_veit/email/the_email_te
      mplate.html
      
      
      
      
      WHEN WRAP IS N O T ENABLED
      ==========================
      This is a block of text that will precede the URL that is being presented
      
      THE URL    http://xxx.yyy.com/admin/more_grassroots/bigalerts/thefederalgovernment/oy_veit/email/the_email_template.html
      
      This is the concluding block of text that will appear AFTER the URL.
      
      If this block is NOT at the bottom of the email, then we need to fix the wrapping algorithm!