Seite 1 von 1

Tool: E-Mail Import - Update: jetzt mit Gruppenzuweisung

Verfasst: So 11. Feb 2007, 16:28
von derTom
Hallo zusammen,

ein Kunde von mir will mit Contenido seine Newsletter verschicken. Da er ca. 5000 E-Mail Adressen in einem Excel-Sheet gespeichert hat und diese nicht manuell eingeben will, hab ich ein kleines CSV-Import Skript geschrieben.

Das Skript muss in contenido/tools mit dem Namen email_import.php gespeichert werden.
Jede zu importierende E-Mail Adresse muss in der textarea in einer neuen Zeile stehen und dieses Format aufweisen: Vorname; Nachname; E-Mail Adresse

Da ich keine Login-Funktion o. ä. eingebaut habe, soll das Skript nach dem Import wieder gelöscht werden.

Falls es jemand brauchen kann, hier der Code:

Code: Alles auswählen

<?php
require('../includes/config.php');
require('../includes/cfg_sql.inc.php');
mysql_select_db($contenido_database, mysql_connect($contenido_host, $contenido_user, $contenido_password)); 

$summary = '';
if(isset($_POST['import']) && !empty($_POST['rcps']))
{
	$last_id_sql = 'SELECT idnewsrcp FROM ' . $cfg["tab"]["news_rcp"] . ' ORDER BY idnewsrcp DESC LIMIT 0,1';
	$last_id = mysql_fetch_assoc(mysql_query($last_id_sql));
	$new_id = $last_id['idnewsrcp'] + 1;
	
	$newrcps = split("\n", $_POST['rcps']);
	$k = 0;
	foreach($newrcps as $rcp)
	{
		$r = explode(";", $rcp);
		foreach($r as $j => $i)
		{
			$r[$j] = ($j == 2) ? strtolower(urlencode(trim($i))) : urlencode(trim($i));
		}
		$time = date("Y-m-d H:i:s", time());
		$import_sql = "INSERT INTO " . $cfg["tab"]["news_rcp"] . " VALUES
										(" . $new_id . ", " . $_POST['idclient'] . ", " . $_POST['idlang'] . ", '" . $r[2] . "', 1, '" . $time . "', NULL, '" . $r[0] . '+' . $r[1] . "',
										'" . substr(md5(rand()),0,17) . uniqid("") . "', 0, '" . md5($_POST['author']) . "', '" . $time . "', '" . $time . "', '" . md5($_POST['author']) . "')";
		if($import = mysql_query($import_sql))
		{
			$new_id++;
			$k++;
		}		
	}
	$summary = $k . ' E-Mail Empf&auml;nger wurden hinzugef&uuml;gt.';
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>E-Mail Import</title>
<style>
* { font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; }
</style>
</head>
<body style="background-color:#ddd;">
<form method="post" action="email_import.php">
Format: Vorname; Nachname; E-Mail-Adresse<br />
<textarea style="width:800px; height:300px; border:1px solid #999;" name="rcps"></textarea><br />
<br />
Uploader:<br />
<input type="text" name="author" value="sysadmin" /><br />
ID-Client:<br />
<input type="text" name="idclient" value="1" /><br />
ID-Language:<br />
<input type="text" name="idlang" value="1" /><br /><br />
<input type="submit" name="import" value="Importieren" />
</form>
<br />
<?php echo $summary; ?>
</body>
</html>
Bei mir hat der Import problemlos funktioniert.

Falls jemand Verbesserungsvorschläge hat, einfach raus damit ;-)
Viel Spaß damit und Grüße,
Tom

Verfasst: Mo 12. Feb 2007, 10:47
von knb
Du hast vergessen die Tabelle con_sequence zu berücksichtigen: die zuletzt vergebene id zu holen und nach dem Import diese zu updaten.

Verfasst: Di 13. Feb 2007, 14:56
von HerrB
Eine entsprechende Funktion (ich glaube, ich muss das auf Basis einer .csv-Datei noch nachrüsten) kommt in der nächsten Version.

Gruß
HerrB

Update!

Verfasst: Do 15. Feb 2007, 23:39
von derTom
Hallo zusammen!

Bis die neue Version kommt, müsst ihr mit dieser Version Vorlieb nehmen :-)

