SendGridのメール変換 2011年7月12日 at 9:54 AM

仕事でSendgridを使っているのだけれど、こいつのメール変換機能で若干ハマった。

のでハマったポイントを書いておこうと思うんだけど、その前にSendgridがどうメールを変換しているか書いておくことにする。

0.Sendgridのメール変換機能

0-1.概要

Sendgridには二つのメール変換機能がある。いやま、本当はもっとあるんだけどここでは話を簡単にするため二つって事にしておく。つまり、

  1. plain→HTMLの変換機能
  2. email template Appによるテンプレ適用

の二つ。

 

 

Sendgridのメール変換フロー

Sendgridのメール変換フロー

0-2. plain→HTML変換

上の絵の#1である通り、Sendgridではplainで送られたメールをHTMLに変換する機能を備えている。これの挙動が解りづらくて、#1の変換が行われるのは以下の3つの条件を全て満たした場合のみ。

  1. メールがplainで送信されている
  2. #1が設定「Global Settings」において有効になっている
  3. HTML メールが必要なAppが少なくとも一つ有効になっている。

1と2はいいとして、問題は3。公式のドキュメントでも3に関しては触れていないのだが、サポートページのフォーラムでは以下の様に言っている:

plainでメールを送っていると、メールがHTMLメールに変換されている事がある事に気づくかもしれません。一般的に、HTMLメールを必要とするAppが一つでも有効化されている場合、この変換が実行されます。

んでもって、実際に動きを見るとこう振舞うのよね。という訳で3に関しても考慮する必要がありますよん、と。

あと2に関して補足しておくと、下の絵で示す通りGlobal Settingsで#1の変換に関する設定ができるのだけれども、チェックボックスを入れると#1が無効化されるのでそれだけ注意。あと当然の事ながらはじめっからHTMLなメールに関してはここでは何も変換されません。

 

Global Settings at SendGrid

Global Settings at SendGrid

0-3. 結局Global Settingsで何が変わるの?

という訳でおさらい。というか表にすると・・・

送信形式 : plain 送信形式 : HTML
HTML apps有り HTML apps無し HTML apps有り HTML apps無し
Global Settings ON 変換される 変換されない 変換されない 変換されない
Global Settings OFF 変換されない 変換されない 変換されない 変換されない

HTMLメールで送ると当然#1の変換は行われないし、plainで送ってもHTMLメールを必要とするAppが有効化されていなかったら結局変換されない。

まぁ要するに、さっきの3つの条件から自明っちゃ自明なんだけど

- メールがplainで送信されていて

かつ

- HTMLメールを必要とするAppが一つ以上有効化されている場合

にのみ、Global Settingsの設定が聞いてくることになる。・・・ややっこしい。

0-4. email template App

