Receiving an XML Post and emailing all variables posted..

Hi there,

I am currently coding a system that is basically a perl script, that converts an mms message into database fields, and writes the picture file that is sent (all via XML).

I currently have the script emailing me all posted form variables (which would work if it was standard form variables) except with the XML formatting, its just treating it as 1 variable, and I have no way of splitting up each name/value pair.

I have seen XML::Simple, so Im guessing I need a script that basically when called, just goes through and prints all XML variables posted to it.

Is this easy enough to do?

An example of the posting that is sent, is below:

www.theshow.com/Example.txt 


The current script I use just to post out all variables is below, but this treats it as just 1 variable when XML is posted.

@names = $q->param;
foreach $varname (@names)
{ $$varname = $q->param($varname);
$output.="$varname:- ";
$output.= $q->param($varname);
$output.="<BR><BR>\n";
}
dreamshockDesignAsked:
Who is Participating?
 
kanduraConnect With a Mentor Commented:
Hi Scott,

I've tested the script below, and it works for me. I've added (but not tested) your sendmail code. Let me know how it goes.
   
    #!/usr/bin/perl
    use strict;
    use warnings;
    use XML::Simple;
    use Data::Dumper;
   
    print "Content-type: text/html\n\n";
   
    if($ENV{REQUEST_METHOD} eq 'POST') {
        my $buf;
        my $xml = '';
   
        ## read post data
        my $read = 0;
        while( my $r = read(STDIN, $buf, 1024) > 0 ) {
            $xml .= $buf;
            $read+=$r > 1_024_000 and die "POST data exceeds maximum size";      # don't read more than a megabyte
        }
   
        ## we may need to urldecode $xml here, but I can't tell
        # $xml =~ s/%([0-9a-fA-F]{2})/chr($1)/eg;
   
        my $mms = XMLin($xml);
   
        print "<pre>";
   
        my %fields = %{$mms->{field}};
        my $output;
        foreach(sort keys %fields) {
            $output .= print "$_: $fields{$_}->{content}\n" if $fields{$_}->{content};
        }
   
        sendmail($output);
        exit;
    }
   
    print "No data received";
   
    sub sendmail {
        my $output = shift;
        my $mailtype = qq~Content-Type: text/html; charset="iso-8859-1"~;
   
        my $mail='scott@dreamshock.com';            #Write your mail here.
        my $mailprog='/usr/sbin/sendmail';        #Change this to your sendmail path.
   
        my $fullName = 'Kandura';
        my $email    = 'ee@rhesa.com';
       
        open (MAIL, "|$mailprog -t")or die ("wrong mailprog\n");
        print MAIL "To: $mail\n";
        print MAIL "From: $fullName<$email>\n";
        print MAIL "$mailtype\n";
        print MAIL "Subject: MMS Message\n";
   
    print MAIL <<ENDCONTENT;
    This is the output:
   
   
    $output
   
    ENDCONTENT
   
        print MAIL "\n\n";
   
        close (MAIL);
   
    print "done";
   
    }
0
 
kanduraCommented:
use XML::Simple;
use Data::Dumper;

$h = XMLin(\*DATA);

print Dumper($h); # this shows you the data structure that XML::Simple creates

my %fields = %{$h->{field}};

foreach(sort keys %fields) {
    print "$_: $fields{$_}->{content}\n";
}

