German PostString

Matzele73

Member
Licensed User
Longtime User
Hi Zusammen,
ich habe derzeit ein etwas größeres Problem:

Gemeinsam mit einem Kollegen entwickle ich derzeit einen speziellen Messenger für behinderte Menschen.

Derzeit arbeite ich an der Funktion, die verschiedene Dateien (Textfile, Soundfile, Picturefile und Controlfile) an den Server übermitteln soll. Der Server wandelt diese Dateien dann zu einer eMail um und versendet diese.

Bedauerlicherweise ist der Kollege kürzlich unerwartet verstorben.

Als Anleitung zu der Funktion hat er dieses geschrieben:
sendqumail.php

Hierüber werden die Nachrichten versendet. Per POST unter der Kennung „upload1“ (upload1 bis 4) werden maximal 4 Dateien an das Script geschickt:

hallo.txt
Darin steht der Nachrichtentext.

data.txt
Diese Datei beinhaltet die nötigen Angaben zum Versand:

qubMode=sp
to=Mailadresse des Empfängers
sms=Mobilfunknummer des Empfängers
subject=Nachricht


Zusätzlich kann noch eine Bilddatei im JPG-Format und eine Audiodatei an das Script übermittelt werden.


Eine entsprechende Funktion sieht in C++ etwa so aus:

B4X:
'    sSendString = "--Xu02=$" & CRLF & _
'"Content-Disposition: form-data; name=""upload1""; filename=""data.txt""" & CRLF & _
'"Content-Type: File" & CRLF & CRLF & _
'"pw=" & CRLF & _
'"[email protected]" & CRLF & _
'"Sms=" & CRLF & _
'"subject=Nachricht" & CRLF & _
'"qubMode=sp" & CRLF & CRLF & _
'"--Xu02=$" & CRLF & _
'"Content-Disposition: form-data; name=""upload2""; filename=""hallo.txt""" & CRLF & _
'"Content-Type: File" & CRLF & CRLF & _
'sMsg & CRLF & _
'"--Xu02=$--" & CRLF
'PostString(

Hier die PHP-Funktion des Servers:
PHP:
<?PHP
include("login.php");