Da der Kunde beim Import die Empfänger zu einer Gruppe (muss vorher angelegt werden) zuweisen will, hab ich diese Funktion (und den Update in der sequence-Tabelle) integriert.
Die Gruppe kann man jetzt per Drop-Down auswählen.
Falls die E-Mail Adresse bei einem Empfänger fehlt, wird dieser nicht eingetragen.

Voilà, der Code:

Code: Alles auswählen

<?php
require('../includes/config.php');
require('../includes/cfg_sql.inc.php');

mysql_select_db($contenido_database, mysql_connect($contenido_host, $contenido_user, $contenido_password)); 

function get_next_id($value)
{
	global $cfg;
	$new_id = "SELECT nextid FROM " . $cfg["tab"]["sequence"] . " WHERE seq_name = '" . $value . "'";
	$next_id = mysql_fetch_assoc(mysql_query($new_id));
	$next_id = $next_id['nextid'];
	$next_id++;
	return $next_id;
}

function get_groups()
{
	global $cfg;
	$groups = "SELECT idnewsgroup, groupname FROM " . $cfg["tab"]["news_groups"] . " ORDER BY groupname ASC";
	$groups = mysql_query($groups);
	$opt_str = '';
	while($a = @mysql_fetch_assoc($groups))
	{
		$opt_str .= '<option value="' . $a['idnewsgroup'] . '">' . urldecode($a['groupname']) . '</option>';
	}
	$s = '<select name="idgroup">
					<option value="">keine Gruppe</option>
					' . $opt_str . '
				</select>';
	echo $s;
}

$summary = '';
if(isset($_POST['import']) && !empty($_POST['rcps']))
{
	$new_id = get_next_id($cfg["tab"]["news_rcp"]);
	$newrcps = split("\n", $_POST['rcps']);
	$k = 0;
	$e = 0;
	foreach($newrcps as $rcp)
	{
		$r = explode(";", $rcp);
		foreach($r as $j => $i)
		{
			$r[$j] = ($j == 2) ? strtolower(urlencode(trim($i))) : urlencode(trim($i));
		}
		$time = date("Y-m-d H:i:s", time());
		$import_sql = "INSERT INTO " . $cfg["tab"]["news_rcp"] . " VALUES
										(" . $new_id . ", " . $_POST['idclient'] . ", " . $_POST['idlang'] . ", '" . $r[2] . "', 1, '" . $time . "', NULL, '" . $r[0] . '+' . $r[1] . "',
										'" . substr(md5(rand()),0,17) . uniqid("") . "', 0, '" . md5($_POST['author']) . "', '" . $time . "', '" . $time . "', '" . md5($_POST['author']) . "')";
		if($_POST['idgroup'] != '')
		{
			$next_group_id = get_next_id($cfg["tab"]["news_groupmembers"]);
			$group_import = "INSERT INTO " . $cfg["tab"]["news_groupmembers"] . " VALUES (" . $next_group_id . ", " . (int) $_POST['idgroup'] . ", " . $new_id . ")";
			mysql_query($group_import);
			$update_group_sequence = "UPDATE " . $cfg["tab"]["sequence"] . " SET nextid = " . $next_group_id . " WHERE seq_name = '" . $cfg["tab"]["news_groupmembers"] . "'";
			mysql_query($update_group_sequence);
		}
		if($r[2] != '')
		{
			$import = mysql_query($import_sql);
			$k++;
			$new_id++;
		}
		else
		{
			$e++;
		}
		$update_sequence = "UPDATE " . $cfg["tab"]["sequence"] . " SET nextid = " . $new_id . " WHERE seq_name = '" . $cfg["tab"]["news_rcp"] . "'";
		mysql_query($update_sequence);
	}
	$seq_nextid = $k;
	$summary = $k . ' E-Mail Empf&auml;nger wurden hinzugef&uuml;gt.<br />' . $e . ' wurden nicht eingetragen (keine E-Mail-Adresse)';
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>E-Mail Import</title>
<style>
* { font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; }
</style>
</head>
<body style="background-color:#ddd;">
<form method="post" action="email_import.php">
Format: Vorname; Nachname; E-Mail-Adresse<br />
<textarea style="width:800px; height:300px; border:1px solid #999;" name="rcps"></textarea><br />
<br />
ID-Group:<br />
<?php get_groups() ?><br />
Uploader:<br />
<input type="text" name="author" value="sysadmin" /><br />
ID-Client:<br />
<input type="text" name="idclient" value="1" /><br />
ID-Language:<br />
<input type="text" name="idlang" value="1" /><br /><br />
<input type="submit" name="import" value="Importieren" />
</form>
<br />
<?php echo $summary; ?>
</body>
</html>
Falls sich der Fehlerteufel eingeschlichen hat, bitte melden!

wie funktioniert der import

Verfasst: Di 20. Feb 2007, 21:00
von homepager
Habe die email_import.php im tools-Verzeichnis gespeichert. Aber wie geht´s jetzt weiter? Wie komme ich nun zum Import?
Sorry, bin blutiger Anfänger!

Verfasst: Di 20. Feb 2007, 23:03
von derTom
Hallo homepager,

du musst nun das Script direkt über den Browser aufrufen, also beispielsweise
http://www.deine-domain.de/contenido/to ... import.php

Es erscheint dann ein Formular. In die Textarea gibst du deine E-Mail Adressen ein:
Vorname1;Nachname1;E-Mail1
Vorname2;Nachname2;E-Mail2

Dann kannst du noch die Gruppe, zu der die Adressen gehören sollen, im Dropdown auswählen (musst du aber nicht).

Bei Uploader gibst du deinen Benutzernamen, mit dem du dich ins Backend einloggen kannst, an.

Das war's eigentlich auch schon :-)

Verfasst: Di 20. Feb 2007, 23:35
von homepager
merci!! funktioniert!

Verfasst: Di 20. Feb 2007, 23:37
von derTom
Das hört man gern :-)