無事plain→HTML変換を終えると、今度はemail template(上の絵の#2ね)が適用されることに。当然適用されるかはApp Settings内の設定による。そしてemail templateはHTMLメールじゃないと適用できないので、アプリからplainで送ってかつ#1のplain→HTML変換を実行していない場合、email templateは適用されないのでその点注意。(email templateだけでなく、他のHTMLメールが必要なappも恐らく同様)

 

Apps settings at SendGrid

Apps settings at SendGrid

1.SendGridをどう使っていたか

もうなんか、お腹いっぱいな感じですが(エントリ分けるべきだった・・・)、今回の話。

最初はふつーにplainでメールを送信していた。つまり、#1の変換も#2の変換も使ってなかった。こんな感じで。

正直に言うとこうしてたのにはあまり理由は無くて、email templateを外したかったんだけど#2の設定箇所より#1の設定箇所を先に見つけたのでこうしてただけ。(これが2ヶ月くらい前で、かなりドタバタな中対応した)

2.今回どうしたかったか

で、別に今回特殊な事をしたかった訳では無くて、単純にemail templateを適用したくなった。(メールにロゴを入れる事になった) 当然HTML形式で#2に渡す必要がある訳だが、アプリをいじるより#1を使った方が楽に思えたので、愚直に#1と#2の両方の変換を利用した。ようするにこんな感じ。

まぁ、別に何も特別な事は無いわな。

3.改行されない問題

これで万事上手く行ったかと思ったんだけど、残念ながらそうは行かなかった。というのも、#1の変換が一部適切に動作せず・・・。原因は不明(恐らく2バイト文字が絡みの原因だとは思う)ながら、一部の改行が適切に<br />に変換されないという現象に悩まされる。まぁもうしょうがないので、#1は使わない事に。アプリをいじってHTMLメールで送る事にした。ようするにこんな感じ。

とりあえず改行されないのはこれで解決。

とはいえHTMLメールにしちゃうとガラケーで読めないので、multipart/alternativeにして送っているのが今の状態・・・、なのだけど、もしかするとmultipart/alternativeもダメなガラケーにも対応せねば、的な話になりかねないので、その場合は#1の設定を切って宛先が携帯キャリアだったらplain、そうじゃなかったらHTMLみたいな対応をするしかないのかなぁ・・・。

Twitter @ anywereを重いと言う前に 2011年5月19日 at 11:06 PM

右サイドバーのTwitterアカウントに、Twitter @ anywareを使ってみた。

@ anywareを使うのは暴力的に簡単だった。公式ドキュメントのこれなり、wpへの導入例であるこちらなりを参照すればすぐ導入できると思う。

とはいえ、何点か気になる事があったのでここに書いておく事にする。1はまぁ備忘録みたいなもんだけど、やっぱり若干重さがある気がするので、2はやった方がいい気がする。

1.アプリケーションのアイコン変更に時間がかかる

これは大した話じゃないし、@ anywareというよりはTwitterのAPIの問題なんだけど、dev.twitter.comでアイコンを変更したのに変更できなかった。新しいアイコンをuploadしても何も変わらないという・・・。多分これなのかなぁとか思ってたんだけど、今見直したらばっちり変更されてた。(dev.twitter.com上で更新したのは昨日) まぁ要するに、更新されるのにちょっと時間がかかるってことなんだろうと判断。新規作成時はそんなこと無いのにね。

2.Scriptタグは最後に

まぁ見出しの通りなんだけど、公式ドキュメントのサンプルコードはこんな感じ:

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv=”Content-type” content=”text/html; charset=utf-8″>
<title>Anywhere Sample</title>
<script src=”http://platform.twitter.com/anywhere.js?id=YOUR_API_KEY&v=1″ type=”text/javascript”></script>
</head>
<body>

</body>
</html>

サンプルコードとしては別に普通だし、別にこれでいいと思う。んで多分アメリカのユーザにとってはこれであんまり問題無いハズ。というのは、platform.twitter.comのサーバがどうやらアメリカ東海岸にあるっぽいから。アメリカから呼び出される分には多分すぐ応答が帰ってくるんだろうけど、日本からのアクセスだとちょっと時間がかかる。いやま、そんなに掛かる訳じゃないし、2回目以降はキャッシュされてるハズだからいいっちゃいいんだけど、サンプルの通りheadタグに入れるのは若干微妙っぽい。

というのは、この本に書かれているのだけど、headタグの中に読み込みに時間がかかる可能性のある外部ファイルを読み込むscriptタグを入れてると、しばらくの間真っ白い画面が表示されてしまうという事象が起こり得るので。(これはブラウザが外部スクリプトの読み込みを実行中は他のコンテンツの読み込みを停止してしまう為におきる)まぁそんな訳で、実際に使う際はオライリー本に書かれている通り、scriptタグはページの最後に持ってきたほうが無難かと。

興味がある方はキャッシュを無効化(または削除)して、このページを更新してみるといいかも。ブラウザのステータスバーとこのページ内の僕のTwitterアカウントへのリンクをよーく見てると、ページのコンテンツが一通り表示された後にtwitter.comへアクセスが行き、その後で文字列「@i7a16k」がリンクになることに気づけるハズ。(ここからの直接のフォローだけでなく、普通にリンク化させるのも@ anywareでやっている)

ついでに触れておくと、上記オライリー本の解説サイトであるこのサイトを見ると、scriptの読み込みが他のコンテンツの読み込みをブロックする様を見て取ることができたり。(Example 5が顕著)ここで使われてるcgiスクリプトを使うと、scriptタグの読み込みに時間が掛かった際に画面表示がどうなるかをシュミレーションできたりもする。

<script type="text/javascript" src="http://stevesouders.com/bin/sleep.cgi?type=js&sleep=10&expires=-1&last=0"></scirpt>

こんな感じでscriptタグを埋め込んであげれば、そこに読み込みに時間が掛かるscriptが存在する場合の挙動を確認する事ができますよん、と。

 

ロリポップで「.se」ドメインを使う 2011年5月15日 at 9:56 PM

折角「.se」ドメインを取得したので、使っていたlolipopで使ってみようとした。

ロリポップのユーザ専用ページの「独自ドメイン」>「独自ドメイン設定」に行き、取得した「.se」を登録しようとしたところ、以下のようなエラーが出てきて登録できなかった。

「.se」登録時にロリポップで発生したエラー

「.se」登録時にロリポップで発生したエラー

ぐええ なんじゃこりゃ。 てか「fixedPart.1」ってなんやねん・・・。

ドメイン周りの設定とか正直そんなに詳しくないので、ロリポップじゃ「.se」使えないんじゃね?と判断してやむなく他のレンタルサーバを探してみる。とはいえ日本のレンタルサーバで公式に「.se」が使えると公式に謳っているところが見つかる訳も無く・・・。が、冷静に考えてみるとそもそもなんでロリポップで「.se」使えないんだっけ?的な気になってくる。「.se」だからと言って特別な事がある訳でもなかろうに・・・。というわけでサポートに聞いてみることにした。

サポートに問い合わせてみると何のことはない、別にロリポップでも「.se」使えるけどユーザ専用ページから設定することはできないとのこと。サポート宛に設定を依頼したらすぐに設定してもらえて、この通り無事に動きましたとさ。

ついでに書いとくと、ロリポップに問い合わせたのはゴールデンウィーク真っ最中だったんだけど迅速に対応してくれた。素晴らしい。