Spamfreie E-Mails mit eigenem Server versenden

Wer eine eigene Domain besitzt, steht vor der Entscheidung die E-Mails auf ein Konto bei Anbietern wie Google Mail, GMX oder Web.de weiterzuleiten oder ein sich beim Hoster ein eigenes Konto für die E-Mail-Adresse einzurichten. Für letzteren Fall bieten Hosting-Provider wie Host Europe in der Regel einen eigenen Mailserver an, der bereits über eine entsprechende vorgefertigte Konfiguration verfügt. So werden auch passende DNS-Einträge der Domain beim Hoster automatisch gesetzt. Ganz bequem also. Doch sobald ein eigener Server im Einsatz ist, wird es möglicherweise schon etwas kniffeliger, um mit versendeten E-Mails nicht im Spam-Order des Empfängers zu landen. Wie ist dies also einzustellen?

weiterlesen

Site-to-Site-Transfer (FXP) auf Server aktivieren

Folgendes Szenario:
Wir besitzen zwei verschiedene Server und möchten Daten via FTP von Server A auf Server B transferieren. Die einfachste und herkömmliche Methode wäre hierbei die Daten von Server A herunterzuladen und sie anschließend bei Server B wieder hochzuladen. Dieser Umweg kann insbesondere bei einer Vielzahl an Daten sehr langwierig sein.

Abhilfe für dieses Problem schafft das sogenannte File eXchange Protocol (FXP), welches einen Site-to-Site-Transfer von zwischen zwei Servern herstellt und eine direkte Datenübertragung ermöglicht.

weiterlesen

Typo3 autoload-Cache leeren bei Klick auf Typo3-Blitz und „alle Caches leeren“

Während der Entwicklung von Typo3-Extensions ändert, erstellt und erweitert man häufig Klassen in seinem eigenen Namespace. Durch das (sinnvolle) Typo3-Caching werden diese Klassennamen und Pfade in einer PHP-Datei gecached (typo3conf/autoload/autoload_classmap.php).

Leider greift der Klick auf den „Typo3 Blitz“ mit der Option „Alle Caches leeren“ nicht, um auch diese Dateien neu aufzubauen. Typo3 zwingt den Entwickler ins Install-Tool und dort zu der Option „Create autoload information for extensions“. Dieser Wechsel ist relativ nervig – und eine klassische Frustrations-Quelle, wenn im Frontend mal wieder das „striped Zebra of death“ mit einem Fatal Error erscheint.

weiterlesen

Eigenes Custom Form Element für tx_form-Extension – Typo3 v8

How-To für das Erstellen eines Custom Form Elements für die tx_form-Extension unter Typo3 v8.

Falls man ein Custom Form Element erstellen möchte, haltet euch an das How-To. Für detaillierte Informationen und die Dokumentation zur ext:form besucht: https://docs.typo3.org/typo3cms/extensions/form/Index.html

Außerdem haben wir eine „Anleitung für Dummies und Normalsterbliche, die einfach einen Job zu erledigen haben“ erstellt – eine Kurzfassung mit farblicher Kennzeichnung und einem simplen Online-Generator.

weiterlesen

Spam-Rekord

Wenn es ein Guiness World Record für Spam-Mails gäbe – hier wäre ein potentieller Kandidat. Die meisten Spam-Werte lagen bei den Mails an uns zwischen 3 und 10 Punkten – diese Mail hatte es zu 37.1 Punkten geschafft. Respekt!

X-ACL-Warn: Message does not conform to RFC2822 standard
X-HE-Spam-Level: +++++++++++++++++++++++++++++++++++++
X-HE-Spam-Score: 37.1
X-HE-Spam-Report: Content analysis details:   (37.1 points)
 pts rule name              description