Verfasst: Mo 30. Apr 2007, 12:32
von Freddy
Vielen Dank erstmal für den Script.
Ist es eigentlich möglich das Script so umzuschreiben das zuerst überprüft ob die Emailadresse schon existiert bevor sie importiert wird? Bin selber leider kein Coder. Wäre super praktisch.

Verfasst: Sa 5. Mai 2007, 11:27
von derTom
Hallo Freddy,

im Grunde ist es kein Problem, noch so eine Abfrage einzubauen.
Leider ist bei mir momentan Land unter und habe keine Zeit dafür.
Wenn ich mal wieder Luft habe wird das erledigt...

Gruß
Tom

Verfasst: Sa 5. Mai 2007, 12:42
von Freddy
Das wäre supertoll.

Verfasst: Mo 28. Mai 2007, 15:37
von Freddy
Hallo Tom, wollte nochmal nachfragen ob Du Dir zwischendurch die Zeit nehmen kannst dein Modul mit der Abfrage nach doppelten Emailadressen zu erweitern. Wäre echt super nett und toll.

Verfasst: Di 29. Mai 2007, 12:36
von knb
Freddy, Du kannst das auch selber implementieren, indem Du vor dem Import einen unique-Index auf die Spalte email in Tabelle <prefix>_news_rcp legst. Entweder mit phpmysqladmin oder so, per SQL:

Code: Alles auswählen

ALTER TABLE `<prefix>_news_rcp` ADD UNIQUE (
`email`
)
Dann hinterher, nach dem Import, den index wieder droppen. (Dies ist optional)

Code: Alles auswählen

 ALTER TABLE `<prefix>_news_rcp` DROP INDEX `email` 
Das gleiche ilt eigentlich auch für die Tabelle <prefix>_news_groupmembers.

Code: Alles auswählen

 ALTER TABLE `<prefix>_news_groupmembers` ADD UNIQUE (
`idnewsgroup` ,
`idnewsrcp`
);
Dies verhindert dass die Members mehrfach der gleichen Gruppe zugeordnet werden.

Verfasst: Di 29. Mai 2007, 12:47
von knb
sonst kannst Du dir auch von PHPmysqladmin PHP code generieren lassen und dies in das Script einfügen:

Code: Alles auswählen

$sql = 'ALTER TABLE `<prefix>_news_rcp` ADD UNIQUE(`email`)';
 mysql_query($sql); 
$sql = 'ALTER TABLE `<prefix>_news_groupmembers` ADD UNIQUE( `idnewsgroup`, `idnewsrcp`);';
 mysql_query($sql); ;
hinter

Code: Alles auswählen

   $k = 0;
   $e = 0; 
Wenn die Indizes schon existieren, gibts wohl ein paar Warnungen, die man einfach ignorieren kann.

Ungetestet.

PS. dein prefix ist wahrscheinlich "con"