via, hier das Original:
Hey, es ist Freitag!
Wie oft habe ich schon die Email-Klasse verwendet, nur um festzustellen, dass sie nicht funktioniert? Sicher... zwei mal 🙂 Deshalb: Sie funktioniert nicht. Stattdessen verwende ich PHPMailer, bzw. folgende Dateien davon:

Eingebunden werden die ein einem Helper (/application/helpers/email_helper.php):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); if (!function_exists('sendEmail')) { function sendEmail($to, $subject, $message) { // CodeIgniter's mailer does not work: require_once(APPPATH . 'third_party/PHPMailer/class.phpmailer.php'); $ci =& get_instance(); $ci->config->load('email'); $mail = new PHPMailer(); $mail->CharSet = 'utf-8'; $mail->IsSMTP(); $mail->Host = $ci->config->item('smtp_host'); $mail->SMTPAuth = true; $mail->SMTPSecure = 'ssl'; $mail->Username = $ci->config->item('smtp_user'); $mail->Password = $ci->config->item('smtp_pass'); $mail->Port = $ci->config->item('smtp_port'); $mail->From = $ci->config->item('smtp_user'); $mail->FromName = $ci->config->item('from_name'); $mail->AddAddress($to); $mail->AddReplyTo($ci->config->item('reply_to'), $ci->config->item('from_name')); $mail->Subject = $subject; $mail->Body = $message; $mail->AltBody = str_replace('<br/>', '', $message); if (!$mail->Send()) { log_message('error', $mail->ErrorInfo); // throw new Exception($mail->ErrorInfo); return FALSE; } return TRUE; } } |
mit entsprechender Config (/application(config/email.php, wird automatisch eingebunden):
|
1 2 3 4 5 6 7 8 9 |
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); $config['protocol'] = 'smtp'; $config['smtp_host'] = 'mail.example.com'; $config['smtp_user'] = 'foo@example.com'; $config['smtp_pass'] = 'mypassword'; $config['smtp_port'] = '465'; $config['reply_to'] = 'bar@example.com'; $config['from_name'] = 'CodeIgniter Mailer'; |
Aufruf dann via:
|
1 2 3 |
$this->load->helper('email'); $sent = sendEmail('myrecipient@example.com', 'Hello subject!', 'My message'); echo $sent ? 'sent.' : 'NOT sent!'; |
HTH
Diese und weitere Perlen der Weisheit jetzt im Sprichwortekombinator!
via Michael
Guten Tag.
Über die FB-API bekommt man vergleichsweise kryptische Image-URLs, nämlich die Direktlinks in deren CDN. Diese haben drei Probleme:
1. Die URL zeigt auf die gering aufgelöste Version des Bildes, zu erkennen am "_s.jpg" ("s" für "small). Der gängige Ansatz, um an die hochauflösende Version zu kommen, besagt, dass man "_s" durch "_n" (für "normal?) zu ersetzen (einige empfehlen auch "_o" für "original"). Das funktioniert meistens, aber eben nicht immer. Korrekt scheint dieser (selbstverständlich undokumentierte) Ansatz, der quasi analog zur Profilbild-URL funktioniert:
|
1 2 |
https://graph.facebook.com/<object_id>/picture https://graph.facebook.com/<object_id>/picture?type=normal |
<object_id> kommt aus der API. Achtung: Das funktioniert nur für Posts vom Typ "photo"; Posts vom Typ "link" müssen nach wie vor über die URL im Feld "picture" gehen! Und damit kommen wir direkt zum nächsten Problem:
2. Facebook nutzt Proxy-Skripte zur Generierung der niedrig aufgelösten Bilder. Zu erkennen an .../safe_image.php?...&url=<url_codiert> oder .../app_full_proxy.php?...&src=<url_codiert>. Diese muss man rausfilter, die tatsächliche URL dekodieren:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// check for "app_full_proxy.php": if(preg_match('/\/app_full_proxy\.php\?.*src=(.*)/', $url, $result)) { if(!empty($result[1])) { $sanitized = urldecode($result[1]); } } // check for "safe_image.php": else if(preg_match('/\/safe_image\.php\?.*url=(.*)/', $url, $result)) { if(!empty($result[1])) { $sanitized = urldecode($result[1]); } } |
3. Profilbilder von altersbeschränkten Seiten sind ebenfalls altersbeschränkt 🙂 Für Zugriff muss man den Access Token anhängen (Quelle finde ich gerade nicht mehr wieder):
|
1 |
https://graph.facebook.com/<pageId>/picture?type=normal&access_token=<access_token> |
ggf. benötigt man das auch für die unter 1. genannten Bilder.
HTH
Seit längerem auf meinem Nice-to-Know-Zettel (und, soweit ich mich erinnere, ursprünglich vom Milde), und eben erfolgreich eingesetzt: Die Support-Telefonnummer von DHL, auf der man mit echten Menschen sprechen kann! Auch an Feiertagen \o/
0800 1 888 444
😀
UPDATE: Ganz gut geht auch twitter@dhl.com, die kümmern sich erst und antworten dann.
Aus den Sourcen von CodeIgniter:

Models "babe" zu nennen, entbehrt nicht einer gewissen Logik: [1], [2].
Es gibt im Internetz verschiedene Ansätze für dieses Problem; die meisten basieren auf einem eigenen Loader. Meiner Erfahrung anch funktionieren die alle nicht (in allen Situationen), und leider scheint die einzige echte Alternative zu sein, alle Models ohne Namen zu laden. Also lieber
|
1 2 3 |
// yes :-) $this->load->model('stream_model'); $this->stream_model->foo(); |
statt
|
1 2 3 |
// NO! $this->load->model('stream_model', 'stream'); $this->stream->foo(); |
🙁
MySQL kann UTF-8... falsch. Besser gesagt: Ungenau. MySQL kann UTF-8, aber das heißt da anders:
Ein Zeichen in UTF-8 ist (bis zu) vier Bytes lang, "UTF-8" in MySQL kann aber nur bis zu drei. Deswegen fällt der Unterschied oft gar nicht auf, oder erst beim ersten Zeichen, das vier Bytes braucht. Will man echtes UTF-8, muss man einiges umkonfigurieren; in Kurzform:
CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci" umgestellt werden
TINYTEXT, die wohl nur 255 Bytes = 63 Zeichen bei 4 Byte/Zeichen speichern können. Ggf. ist hier ein anderer Typ zu wählenSHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';")|
1 2 3 |
# For each table REPAIR TABLE table_name; OPTIMIZE TABLE table_name; |
bzw.
|
1 |
mysqlcheck -u root -p --auto-repair --optimize --all-databases |
Insbesondere bei Punkt 3 hängt es bei CodeIgniter, btw. Wenn man in der Datenbank-Config
|
1 2 |
$db['default']['char_set'] = 'utf8'; $db['default']['dbcollat'] = 'utf8_unicode_ci'; |
stehen hat, dann ist das ebenfalls nicht das echte UTF-8. Stattdessen korrekt ist:
|
1 2 |
$db['default']['char_set'] = 'utf8mb4'; $db['default']['dbcollat'] = 'utf8mb4_unicode_ci'; |
Das Problem betrifft auch mysqldump: Will man die eine utf8mb4-Datenbank dumpen, muss man das explizit sagen, denn mysqldump nutzt per Default nur utf8 (Quelle):
|
1 |
mysqldump --default-character-set=utf8mb4 -u [uname] -p"[pass]" db_name > db_backup.sql |
Das ist so tief verankert, dass auch Dumps über Tools wie Sequel Pro nur utf8 nutzen m(
Twitter kürzt URLs mit dem hauseigenen Dienst t.co. Die so (de facto) verschleierten URLs werden auf twitter.com zwar über den Link-Text (bis zu einer gewissen Länge) wieder aufgelöst, aber die URL dahinter bleibt die von t.co. Über die API bekommt man denn auch erst mal nur die t.co-Version. Im Netz kursieren Links zu "Unshorten"-Services (Beispiel), die aber gar nicht (mehr?) nötig sind: Der Parameter "include_entities" erweitert den Response bsplw. der Suche um alle Felder, die man benötigt (hier nur die Entities):
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
// ... object(stdClass)#25 (4) { ["hashtags"]=> array(8) { //... } ["symbols"]=> array(0) { } ["urls"]=> array(1) { [0]=> object(stdClass)#34 (4) { ["url"]=> string(22) "http://t.co/Xhy9G8ibxj" ["expanded_url"]=> string(34) "http://instagram.com/p/n5BjEMqxJr/" ["display_url"]=> string(27) "instagram.com/p/n5BjEMqxJr/" ["indices"]=> array(2) { [0]=> int(88) [1]=> int(110) } } } ["user_mentions"]=> array(0) { } } //... |