---- ---------------------- --------------------------------------------------
 0.5 RCVD_IN_PBL            RBL: Received via a relay in Spamhaus PBL
                            [49.202.68.127 listed in zen.spamhaus.org]
 0.9 URIBL_RHS_DOB          Contains an URI of a new domain (Day Old Bread)
                            [URIs: upforrolex.com]
 5.0 URIBL_AB_SURBL         Contains an URL listed in the AB SURBL blocklist
                            [URIs: upforrolex.com]
 5.0 URIBL_WS_SURBL         Contains an URL listed in the WS SURBL blocklist
                            [URIs: upforrolex.com]
 2.9 URIBL_JP_SURBL         Contains an URL listed in the JP SURBL blocklist
                            [URIs: upforrolex.com]
 2.5 URIBL_SC_SURBL         Contains an URL listed in the SC SURBL blocklist
                            [URIs: upforrolex.com]
 0.0 MISSING_DATE           Missing Date: header
 1.5 HTML_IMAGE_ONLY_28     BODY: HTML: images with 2400-2800 bytes of words
 2.5 HE_LOGINHASH           BODY: Hosteurope says its spam (Found in Spamtrap)
 0.1 HTML_MESSAGE           BODY: HTML included in message
 1.5 GENERIC_IXHASH         BODY: iXhash found in ix.dnsbl.manitu.net
 0.7 MIME_HTML_ONLY         BODY: Message only has text/html MIME parts
 1.8 MIME_QP_LONG_LINE      RAW: Quoted-printable line longer than 76 chars
 0.5 HE_CPSD                HE Phishing & Scam detected
 2.5 URIBL_SBL              Contains an URL listed in the SBL blocklist
                            [URIs: upforrolex.com]
 0.0 RDNS_NONE              Delivered to trusted network by a host with no rDNS
 1.7 SARE_SPEC_ROLEX        Rolex watch spam
 7.5 HE_CPSD_SANE           SPAM found by SaneSecurity signatures
X-SPAM-FLAG: Yes

Rich-Text-Editor (RTE) in Typo3 reduzieren

Der RTE-Editor in Typo3 ist eine tolle Sache und die Entwickler-Gemeinde hat sich verausgabt, so ziemlich alles und jede Editiermöglichkeit im Text anzubieten. Problem ist aber, dass die Werkzeugleisten dadurch ziemlich überfrachtet sind und dem Kunden fast schon zu viele Möglichkeiten bieten, die Texte zu formatieren.
In der Praxis haben wir uns angewöhnt, die Werkzeugleiste auf ein absolutes Minimum zu reduzieren. Und das geht so: Ins TypoScript-Setup der Seite (Unter „Seiteneigenschaften -> Optionen -> TSconfig“) kommt dieses kurze TypoScript:

RTE.default {
   contentCSS = /fileadmin/layout/css/rte.css
   showButtons = bold, italic, subscript, superscript, orderedlist, unorderedlist, line, link, image, bar, table, toggleborders, tableproperties, rowproperties, rowinsertabove, rowinsertunder, rowdelete, rowsplit, columninsertbefore, columninsertafter, columndelete, columnsplit, cellproperties, cellinsertbefore, cellinsertafter, celldelete, cellsplit, cellmerge   
   hideButtons = textstyle, fontstyle, formatblock, fontsize, strikethrough,lefttoright, righttoleft, textcolor, bgcolor, textindicator, emoticon, user, spellcheck, chMode, inserttag, outdent, indent, justifyfull,  acronym, copy, cut, paste, textstylelabel, blockstyle, blockstylelabel, underline, left, center, right, insertcharacter, removeformat, findreplace, insertcharacter, undo, redo, showhelp, about
}

Mehrzeilige GMENU-Menüs in Typo3 (Zeilenumbrüche bei GMENU)

Problem: Man möchte ein GMENU (Grafisches Menü) mit mehrzeiligem Text erzeugen. Das geht relativ einfach mit diesem TypoScript:

