Formulargenerator

Alles rund um Module und Plugins in CONTENIDO 4.9.
McHubi
Beiträge: 998
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

Re: Formulargenerator

Beitrag von McHubi » Mi 1. Mär 2017, 23:50

N'Abend!

Ich hab mich dann mal durchgebissen :mrgreen:

...und tatsächlich den Versand von Mails inkl. Dateianhang per mail() zum Laufen gebracht! Dazu habe ich den Aufbau der Mail-Header & Co. komplett neu zusammengestellt und dabei die Ausgabepufferung genutzt. Ist nicht auf meinem Mist gewachsen, da sei ehrenwerterweise http://webcheatsheet.com/php/send_email ... chment.php als Grundlage genannt. In Codezeilen ausgedrückt bedeutete das, den alten Teil

Code: Alles auswählen

/*##############################################*/
/*########## sending mail and displaying mailed data begin ##########*/
/*#############################################*/
/********** sending mail begin **********/
if($form_submitted!="" AND $no_errors=="true")
  {
  $ip = htmlspecialchars(strip_tags($_SERVER["REMOTE_ADDR"]));
  if($gender=="female") $gender_mail=mi18n("output email female");
    else $gender_mail=mi18n("output email male");
  //building array with recipients
  $recipients = "CMS_VALUE[100]";
  $array_recipients=array_filter(explode("//",$recipients));
  $recipients_in_array=explode("//",$recipients);
  //formatting subject of email
  $mail_subject="CMS_VALUE[200]";
  $mail_subject_variables="CMS_VALUE[210]";
  if($mail_subject_variables!="")
    {
    $array_mail_subject_variables=explode("###",$mail_subject_variables);
    foreach($array_mail_subject_variables AS $subject_variable) $mail_subject.=utf8_decode(' '.${$subject_variable});
    }
  // mail_body ist build within checking for errors section
  if($send_from_name!="" AND $send_from_email!="")
    {
	$name=$send_from_name;
	$email=$send_from_email;
	}
  $mail_header="From: ".$name." <".$email.">\n";
  $mail_header.="X-Sender-IP: ".$ip."\n";
  if($filetype=="")
  {
  $encoding = mb_detect_encoding($mail_body, "utf-8, iso-8859-1, cp-1252");
  $mail_header.="Content-Type: text/html;charset=".$encoding."\n";
  $mail_header.=nl2br($mail_body)."\n";
  $filename="";
  }
  else
    {
   $filename=$_FILES['attachment']['name'];
   if (isset($_FILES['attachment']['name']) && trim($_FILES['attachment']['name']) != "")
      {
      // Datei einlesen und codieren:
      $file_contenta=fread(fopen($_FILES['attachment']['tmp_name'],"r"),filesize($_FILES['attachment']['tmp_name']));
      $file_content=chunk_split((base64_encode($file_contenta)),72,"\n");
      // Boundary festlegen:
      $boundary=md5(uniqid(rand()));
      // Mail-Header:
      $mail_header.="MIME-Version: 1.0\n";
      $mail_header.="Content-Type: multipart/mixed;boundary=".$boundary."\n";
      $mail_header.="This is a multi-part message in MIME format.\n";
      // Mail-Text:
      $mail_header.="--".$boundary."\n";
      $encoding = mb_detect_encoding($mail_body, "utf-8, iso-8859-1, cp-1252");
      $mail_header.="Content-Type: text/html;charset=".$encoding."\n";
      $mail_header.=nl2br($mail_body)."\n";
      // Attachment:
      $mail_header.="--".$boundary."\n";
      $mail_header.="Content-Disposition: attachment;filename=".$_FILES['attachment']['name']."\n";
      $mail_header.="Content-Transfer-Encoding: base64\n";
      $mail_header.="Content-Type: ".$_FILES['attachment']['type'].";name=".$_FILES['attachment']['name']."\n";
      $mail_header.=$file_content;
      // Ende:
      $mail_header.="--".$boundary."--";
     }   
    }
  foreach($recipients_in_array as $recipient)
    {
    if (@mail($recipient,$mail_subject,"",$mail_header)) $sent = true;
      else echo "<br/>keine Verbindung zum Mailserver - bitte nochmal versuchen";
    }
/********** sending mail end **********/
/********** displaying mailed data begin **********/
  echo '<p>'.mi18n("output form following information was mailed").'</p>';
  echo $success_info; // build within checking for errors section
/********** displaying mailed data end **********/
  }
/*############################################*/
/*########## sending mail and displaying mailed data end ##########*/
/*############################################*/
?>
zu ersetzen mit

Code: Alles auswählen

