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

Gesperrt
derTom
Beiträge: 21
Registriert: Fr 20. Jan 2006, 14:32
Wohnort: München
Kontaktdaten:

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

Beitrag von derTom » So 11. Feb 2007, 16:28

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
Zuletzt geändert von derTom am Do 15. Feb 2007, 23:40, insgesamt 1-mal geändert.

knb
Beiträge: 224
Registriert: Fr 9. Sep 2005, 14:03
Wohnort: Potsdam
Kontaktdaten:

Beitrag von knb » Mo 12. Feb 2007, 10:47

Du hast vergessen die Tabelle con_sequence zu berücksichtigen: die zuletzt vergebene id zu holen und nach dem Import diese zu updaten.
Gruss,
Knut

HerrB
Beiträge: 6935
Registriert: Do 22. Mai 2003, 12:44
Wohnort: Berlin
Kontaktdaten:

Beitrag von HerrB » Di 13. Feb 2007, 14:56

Eine entsprechende Funktion (ich glaube, ich muss das auf Basis einer .csv-Datei noch nachrüsten) kommt in der nächsten Version.

Gruß
HerrB
Bitte keine unaufgeforderten PMs oder E-Mails -> use da Forum!

Newsletter: V4.4.x | V4.6.0-15 (Module, Backend) | V4.6.22+
Standardartikelliste: V4.4.x | V4.6.x
http://www.contenido.org/forum/search.php | http://faq.contenido.org | http://www.communido.net

derTom
Beiträge: 21
Registriert: Fr 20. Jan 2006, 14:32
Wohnort: München
Kontaktdaten:

Update!

Beitrag von derTom » Do 15. Feb 2007, 23:39

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!

homepager
Beiträge: 29
Registriert: Di 2. Mai 2006, 19:03
Kontaktdaten:

wie funktioniert der import

Beitrag von homepager » Di 20. Feb 2007, 21:00

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!

derTom
Beiträge: 21
Registriert: Fr 20. Jan 2006, 14:32
Wohnort: München
Kontaktdaten:

Beitrag von derTom » Di 20. Feb 2007, 23:03

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 :-)

homepager
Beiträge: 29
Registriert: Di 2. Mai 2006, 19:03
Kontaktdaten:

Beitrag von homepager » Di 20. Feb 2007, 23:35

merci!! funktioniert!

derTom
Beiträge: 21
Registriert: Fr 20. Jan 2006, 14:32
Wohnort: München
Kontaktdaten:

Beitrag von derTom » Di 20. Feb 2007, 23:37

Das hört man gern :-)

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

Beitrag von Freddy » Mo 30. Apr 2007, 12:32

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.

derTom
Beiträge: 21
Registriert: Fr 20. Jan 2006, 14:32
Wohnort: München
Kontaktdaten:

Beitrag von derTom » Sa 5. Mai 2007, 11:27

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

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

Beitrag von Freddy » Sa 5. Mai 2007, 12:42

Das wäre supertoll.

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

Beitrag von Freddy » Mo 28. Mai 2007, 15:37

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.

knb
Beiträge: 224
Registriert: Fr 9. Sep 2005, 14:03
Wohnort: Potsdam
Kontaktdaten:

Beitrag von knb » Di 29. Mai 2007, 12:36

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.
Gruss,
Knut

knb
Beiträge: 224
Registriert: Fr 9. Sep 2005, 14:03
Wohnort: Potsdam
Kontaktdaten:

Beitrag von knb » Di 29. Mai 2007, 12:47

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"
Gruss,
Knut

Gesperrt