lib.hauptmenue {

   entryLevel = 0
   special = directory

  // Hier kommt die Page-ID der Haupt-Seite hin...
   special.value = 7
   
   1 = GMENU
   1.expAll = 0
   1.wrap = 
   
   1.NO = 1
   1.NO {
      wrap = 
|
|*|
|
|*|
|
//wrap =
|
XY = 150, 20+[20.h] transparentBackground = 1 backColor = #220E05 transparentColor = #220E05 10 = TEXT 10 { text.field = nav_title // title text.listNum.splitChar = 13 text.listNum = 0 text.case = upper text.align = right offset = 140-[10.w],15 fontColor = #ffffff fontFile = fileadmin/fonts/seriasans_regular.ttf fontSize = 19 niceText = 1 antiAlias = 0 } 20 < .10 20 { text.listNum = 1 offset = 140-[20.w],10 } } 1.CUR < .1.NO 1.CUR { wrap =
|
|*|
|
|*|
|
10.fontFile = fileadmin/fonts/seriasans_bold.ttf 20.fontFile = fileadmin/fonts/seriasans_bold.ttf 10.fontColor = #FFCC54 20.fontColor = #FFCC54 } 1.ACT < .1.CUR 1.RO < .1.NO 1.RO { 10.fontColor = #FFCC54 20.fontColor = #FFCC54 } }

Um die Felder "Navigations-Titel" (nav_title) und "Seiten-Titel" (title) im Backend mehrzeilig zu machen kann man die Datei extTables.php um folgende Zeilen ergänzen:

$TCA['pages']['columns']['title']['config']['type'] = 'text';
$TCA['pages']['columns']['title']['config']['rows'] = '2';

$TCA['pages']['columns']['nav_title']['config']['type'] = 'text';
$TCA['pages']['columns']['nav_title']['config']['rows'] = '2';

Mehrzeilige TMENU-Menüs in Typo3 (Zeilenumbrüche bei TMENU)

Problem: Man möchte ein TMENU mit mehrzeiligem Text in den Menüpunkten erzeugen. Dazu kann man eine Kombination aus einem COA und dem splitChar verwenden. Hier wird das Trennzeichen chr(13) verwendet.

Als TypoScript für den Menüaufbau verwendet man:

1 = TMENU
1.wrap = |
1.expAll = 0
   
1.NO = 1
1.NO {
   wrapItemAndSub = 
  • |
   1 = COA    1.10 = TEXT    1.10 {       field = nav_title // title       listNum = 0       listNum.splitChar = 13    }           1.20 < .1.10    1.20.listNum = 1    1.20.wrap =
|    1.20.required = 1           stdWrap.field >    stdWrap.cObject = TEXT    stdWrap.cObject < .1 }

Um die Felder "Navigations-Titel" (nav_title) und "Seiten-Titel" (title) im Backend mehrzeilig zu machen kann man die Datei extTables.php um folgende Zeilen ergänzen:

$TCA['pages']['columns']['title']['config']['type'] = 'text';
$TCA['pages']['columns']['title']['config']['rows'] = '2';

$TCA['pages']['columns']['nav_title']['config']['type'] = 'text';
$TCA['pages']['columns']['nav_title']['config']['rows'] = '2';

Update 2014:

Alternativ zum Beispiel oben funktioniert es auch so:

1 = TMENU
1.wrap = |
1.expAll = 0
   
1.NO = 1
1.NO {
   wrapItemAndSub = 
  • |
   stdWrap.cObject = COA stdWrap.cObject { 10 = TEXT 10 { field = nav_title // title listNum = 0 listNum.splitChar = 13 } 20 < .10 20 { listNum = 1 wrap =
| trim = 1 } } }

Bezier-Leckerbissen

[SWF]http://labor.99grad.de/wp-content/uploads/2009/12/beispiel.swf,400,300[/SWF]

Das Skript bewegt einen MovieClip entlang einer Bezier-Kurve. Die Knotenpunkte (Ankerpunkte) der Bewegung können als Array angegeben werden. Ich benutze die ZigoEngine um ein sanftes Beschleunigen und Abbremsen zu machen.

import com.mosesSupposes.fuse.*;
ZigoEngine.simpleSetup(PennerEasing, Shortcuts);

gCounter = {cnt:0};
ZigoEngine.doTween ( gCounter, "cnt", 100, 5, 'easeInOutQuint', 0, {updFunc:update_position} );

function update_position () {
	var f = gCounter.cnt;
	var obj = bezier_curve_point( [[90,300], [120,130], [370,300], [430,60]], f, 100 );
	ball_mc._x = obj.x;
	ball_mc._y = obj.y;
}

function bezier_curve_point ( pt, c, d ) {
	var a = 1-1/d*c;
	var b = 1-a;
	return {x:pt[0][0]*(a*a*a) + pt[1][0]*3*(a*a)*b + pt[2][0]*3*a*b*b + pt[3][0]*b*b*b, y:pt[0][1]*(a*a*a) + pt[1][1]*3*(a*a)*b + pt[2][1]*3*a*b*b + pt[3][1]*b*b*b }
}

Download der FLA-Datei
Download der ZigoEngine

Midi-Daten in Flash empfangen, Midi-Daten in Flash auswerten, Midi-Daten aus Flash senden

Wir haben für ein Projekt nach einer einfachen Art gesucht, Midi-Signale in Flash zu empfangen und von Flash aus Midi-Signale zu senden. Die Lösungen, die wir im Netzgefunden haben waren teilweise zu kompliziert im Setup oder haben gar nicht funktioniert.

Das Ergebnis ist ein kleines Paket, bestehend aus einer Java-Applikation (wir haben sie „Midimicrobe“ genannt) und einer Klasse für Flash (Midi.as).

Für Eilige:

  1. Midi-Microbe (für Mac OSX) runterladen.
  2. Das Midimicrobe-Programm starten und im Hintergrund laufen lassen.
  3. Den Flash-Testfilm test.swf starten.
  4. Ein Midi-Signal erzeugen (z.B. über ein Keyboard, Trigger Finger oder mit dem kleinen, sehr hilfreichen virtuellen Keyboard MidiKeys und schauen, was passiert!

Mögliche Anwendungsbeispiele für die Flash-Midi-Anbindung:

  • m-audio Trigger Finger oder ein Keyboard verwenden, um Videos, Sounds oder Animationen in Flash zu steuern (eines unserer Motivationen bei der Entwicklung)
  • Sound-Visualiserungen in Flash
  • Auswertung von Sensor-Daten, z.B. von Boden-Sensoren, Touchscreens oder Panels. Eben alles, was Midi-Daten bereitstellen kann – perfekt für Rauminstallationen oder interaktive Ausstellungskonzepte. Schön ist, dass auch die Druckstärke ausgewertet wird – die Messung von Druck, Gewicht etc. wäre möglich.
  • Generieren von Zufalls-Melodien, Intervallen oder Klang-Teppichen in Verbindung mit Musik-Software. In einem einfach Test haben wir z.B. in rhytmischen Abständen per Flash Midi-Daten an Logic gesendet und so interessante Klang-Collagen erzeugen können.

Wir haben versucht, die Klassen und Funktionen so einfach wie möglich zu halten. Im Grunde genügen ein paar wenige Zeilen ActionScript zum Verbinden und Auswerten der Midi-Daten in Flash:

Beispiel 1: Midi-Note in Flash empfangen und ausgeben:

MidiClass = new Midi();
MidiClass.onNoteOn = function (note, velo, channel) {
   trace( note );
}

Beispiel 2: Verbindungsoptionen zu Midi-Geräten: Beim Befehl „new Midi()“ kann optional der gewünschte Midi-Eingang (hier: ein m-audio Trigger Finger) und Midi-Ausgang (Bus 1) angegeben werden.

MidiClass = new Midi("Trigger Finger", "Bus 1");
MidiClass.onNoteOn = function (note) {
   trace( note );
}

Beispiel 3: Angeschlossene Midi-Geräte in Flash zeigen: Alle Geräte anzeigen, die am Rechner angeschlossen sind und als Input bzw. Output genutzt werden können.

MidiClass = new Midi();
MidiClass.get_devices( get_devices_response );
function get_devices_response ( inputs, outputs ) {
   trace("INPUTS:   " + inputs);
   trace("OUTPUTS:  " + outputs);
   MidiClass.input = inputs[2];	    // Midi-Eingang setzen
   MidiClass.output = outputs[1];   // Midi-Ausgang setzen
}

Beispiel 4: Midi-Signal senden: Midi-Signale lassen sich auch von Flash aus senden. Dazu gibt es drei Befehle: sendNoteOn, sendNoteOff und playNote. Für sendNoteOn und sendNoteOff gibt es zwei Schreibweisen:

sendNoteOn( channel, note, velo );

oder alternativ einfach:

sendNoteOn( note, velo );

Bei der letzten Variante wird die Note über Kanal 0 gesendet

MidiClass = new Midi("Bus 1", "Bus 1");
note_on_off_btn.onPress = function () {
   MidiClass.sendNoteOn( 0, 50, 127 );
}
note_on_off_btn.onRelease = function () {
   MidiClass.sendNoteOff( 0, 50, 127 );
}

Beispiel 5: Ton spielen: Der Befehl sendNote schickt einen noteOn-Befehl, wartet dann die angegebene Zeit in Millisekunden und schickt danach ein noteOff. Das folgende Beispiel spielt bei Klick auf einen Button zufällige Töne mit einer Velocity von 127 für 2 Sekunden:

MidiClass = new Midi("Bus 1", "Bus 1");
play_btn.onPress = function () {
   MidiClass.playNote( 40 + random(60), 127, 2000 );
}

Midi-Events in Flash: Hier noch mal eine Übersicht der Events in der Midi-Klasse:

MidiClass = new Midi();
// Wenn Fehler beim Verbinden mit der midimicrobe passiert:
MidiClass.onError = messageFunc;
// Wenn die Verbindung zur midimicrobe geklappt hat:
MidiClass.onConnected = messageFunc;
// Wenn eine Midi-Note empfangen wurde:
MidiClass.onNoteOn = noteOnFunc;
// Wenn ein Midi Note-Off empfangen wurden:
MidiClass.onNoteOff = noteOffFunc
// Wenn ein Midi Note-Change empfangen wurde:
MidiClass.onNoteChange = noteChangeFunc;