__DATA__
<?xml version="1.0"?>
<!DOCTYPE bspostevent PUBLIC "-//BSPostEvent//DTD bspostevent 1.1.0//EN" "http://mbrand1.ukmain.brainstorm.co.uk/MEnable/Client/Extra/bspostevent-1_0_0.dtd">
<bspostevent>
  <field name="RemoteNetwork" type = "string">vodafone</field>
  <field name="LastName" type = "string"></field>
  <field name="BSDate-tomorrow" type = "string">20040619</field>
  <field name="Shared" type = "string">N</field>
  <field name="EMail" type = "string"></field>
  <field name="BSDate-today" type = "string">20040618</field>
  <field name="Local" type = "string">+447719336699</field>
  <field name="FirstName" type = "string"></field>
  <field name="PassCode" type = "string"></field>
  <field name="MessageID" type = "string">3275751</field>
  <field name="Gender" type = "string"></field>
  <field name="Prefix" type = "string">APICHECK</field>
  <field name="ClientName" type = "string">Demo</field>
  <field name="RegDate" type = "date">2003-10-28 20:54:30 +0000</field>
  <field name="MobileDevice" type = "string">Sharp GX10</field>
  <field name="BSDate-yesterday" type = "string">20040617</field>
  <field name="Remote" type = "string">+447796170669</field>
  <field name="PostCode" type = "string"></field>
  <field name="MobileNetwork" type = "string">vodafone</field>
  <field name="MMS" type = "data">TUlNRS1WZXJzaW9uOiAxLjANClN1YmplY3Q6IA0KRnJvbTogKzQ0Nzc5NjE3MDY2OQ0KVG86ICs0NDc3MTkzMzY2OTkNCk14dGVsZWNvbS1JZDogMTU4ODE5NjQNCkRhdGU6IDIwMDQtMDYtMTggMjE6Mjg6MTMNCkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJpbmFyeQ0KQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvcmVsYXRlZDsgYm91bmRhcnk9IkYzWC9rdXBvMytTM3ZySVlubmtzTVFBQUFBTT0iOyBzdGFydD0iPG1tcy5zbWlsPiI7IHR5cGU9ImFwcGxpY2F0aW9uL3NtaWwiDQoNCi0tRjNYL2t1cG8zK1MzdnJJWW5ua3NNUUFBQUFNPQ0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9zbWlsOyBuYW1lPW1tcy5zbWlsDQpDb250ZW50LUlkOiA8bW1zLnNtaWw+DQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0DQoNCjxzbWlsPg0KIDxib2R5Pg0KICA8cGFyIGR1cj0iNXMiPg0KICAgPHJlZiBzcmM9InQwIiAvPg0KICA8L3Bhcj4NCiAgPHBhciBkdXI9IjVzIj4NCiAgIDx0ZXh0IHNyYz0idDElM0F0MS50eHQiIC8+DQogIDwvcGFyPg0KICA8cGFyIGR1cj0iNXMiPg0KICAgPGltZyBzcmM9ImkxJTNBVGVpZmkuanBnIiAvPg0KICA8L3Bhcj4NCiA8L2JvZHk+DQo8L3NtaWw+DQoNCi0tRjNYL2t1cG8zK1MzdnJJWW5ua3NNUUFBQUFNPQ0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9zbWlsOyBuYW1lPXQwDQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiaW5hcnkNCkNvbnRlbnQtSWQ6IDx0MD4NCg0KPHNtaWw+DQogPGhlYWQ+DQogIDxsYXlvdXQ+DQogICA8cm9vdC1sYXlvdXQgaGVpZ2h0PSIxMjciIHdpZHRoPSIxMTEiLz4NCiAgIDxyZWdpb24gaWQ9IkltYWdlIiB0b3A9IjUwJSIgbGVmdD0iMCUiIGhlaWdodD0iNTAlIiB3aWR0aD0iMTAwJSIvPg0KICAgPHJl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</field>
  <field name="State" type = "string">1</field>
  <field name="MobileNumber" type = "string">+447796170669</field>
  <field name="Text" type = "string"></field>
  <field name="RegType" type = "string">SMS</field>
  <field name="NewSubscriber" type = "string">NO</field>
  <field name="PostID" type = "real">0
  </field>
  <field name="Subscriber" type = "string">+447796170669</field>
  <field name="Parsed" type = "string"></field>
  <field name="ServiceName" type = "string">ShowAPI3</field>
  <field name="BSDate-thisweek" type = "string">20040614</field>
  <field name="Now" type = "date">2004-06-18 20:28:07 +0000
  </field>
</bspostevent>

0
 
dreamshockDesignAuthor Commented:
Thanks for the reply, but I get the following error each time the script is called? does this make any sence to you?

 Error reading from filehandle: Bad file descriptor

Is this because of the way its being posted from another server?
0
Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

 
kanduraCommented:
Did you also include the __DATA__ section?
If you didn't, then XMLin(\*DATA) would indeed give you that error.

Try XMLin($filename) instead, if you have the xml in a file named $filename.

I'm sorry about posting that big chunk of encoded data, by the way. I didn't notice in my editor that it was so large!
0
 
dreamshockDesignAuthor Commented:
Hey thats ok! not a problem........

But the xml isnt ever a physical file, its simply posted from one server to another, therefore I cant specify a file name, i need to somehow call it from the "posted in" information, I assume this is also quite simple based on the above?
0
 
kanduraCommented:
this should also work fine:

   $h = XMLin($q->param('posted in'));

Provided the cgi parameter is called 'posted in', of course.
0
 
dreamshockDesignAuthor Commented:
This is obviously harder than I thought it was going to be!!

Its now erroring and saying the statement below:

Could not find acceptmms.xml in ./ at acceptmms.pl line 13

So its looking for an actual file for some reason, rather than just reading the input.

What about maybe writing the contents to a .xml file first, then parsing it.

The trouble is I dont know how to harness this datacorrectly, to even write it to a file....... hmmm, im puzzled now....
0
 
kanduraCommented:
how is it posted to you exactly? do you get the actual xml content, or just a url?

if it's the real content, then:

    my $xml = $q->param('xmldata');
    my $h   = XMLin($xml);

should work: that is, we supply the xml content to XML::Simple as a string.



0
 
dreamshockDesignAuthor Commented:
Its the xml content itself

