Google Mail erkennt fehlende Anhänge
Mal schnell ein Screenshot, den ich vor ein paar Tagen gemacht habe. Was gibt es darauf zu sehen? Google Mail! Eigentlich nichts Besonderes, wäre da nicht das Popup…

Ich hatte vor eine Mail samt Anhang an einen Kollegen zu schicken. Wie man das so tut, schreibt man in der Mail dann oft so was wie “Die XYZ-Dateien befinden sich im Anhang”. Dummerweise hatte ich vergessen, die Dateien auch wirklich an die Mail anzuhängen, als ich auf den “Senden”-Button drückte. Doch dann kam, die große Überraschung. Google Mail fragte mich, ob ich die Mail wirklich versenden wolle, da der Text meiner Mail auf einen Anhang schließen ließe, ich aber keine Dateianhänge erstellt hätte.
Da war ich erst mal baff! Die Funktion kannte ich noch nicht und ich weiß auch nicht, ob ich bisher einfach immer alle meine Anhänge ordentlich hinzugefügt habe, oder ob das Feature einfach mal neu ist. Ich weiß nur eins – wenn es das Feature in Outlook geben würde, wäre mir schon der ein oder andere peinliche Moment im Arbeitsleben erspart geblieben.
Wie findet ihr das Feature? Spannend, nützlich oder habt ihr Angst um eure Privatsphäre, mit der Begründung, es sei nicht klar, inwieweit Google den Inhalt eurer Nachrichten noch auswertet?
Viele Grüße,
Raffi
Google Docs mit Dropbox synchronisieren
Heute möchte ich euch zeigen wie ihr die beiden Dienste Dropbox und Google Drive synchron halten könnt. Das ganze geht einfacher als vielleicht zuvor gedacht.
Sowohl Dropbox als auch Google Drive legen einen lokalen Ordner auf eurem Rechner an. Die Dateien in diesem Ordner werden dann bekannterweise mit der Cloud und allen angeschlossenen Geräten synchronisiert.
Möchte man sich nun zum Beispiel absichern und zwei Systeme parallel nutzen, müsste man eine Datei nach dem Anlegen oder Ändern immer in beide Ordner (den der Dropbox und den des Google Drives) kopieren.
Abhilfe kann man sich schaffen, in dem man den Dropbox-Ordner in einen Unterordner des Google Drives verlegt. Dies geht ganz einfach.
Zuerst öffnet ihr die Einstellungen des Dropbox Clients und geht dort auf den Reiter “Erweiterte Einstellungen”. Hier könnt ihr den Pfad des Ordners festlegen, mit dem die Dropbox synchronisiert.
Dort wählt ihr nun einen Ordner aus, der sich innerhalb eures Google Drive Ordners befindet.
Da war es auch schon. Wenn ihr nun Dateien in eure Dropbox legt, werden diese automatisch mit der Dropbox und dem Google Drive synchronisiert. Ein doppeltes kopieren ist nun nicht mehr nötig.
Was haltet ihr von der Lösung? Kennt ihr Alternativen?
Viele Grüße,
Raffi
Artikel auf Blogspot erstellen – C# .NET Blogger API
Heute möchte ich euch zeigen, wie man mittels C# Blogartikel auf Blogger.com (Blogspot.com) erstellen kann. Hierfür benötigt ihr zu aller erst die Google.GData.Client.dll, welche ihr im Google. Net API Pack findet.
Das API-Pack könnte ihr euch hier von Google herunterladen. (Die Datei heißt Google_Data_API_Setup_2.0.1.0.msi. Beachtet bitte, dass sich die Versionsnummer – 2.0.1.0 – im Laufe der Zeit natürlich ändern kann.) Wenn ihr den Download abgeschlossen habt, installiert das Paket, öffnet ein neues Projekt im Visual Studio und bindet die Google.GData.Client.dll ein.
Die .dll-Datei findet ihr im Downloadverzeichnis des API-Pack. (Wie ihr eine DLL einbinden könnt, habe ich hier bereits beschrieben.)
Wenn ihr die DLL eingebunden habt, kann es auch schon losgehen. Einen Post aka Blogartikel könnt ihr wie folgt erstellen:
private static int AddPost(string title,
string html,
string[] labels,
string user,
string pass,
string blogUrl
bool isDraft)
{
try
{
//Wird benötigt um Google Zertifikatfehler zu "umgehen"
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback
(
delegate { return true; }
);
//Eine Google Service Instanz wird erstellt. "blogger"
//gibt den Dienst an, den wir nutzen wollen. "api_test"
//gibt den Namen an, unter dem sich unsere Anwendung
//ausweisen soll. Im Gegenteil zum Dienstparameter, der
//für unser Beispiel auf "blogger" festgelegt ist, haben
//wir beim Namen freie Wahl.
Service service = new Service("blogger", "api_test");
//Der Service Instanz werden die Benutzerdaten eines
//gültigen Blogger (Google) Accounts überegeben.
service.Credentials = new GDataCredentials(user, pass);
//Ein neues Blogartikel Objekt wird (lokal) angelegt.
AtomEntry newPost = new AtomEntry();
//Die Überschrift des Blogartikels wird gesetzt
newPost.Title.Text = title;
//Der Inhalt des Blogartikel wird gesetzt.
newPost.Content = new AtomContent();
//Wenn ihr HTML-Code übergebt, solltet ihr zuvor sämtliche
//Zeilenumbrüche entfernen, da Blogger sonst automatisch alle
//Zeilenumbrüche durch <br /> ersetzt. Wenn man selbst schon
//im Quelltext <br /> gesetzt hatte, wird einem sonst das
//ganze Layout "zerfleddert".
string[] breaks = new string[] { "\r\n", "\r", "\n" };
foreach (string breakStr in breaks)
{
while (html.Contains(breakStr))
html = html.Replace(breakStr, "");
}
newPost.Content.Content = html;
newPost.Content.Type = "html";
//Setzen der Labels für den Blogartikel.
//(Labels bei Blogger entsprechen Kategorien/Tags)
foreach (string labelRaw in labels)
{
AtomCategory cat = new AtomCategory();
cat.Scheme = new Uri("http://www.blogger.com/atom/ns#");
//Blogger verbietet bestimmte Zeichen in den Labels
//Diese sollten zuvor herausgefiltert werden.
string label = labelRaw;
string[] forbiddenChars = new string[] { "&", "<", ">",
"@", "!", "," };
foreach (string forbiddenChar in forbiddenChars)
{
while (label.Contains(forbiddenChar))
label = label.Replace(forbiddenChar, "");
}
cat.Term = label;
newPost.Categories.Add(cat);
}
//Festlegen, ob der Artikel direkt gepostet oder als Entwurf
//gespeichert werden soll. (false = direkt Posten)
newPost.IsDraft = isDraft;
AtomEntry response = null;
try
{
//Blogartikel absenden (Woher die blogUrl kommt,
//wird später im Artikel geklärt.
response = service.Insert(new Uri(blogUrl), newPost);
}
catch (GDataRequestException iDontCare)
{
//Fehler beim Absenden aufgetreten
if (iDontCare.ResponseString == "Blog has exceeded rate " +
"limit or otherwise requires word " +
"verification for new posts")
{
//Fehler tritt auf, wenn das Tageslimit an Posts
//erreicht ist. (Mehr dazu weiter unten in
//diesem Blogartikel.)
return -2;
}
else
{
//Anderer Fehler aufgetreten
throw iDontCare;
}
}
if (response == null)
{
throw new Exception("Konnte keine Verbindung herstellen");
}
//Blogartikel erfolgreich abgesendet
return 0;
}
catch
{
//Es ist ein Fehler aufgetreten
return -1;
}
}
Nun haben wir den größten Teil geschafft! Um nun einen Blogartikel zu posten, müssen wir nur noch die eben geschriebene Funktion aufrufen. Das könnte wie folgt aussehen:
Demo.AddPost("Meine Überschrift",
"<b>das</b><br /><i>ist</i> ein test",
new string[] { "test", "csharp", "api" },
"maxmustermann@googlemail.com",
"demo_passwort",
"https://www.blogger.com/feeds/XXXXXX/posts/default");
Eine letzte Frage steht nun noch im Raum. Was ist die Blog-Url und wo kommt Sie her? Das klären wir nun. Die Url ist vom Grundaufbau her immer identisch. Lediglich die XXXXXXe müssen durch die ID des Blogs ersetzt werden. Eine Möglichkeit die komplette URL zu bekommen, möchte ich euch nachfolgend zeigen.
Nehmen wir an, euer Blog hat die URL: http://code-bude-test.blogspot.com – dann ist “code-bude-test” der Name des Blogs, den wir nun brauchen.
public static string SelectUserBlogPostUrl(string subdomain,
string user,
string pass)
{
//Erstellen der Google Service Instanz
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback
(
delegate { return true; }
);
Service service = new Service("blogger", "api_test");
service.Credentials = new GDataCredentials(user, pass);
//Anfordern einer Liste mit allen Blogs, die unter
//dem angegeben Google Account existieren
FeedQuery query = new FeedQuery();
query.Uri = new Uri("http://www.blogger.com/feeds/default/blogs");
AtomFeed feed = service.Query(query);
//Wenn die Liste mit den Blogs nicht null ist...
string blogUrl = string.Empty;
if (feed != null)
{
//Durchlaufe alle erhaltenen Blogs
foreach (AtomEntry entry in feed.Entries)
{
//Überprüfe, ob der aktuelle Blog der gesuchte
//Blog ist.
if (entry.AlternateUri.Content.Contains(subdomain))
{
//Suche die Blog Post URL
for (int i = 0; i < entry.Links.Count; i++)
{
if (entry.Links[i].Rel.Equals("http://schemas.google.com/g/2005#post"))
{
blogUrl = entry.Links[i].HRef.ToString();
}
}
//Gebe die Blog Post Url zurück
return blogUrl;
}
}
}
//Wenn keine URL gefunden wurde, gebe Blog Url
//= string.empty zurück
return blogUrl;
}
Nun haben wir alles zusammen. Mit den oben stehenden Funktionen könnt ihr nun die Blog Post Url herausfinden und mittels dieser und der AddPost-Funktion Blogartikel auf Blogger.com veröffentlichen.
Zum Abschluss noch ein paar Worte zum “Rate-Limit” (aka “Blog has exceeded rate limit or otherwise requires word verification for new posts”). Die Blogger API erlaubt nur eine gewisse Anzahl an Posts pro Tag. Eine genaue Zahl gibt Google nicht heraus. Aus Erfahrung kann ich jedoch sagen, dass es ziemlich genau 50 Artikel sind, die man am Tag veröffentlichen kann. Danach geht über die API gar nichts mehr.
Über die Weboberfläche von Blogger.com können jedoch weitere Artikel veröffentlicht werden. Hierbei muss nach Erreichen des Limits jedoch jedes Mal beim Veröffentlichen ein Captcha gelöst werden. Das Limit/die Sperre wird ziemlich genau nach 24 Stunden wieder zurückgesetzt.
So, das war’s dann aber auch wirklich für heute. Wenn ihr noch Fragen, oder noch besser, Anregungen und Ideen habt, dann schreibt einfach einen Kommentar.
Viele Grüße,
Raffi
Google meldet Patent auf Freizeichen Werbung an
Eigentlich schreibe ich hier ja nicht so oft Nachrichten über Neuigkeiten, sondern eher Anleitungen und konkrete Problemlösungen, aber das Thema brennt mir einfach unter den Fingernägeln.
Wie ich gerade auf businessweek.com lesen durfte, hat Google ein weiteres Patent angemeldet. Worum es geht? Natürlich wieder einmal um Werbung. Damit verdienen die Jungs und Mädels von Google ja schließlich auch ihre Brötchen. Doch worum geht es genau?
In dem Patent geht es darum, Werbung anstelle des Freizeichentons (der heutzutage übrigens korrekterweise Wählton heißt) abzuspielen. Dabei kann die Werbung abhängig vom Standort des Anrufers, dessen Telefonnummer und/oder der Nummer des Angerufenen personalisiert werden.
Grundsätzlich sage ich so weit erst mal Hut ab. Die Idee scheint auf den ersten Blick so simpel wie auch genial. Ich kann mir vorstellen, dass sich damit gutes Geld verdienen lässt. Wenn man sich jedoch ein wenig mehr Gedanken darüber macht, dann kommen mir zumindest ein paar Zweifel was die mögliche Umsetzung angeht.
Wird die Werbung in Absprache mit dem Netzbetreiber geschaltet werden oder kommt sie etwa gerätebezogen, zum Beispiel für jedes Android-Smartphone? Kann ich der Schaltung von Werbung widersprechen oder wird diese unumgänglich sein? Zudem kann ich mir auch gut vorstellen, dass sich Technikhändler A sicher nicht freut, wenn ich erst mal Werbung von Technikhändler B zu hören bekomme, bevor ich mit deren Supportmitarbeitern sprechen kann.
Ich weiß, das ist alles spekulativ. Aber ich denke die Überlegungen sind nicht ganz unberechtigt. Was haltet ihr von dem Patent? In welchem Maße würdet ihr solch eine Werbung dulden oder vielleicht sogar gut finden?
Viele Grüße,
Raffi
[Bild via Epiclectic@Flickr ]
Google eröffnet Google Play – ein Store für alles
Fast wäre es an mir vorbeigegangen. Während ich mich gestern auf der Cebit von Stand zu Stand gehangelt habe, hat Google klamm und heimlich Google Play gelaunched. Doch was genau ist Google Play?
Google Play ist Googles Versuch diverse Content Angebote von Google an einem zentralen Punkt zusammenzufassen. So soll Google Play als Store für Android Apps, Musik, Filme und Ebooks dienen.
Für uns in Deutschland hat die Einführung von Google Play bisher jedoch eher geringe Auswirkungen. Das heißt, für deutsche Nutzer stellt sich Google Play bisher lediglich als Rebranding des Android Markets dar, da wir hier derzeit weder Zugriff auf den Musikstore, noch auf Filme oder Ebooks haben. Das erklärt auch, warum die About Seite von Google Play für deutsche Nutzer bisher eher nichtssagend ist. In den USA hingegen sind jetzt schon alle vier Bereiche (Apps, Music, Movies und Ebooks) komplett verfügbar.
Zum Abschluss noch ein paar Worte zu Google Music. Kurz nach dem Google Music am 16.11.2011 gelaunched wurde, damals noch als eigenständiges Projekt, schrieb zum Beispiel Caschy eine Anleitung wie man sich auch als deutscher Nutzer für Google Music anmelden kann. Wer das gemacht hat, erreicht Google Music nun über http://play.google.com/music.
Nicht ganz so neu, aber immer noch interessant: Einfach mal die Google Play Music Seite mit dem Smartphone aufrufen. Die mobile Webseite ist der neuen Google Music App nachempfunden und ist mittlerweile nicht nur vom Look & Feel, sondern auch vom Ansprechverhalten und der Stabilität eine wahre Wonne. Stellt man den genutzten Browser auf Vollbild, so lässt sich die Webapp kaum noch von einer nativen Unterscheiden. (siehe Screenshots)
Zu Hause bzw. dort wo ich WLAN habe, nutze ich fast ausschließlich die mobile Webseite anstatt der Google Music App, für die es laut Aussagen in Google Blog in der kommenden Zeit auch wieder ein Update geben wird. Das gleiche gilt auch für die Market App welche ebenfalls ein Update mit neuem Anstrich im Google Play Design erhalten soll.
Soviel erst mal von mir. Was haltet ihr von Google Play bzw. Googles Plänen alles unter einen Hut zu bekommen?
Viele Grüße,
Raffi