/*##############################################*/
/*########## sending mail and displaying mailed data begin ##########*/
/*#############################################*/
/********** sending mail begin **********/
if($form_submitted!="" AND $no_errors=="true")
  {
  $ip = htmlspecialchars(strip_tags($_SERVER["REMOTE_ADDR"]));
  if($gender=="female") $gender_mail=mi18n("output email female");
    else $gender_mail=mi18n("output email male");
  //building array with recipients
  $recipients = "CMS_VALUE[100]";
  $array_recipients=array_filter(explode("//",$recipients));
  $recipients_in_array=explode("//",$recipients);
  //formatting subject of email
  $mail_subject="CMS_VALUE[200]";
  $mail_subject_variables="CMS_VALUE[210]";
  if($mail_subject_variables!="")
    {
    $array_mail_subject_variables=explode("###",$mail_subject_variables);
    foreach($array_mail_subject_variables AS $subject_variable) $mail_subject.=utf8_decode(' '.${$subject_variable});
    }
  // mail_body ist build within checking for errors section
  if($send_from_name!="" AND $send_from_email!="")
    {
	$name=$send_from_name;
	$email=$send_from_email;
	}
  if($filetype=="")
  {
$random_hash = md5(date('r', time()));
$headers = "From: ".$send_from_email."\r\nReply-To: ".$send_from_email;
$headers .= "\r\nContent-Type: multipart/alternative; boundary=\"PHP-alt-".$random_hash."\"";
ob_start(); //Turn on output buffering, IMPORTANT: DO NOT REMOVE ANY OF THE FOLLOWING EMPTY LINES OR ADD BLANKSPACES BEFORE THE CODELINES TILL $message = ob_get_clean();!!! OTHERWISE THE CODE WON'T WORK BECAUSE OF WRONG BUFFER-CONTENTS!!!
?>
--PHP-alt-<?php echo $random_hash; ?> 
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

<?php echo $mail_body_plain_text."\n"; ?>

--PHP-alt-<?php echo $random_hash; ?> 
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

<?php echo nl2br($mail_body)."\n"; ?>

--PHP-alt-<?php echo $random_hash; ?>--
<?php
$message = ob_get_clean();//copy current buffer contents into $message variable and delete current output buffer
  }
  else
    {
$random_hash = md5(date('r', time()));
$headers = "From: ".$send_from_email."\r\nReply-To: ".$send_from_email;
$headers .= "\r\nContent-Type: multipart/mixed; boundary=\"PHP-mixed-".$random_hash."\"";
$attachment = chunk_split(base64_encode(file_get_contents($_FILES['attachment']['tmp_name'])));
ob_start();  //Turn on output buffering, IMPORTANT: DO NOT REMOVE ANY OF THE FOLLOWING EMPTY LINES OR ADD BLANKSPACES BEFORE THE CODELINES TILL $message = ob_get_clean();!!! OTHERWISE THE CODE WON'T WORK BECAUSE OF WRONG BUFFER-CONTENTS!!!
?>
--PHP-mixed-<?php echo $random_hash; ?> 
Content-Type: multipart/alternative; boundary="PHP-alt-<?php echo $random_hash; ?>"

--PHP-alt-<?php echo $random_hash; ?> 
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

<?php echo $mail_body_plain_text."\n"; ?>

--PHP-alt-<?php echo $random_hash; ?> 
Content-Type: text/html; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit

<?php echo nl2br($mail_body)."\n"; ?>

--PHP-alt-<?php echo $random_hash; ?>--

--PHP-mixed-<?php echo $random_hash; ?> 
Content-Type: <?php echo $_FILES['attachment']['type']; ?>; name="<?php echo $_FILES['attachment']['name']; ?>"
Content-Transfer-Encoding: base64 
Content-Disposition: attachment 

<?php echo $attachment; ?>
--PHP-mixed-<?php echo $random_hash; ?>--

<?php
$message = ob_get_clean();//copy current buffer contents into $message variable and delete current output buffer
    }
  foreach($recipients_in_array as $recipient)
    {
    if (@mail($recipient,$mail_subject,$message,$headers)) $sent = true;
      else echo "<br/>keine Verbindung zum Mailserver - bitte nochmal versuchen";
    }
/********** sending mail end **********/
/********** displaying mailed data begin **********/
  echo '<p>'.mi18n("output form following information was mailed").'</p>';
  echo $success_info; // build within checking for errors section
/********** displaying mailed data end **********/
  }
/*############################################*/
/*########## sending mail and displaying mailed data end ##########*/
/*############################################*/
?>
Wichtig ist dabei, dass es "während des Bufferings" extrem auf Leerzeichen und -zeilen ankommt. Insofern auf keinen Fall zwischen ob_start(); und $message = ob_get_clean(); Leerzeichen oder Tabs zum Einrücken verwenden und auch keine Leerzeilen entfernen. Sonst funktioniert's nicht.

