http://qs1969.pair.com?node_id=11122538


in reply to Double Dot Stuffing

I am surprised that your test case works at all. The EXAMPLES section of MIME::Entity specifies that the data field is a reference to an array of strings (lines). Your have a string. I suspect that your problem has nothing to do with 'dot stuffing'. The 'Output' section of the same document specifies that 'stringify' (as_string) returns the entity exactly as print would print it. (I take this to mean that any 'stuffing' is removed.) In your case, a long line is split into two. The URL is split over the two lines. It appears that the module uses the '=' (at the end of the first line) to indicate this split. Are you sure that you are extracting the URL correctly in this case?
Bill

Replies are listed 'Best First'.
Re^2: Double Dot Stuffing
by skazat (Chaplain) on Oct 04, 2020 at 21:59 UTC

    Interesting observation, but it appears that passing a string returns the same output as passing an array ref. Passing a string as the value of the paramater is even used in the source of the MIME::Entity module itself for its own internal methods (see, add_sig() ).

    The docs actually state the value for the Data param should be,

    Single-part entities only. Optional. An alternative to Path (q.v.): the actual data, either as a scalar or an array reference (whose elements are joined together to make the actual scalar).

    So both are right. I'm very pleased with how MIME::Entity is encoding the message - one line that I feed it splitting into two lines when encoded is what I expect. Decoding things back works just as well. (I'm not reporting a bug in MIME::Entity.)

     
    #!/usr/bin/perl 
    
    use MIME::Entity; 
    
    my $str = 'filler text to get the first char of line 2 to be a dot______ http://google.com'; 
    
    MIME::Entity->build(
    	Data     => $str, 
    	Type     => 'text/plain',
    	Encoding => 'quoted-printable',
    )->bodyhandle->print; 
    
    Prints back,
    filler text to get the first char of line 2 to be a dot______ http://google.com
    

    The broken URL isn't happening in my app, but upstream.

    The problem is in the SMTP client not double-dotting a line that starts with a dot. Lines that start with a dot could happen because of my example (wrapping a URL onto multiple lines during encode). I'm asking what it is I should do (if anything) to deal with a broken SMTP client? I'm leaning on, "nothing", but is this instead a universal problem, with a known solution? Googling this problem specifically for Perl examples leads to no results, although other languages/libraries say to encode the dot. If I were to encode the dot, what's the least hackiest way to do so? I can make a one-line regex to handle this, but then I fear I'll then have two problems.

    -skazat
      It appears to me that a long line in the Entity object is just that - a long line. Only the display is word- wrapped. There is no issue with a line starting with a dot. If some 'upstream' software (or person) did the analogous word-wrap before the build, the object would indeed have two lines one of which might start with a period. In that case, your URL would contain a newline character right before the dot. If this does not describe the problem, please post code that builds two similar objects, one that is correct and one that is not.
      Bill
        No, that doesn't describe my problem, but I encourage you to revisit my initial post ;)
        -skazat