To quote:

The incoming message is an MMS that's too big for a URL line so we must send it as XML in bspost format as defined in the attached document www.theshow.com/bspostevent-1_0_0.dtd


Tried, but again it is simply saying it cannot find the .xml file, however I have tried doing it with a physical file that resides on the server, and it works flawlessly. So its just getting it to read the posted data!
0
 
kanduraCommented:
Í'm pretty sure XML::Simple didn't just make up that file name of "acceptmms.xml". Are you sure you're using the correct parameter name?
Could you just send me the output from your original script?
0
 
dreamshockDesignAuthor Commented:
The perl script is called acceptmms.pl, so obviously thats where the name is coming from.

This is what I get when I run the script from the command, or when the 3rd party posts the xml feed:


> perl acceptmms.pl
Content-type: text/html

Could not find acceptmms.xml in ./ at acceptmms.pl line 14


Where line 14 is:

$h   = XMLin($xml);

Therefore I think it has to be something to do with the line above:

$xml = $q->param('xmldata');
0
 
kanduraCommented:
dreamshockDesign,
> $xml = $q->param('xmldata');

the 'xmldata' is a name I made up. You should replace it with the actual name.
If that param doesn't contain any data, then I suppose XMLin tries to figure out a sensible file name to look for. The fact that it bases it on your script name does make sense, since XML::Simple is often used for configuration files.

How exactly is the XML posted to your script? Could you just do a dump of the POST request?
0
 
dreamshockDesignAuthor Commented:
Well the tricky part of this whole situation is that the post request comes from a 3rd party which I have no control over. As said initially I tried to do a script that simply emailed "everything" that was posted, but the variable names were lost, and its just came back as a long string of text split by spaces, so not very convenient to use.

An example of the code i was using initally was the following:

www.theshow.com/scott.txt

The email that was then sent out to me was the following:

www.theshow.com/scottoutput.txt

I suppose it would be possible to split via "a space" however the number of posted fields I think varies.

Thanks again for your help so far
0
 
kanduraCommented:
I suspect they send you just the raw unencoded xml. CGI is not going to be able to help us much here, so I'm afraid we have to do it ourselves.

Let's try this:

    #!/usr/bin/perl
    use strict;
    use warnings;
    use XML::Simple;
    use Data::Dumper;

    print "Content-type: text/html\n\n";

    if($ENV{REQUEST_METHOD} eq 'POST') {
        my $buf;
        my $xml = '';

        ## read post data
        while( read(STDIN, $buf, 1024) ) {
            $xml .= $buf;
        }
       
        ## we may need to urldecode $xml here, but I can't tell
        # $xml =~ s/%([0-9a-fA-F]{2})/chr($1)/eg;

        my $mms = XMLin($xml);

        print "<pre>";

        print Dumper($mms); # this shows you the data structure that XML::Simple creates
       
        my %fields = %{$mms->{field}};
       
        foreach(sort keys %fields) {
            print "$_: $fields{$_}->{content}\n";
        }

        exit;
    }

    print "No data received";
0
 
manav_mathurCommented:
<quote>
Í'm pretty sure XML::Simple didn't just make up that file name of "acceptmms.xml".
</quote>

It does, when there is no argument to XMLin(), ir tries to search a file called scriptname.xml where scriptname.pl is the name of the script from which SMLin() is being called.
0
 
kanduraCommented:
manav_mathur,
> It does, when there is no argument to XMLin()

right! and I was still under the impression we *were* giving it an argument. but since it did make up that filename, I came to the conclusion that they're posting the raw xml without a named parameter.
Can you also take a look at how i did the post data reading? i admit to quickly writing that down without giving it much thought.
And do you know if there's a way to force CGI to give us the entire POST data? I have never been able to find that out.
0
 
kanduraCommented:
just posting a quick note: there has to be a terminating condition in the while(read...) loop to avoid reading too much data into memory.
something like this, maybe:

    my $read = 0;
    while( my $r = read(STDIN, $buf, 1024) > 0 ) {
        $xml .= $buf;
        last if $read+=$r > 1_024_000;      # don't read more than a megabyte
    }
0
 
kanduraCommented:
dreamshockDesign,

any progress on this?
0
 
dreamshockDesignAuthor Commented:
Sorry for the delay in replying (please, call me Scott, easier to type!)

I have been trying to get this going with no real avail what so ever.

With the above script, it just wouldnt mail out anything. So what i done was revert back to using the following script, which outputs the data as one long string,
then I was going to split into spaces and grab the data out that way. Then I hit a snag, the MMS data field that contains the image data, also had spaces in and
therefore screws up my ability to process the form this way.

@names = $q->param;
foreach $varname (@names)
{ $$varname = $q->param($varname);
$output.="$$varname ";
}

kandura, do you have a messenger account? mine is scott@dreamshock.com, it would be good to talk!
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.