Zusätzlich bietet der Versand noch eine plain-text-Version. Die Inhalte hierfür werden "weiter oben" im Quelltext zusammengestellt. Die Zeilen erwähne ich hier nicht, denn die Modul-Ausgabe im Eröffnungspost ist - wie immer - auf dem neuesten Stand und kann entsprechend 1 zu 1 in Gänze ausgetauscht werden - vorher aber bitte ggf. erfolgte eigene Anpassungen notieren... :wink:
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

Die NEUAUFLAGE des Buchs zur Version 4.9: CONTENIDO für Einsteiger (4.9)

McHubi
Beiträge: 998
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

Re: Formulargenerator

Beitrag von McHubi » Do 2. Mär 2017, 20:51

Weil ich grad so schön dran war... bin ich auch gleich das Thema Responsivität noch mal angegangen. Der Aufbau des Formulars und der Übersicht nach Versand des Formulars basierte bisher auf Tabellen, was ich jetzt auf ein <div>-Konstrukt umgestellt habe. In der Mobilansicht führt das dazu, dass die Feldbezeichner nicht mehr links neben den Eingabefeldern sondern darüber platziert sind.

Wie immer: Die Quelltexte im Ausgangspost sind auf dem neuesten Stand. :D
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

Die NEUAUFLAGE des Buchs zur Version 4.9: CONTENIDO für Einsteiger (4.9)

Freddy
Beiträge: 239
Registriert: Fr 6. Mai 2005, 21:01
Wohnort: Gummersbach
Kontaktdaten:

Re: Formulargenerator

Beitrag von Freddy » Mo 9. Okt 2017, 17:25

Hallo,
hab gerade ein großes Problem beim Kontaktformular festgestellt.
Wenn ich ein Zeilenumbruch im Nachrichtentext eingeben dann kommt die Fehlermeldung "keine Verbindung zum Mailserver - bitte nochmal versuchen"
Das heißt, dass höchstwahrscheinlich viele Kontaktanfragen nicht angekommen sind. Kann mir jemand helfen bzw. kann es vermuten wo das Problem ist.Es ist sehr dringend da die Kontaktformulare online sind.

McHubi
Beiträge: 998
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

Re: Formulargenerator

Beitrag von McHubi » Mo 9. Okt 2017, 20:40

Hi,

An welche Mailadresse soll die Nachricht geschickt werden?
Viele Provider erlauben nur den Versand an Adressen, die auf die Domain lauten. Eine Nachricht an peter@meinedomain.de funktioniert dann, während peter@gmx.de nicht klappt.

Mit den Zeilenumbrüchen ist mir noch nicht untergekommen...

Habe es gerade auf einer Website getestet, die das Modul im Einsatz hat und konnte das Problem nicht nachstellen.

Edit: Im Backend Deiner Seite die neueste Version als neues Modul in neuer Vorlage in Testartikel eingebunden. Test im Frontend ergab keine Fehlermeldung. Schau mal bitte, ob bei der hinterlegten Mailadresse jetzt beide Nachrichten angekommen sind.
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

Die NEUAUFLAGE des Buchs zur Version 4.9: CONTENIDO für Einsteiger (4.9)

McHubi
Beiträge: 998
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

Re: Formulargenerator

Beitrag von McHubi » Do 31. Mai 2018, 15:20

Hallo zusammen,

ich habe das Modul um die Möglichkeit erweitert, die Mails nicht nur per mail() sondern auch SMTP zu versenden. Alle Anpassungen sind im Eröffnungspost eingearbeitet.

VG

Markus
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

Die NEUAUFLAGE des Buchs zur Version 4.9: CONTENIDO für Einsteiger (4.9)

McHubi
Beiträge: 998
Registriert: Do 18. Nov 2004, 23:06
Wohnort: Mettmann
Kontaktdaten:

Re: Formulargenerator

Beitrag von McHubi » Mi 24. Okt 2018, 19:06

Hallo zusammen,

weitere kleine Verbesserungen sind eingezogen:

EDIT 23.10.2018: Support von zusätzlichen CSS-Klassen für den Typ separator hinzugefügt. So lassen sich z. B. Hintergrundbilder usw. umsetzen. Desweiteren sind jetzt bei den types text und number leere fieldnames erlaubt.

Wie gehabt, sind die Quelltexte im Eröffnungspost entsprechend angepasst.
seamless-design.de
"Geht nicht!" wohnt in der "Will nicht!"-Strasse.

Die NEUAUFLAGE des Buchs zur Version 4.9: CONTENIDO für Einsteiger (4.9)

Antworten