2010-12-13 8 views
1

Ich habe eine Rails 3 App auf Heroku.Rails 3 - Heroku - Datentyp Binary Issue - Arbeitet lokal nicht auf Heroku, Vorschläge zum Debuggen?

Ich habe eine Tabelle in der App, wo ich eingehende E-Mails speichern. Ich habe eine Spalte MESSAGE mit einem binären Datentyp hinzugefügt. Das hat am Ende gut funktioniert.

Ich schob dann Heroku und es brach. Wenn ich auf heroku nachschlage, heißt es, dass der Datentyp tatsächlich binär ist, aber wenn ich die Logs rails anschaue, wird die Nachricht (mail) als String nicht binär eingefügt und ich kann nicht sagen, dass ich eine Ahnung habe warum.

Irgendwelche Vorschläge hier? Haben Sie Ideen, wie Sie dieses Problem am besten beheben können?

ERROR:

ActiveRecord::StatementInvalid (PGError: ERROR: invalid byte sequence for encoding "UTF8": 0xbb 
HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding". 

Vielen Dank für alle Ideen

+1

Was verwenden Sie, um eingehende E-Mails zu bearbeiten, cloudmailin? –

+0

@Austin, du bist ich.y irgendwelche Ideen? – AnApprentice

Antwort

1

So der Deal mit cloudmailin ist, dass es Sätze die Nachricht teilweise für Sie auf ihren Servern und verwendet dann eine POST-Anforderung die Daten zur Verfügung zu stellen zu Ihnen, wie ihre Dokumentation sagt

The message is not sent as a file. Instead it is as if the user pasted the message contents into a textfield.

Dies bedeutet, dass, wenn Sie die Nachricht explizit konvertieren zu binären Rails wird es als String behandelt. Eine Möglichkeit, dies zu tun könnte sein, um die Nachricht in ein Mail-Objekt mit dem E-Mail-Juwel zu konvertieren. Die Dokumentation auf der Website von cloudmailins bietet ein Beispiel.

EDIT: Ok Ich denke, ich missverstanden, was hier vorging. Angenommen, Sie möchten die ursprüngliche E-Mail aus irgendeinem Grund in der Datenbank speichern, müssen Sie sie so kodieren, dass die Datenbank den UTF8-Kodierungsfehler nicht auslöst. Dies wandelt die Daten zu tun, die Sie über Mail.new von cloudmailin zu einem Mail-Objekt zu erhalten dann Ihr resultierende Mail Objekt nehmen wir @m anrufen und @em = @m.encoded nennen. @em enthält jetzt eine ecnotierte Version der E-Mail, die Sie problemlos speichern können. Wenn Sie die E-Mail aus der Datenbank lesen, konvertieren Sie sie einfach zurück, indem Sie den kodierten Text an Mail.new(@em) übergeben.

Lassen Sie mich wissen, ob das funktioniert.

Quelle: http://docs.cloudmailin.com/post_format

+0

Danke Austin, aber wenn es ein binäres Feld ist, sollte Postgres das nicht automatisch tun? – AnApprentice

+1

Das Verhalten, das Sie sehen, führt mich zu glauben, dass es nicht ist, sein gutes Programmierverhalten auch sicherzustellen, dass Sie Variablen explizit konvertieren. –

+0

Wahr. Gerade jetzt auf Heroku habe ich dies in der heroku-Konsole erzeugen: IncomingMail (id: integer, message_all: binary, message_plain: text, verarbeitet: boolean, created_at: datetime, updated_at: datetime) – AnApprentice

0

zu dem, was einige der anderen Jungs haben Hinzufügen sagte, es gibt ein paar Gründe, warum dies geschehen könnte.

Die erste ist, dass der Inhalt der Nachricht die Sie versuchen zu speichern nicht korrekt als UTF-8 hervorgehoben. Alle Parameter, die wir von CloudMailin senden, sollten UTF-8 sein. In diesem Fall ist force_encoding ('utf-8') Ihr Freund. Wenn Sie das Original-Format kennen, können Sie auch .encode verwenden (‚utf-8‘)

Der andere Fall ist, dass der E-Mail-Header oder Inhalt selbst fehlerhaft ist. Wir haben dies ein paar Mal besonders mit Thema und von Kopfzeilen gesehen. Normalerweise sollten diese verschlüsselt sein, aber in vielen Fällen bedeutet der Mail-Client nicht, dass es keine Möglichkeit gibt, die verwendete Codierung zu erkennen und zuverlässig zu konvertieren.

Fühlen Sie sich frei, uns bei CloudMailin zu kontaktieren, wenn Sie immer noch Probleme haben, da es viel einfacher ist, das Problem zu sehen, indem Sie die rohe E-Mail selbst betrachten.

Verwandte Themen