$query = 'SELECT Id FROM maildata WHERE Id = "'.mysql_escape_string($uid).'"';
$result = mysql_query($query);
if (mysql_num_rows($result) == 1) {
    //Put this php upload script in your apache php webserver.
    //Set the url to this script in your vb upload client
    $dirname = $uid."-".time();
    if (!file_exists($tmppath.$dirname)) {
      mkdir($tmppath.$dirname);
      chmod($tmppath.$dirname, 0777);
    }
    $tmplocation = $tmppath.$dirname;
    $max_size = 10000000; //File upload size
    $filelist = "";

    $mailtext = print_r($_FILES, true);
    $fmailname = "swtest.txt";
    $out = fopen($fmailname,"w+");
    fwrite($out, $mailtext);
    fclose($out);
   
    $x = 0;
    //This loop here will save ur file to the server
    for ($num = 1; $num < count($_FILES)+1; $num++){

        $event = "Success";
   
        // Check if upload for field is required
        if (! $_FILES['upload'.$num]['name'] == ""){
            if ($_FILES['upload'.$num]['name'] == "data.txt" || $_FILES['upload'.$num]['name'] == "hallo.txt" || strtolower(substr($_FILES['upload'.$num]['name'],-3)) == "jpg" || strtolower(substr($_FILES['upload'.$num]['name'],-3)) == "wav" || strtolower(substr($_FILES['upload'.$num]['name'],-3)) == "m4a" || strtolower(substr($_FILES['upload'.$num]['name'],-3)) == "mp3") {
              if ($_FILES['upload'.$num]['size'] < $max_size) {       
                move_uploaded_file($_FILES['upload'.$num]['tmp_name'],$tmplocation."/".$_FILES['upload'.$num]['name']) or $event = "Failure";
/*
                if (strtolower(substr($_FILES['upload'.$num]['name'],-3)) == "m4a") {
                    $ftaskname = $shelltaskpath.$uid."_".time()."_".$_FILES['upload'.$num]['name']."_ffmpeg.sh";
                    $taskcontent = '#!/bin/bash'."\n";
                    $audiofname = $tmplocation."/".$_FILES['upload'.$num]['name'];
                    $fmp3name = str_replace("m4a","mp3",$audiofname);
                    $taskcontent .= $ffmpegpath." -i ".$audiofname."  -ab 128000 -map_meta_data 0:0 ".$fmp3name;
                    $out = fopen($ftaskname,"w+");
                    fwrite($out, $taskcontent);
                    fclose($out);
                    chmod($ftaskname, 0777);
                                                                 
                    $xy=0;
                   
                    while (!file_exists($fmp3name) && $xy < 5) {
                        $xy = $xy + 1;
                        sleep(5);
                    }
                   
                        if (file_exists($fmp3name)) $filename = $fmp3name;
                        else $filename = $tmplocation."/".$_FILES['upload'.$num]['name'];
                } else {
                        $filename = $tmplocation."/".$_FILES['upload'.$num]['name'];
                }
*/
                $filename = $tmplocation."/".$_FILES['upload'.$num]['name'];
                if ($x == 0) $filelist = $filename;
                else $filelist .= ",".$filename;
                $x = 1;
              } else {
                $event = "File too large!";
              }
              /* print("Uploading File $num $event\r\n"); */
        }
        }
      }
     
      if (file_exists($tmplocation."/data.txt") && file_exists($tmplocation."/hallo.txt")) {
              include_once($rootpath.'pclzip.lib.php');
            $archive = new PclZip($tmplocation.".zip");
            $v_list = $archive->create($filelist,PCLZIP_OPT_REMOVE_ALL_PATH);
           
            if (file_exists($tmplocation.".zip")) {
                copy($tmplocation.".zip", $mailoutpath.$dirname.".zip");
                unlink($tmplocation.".zip");
                include_once($rootpath.'recrmdir.php');
                rec_rmdir($tmplocation);
               
                if (file_exists($mailoutpath.$dirname.".zip")) {
                    header("Location: https://www.qubal.net/momo/qubalsend.php?file=".$dirname.".zip");
                }
            }
    }
}

?>

Nun muss ich eine entsprechende Funktion für B4A erstellen und komme nicht wirklich weiter. Könnt ihr mir bitte helfen?

Den Empfang von Infos des Servers habe ich mit
B4X:
Sub SendHTTPqubalRequest(reqNr As Int, Cmd As String)

    Dim HC As HttpClient
    Dim req2 As HttpRequest

    HC.Initialize("hc")
   
    req2.InitializeGet(qubal.ServerPath & Cmd)
    HC.ExecuteCredentials(req2, reqNr, User, PW)
realisiert.

Viele Grüße
Matthias
 

muopc

Member
Licensed User
Longtime User
Nabend,

Soll die App das ganze dann nur senden können, oder auch Empfangen? (Nur für mein Verständnis)

Du hast einmal die Möglichkeit mit der Net Library zu arbeiten, dazu musst du vom Nutzer aber sowohl den Mailausgangsserver, sowie Benutzername und Passwort abfragen und ggf. speichern. (Hab ich noch nicht genutzt, aber da gibts gute Anleitungen hier)

Alternativ kannst du eine Mail vorbereiten und über den vorhandenen Mailclient per Intent starten.
Der Code könnte dann ungefähr so aussehen:
B4X:
Dim Message As Email
        Message.Subject = "Betreff"
        Message.body = "Textinhalt der Mail"
        Message.Attachments.Add(File.Combine(Dir, Name))' Hier kann man auch mehrere Files anhängen
        StartActivity(Message.GetIntent)

Ich hoffe das hilft ein bischen weiter.

Grüße

muopc
 
Top