2014年11月29日土曜日

SPFの設定はしたけど、EC-CUBEから送信されるメールが迷惑メールになる場合の対処法

SYSTEM_KDです。

久々にEC-CUBEネタです。(タイトル長いw)
SPFの設定は行ったが、EC-CUBEから送信されるメールが迷惑メール扱いになってしまう場合があるかと思いますが、その対処方法について書いてみます。

早速ですが、対処方法は以下の3ステップになるかと思います。

1.SPFの設定が正しいか確認

2.EC-CUBEからの送信メールのSPFの確認

3.EC-CUBEの修正

まず、「1.」ですが、設定が正しいか確認することのできるツールがありますので、そちらで確認します。
こちらで、結果として「PASS」が表示されればOKです。

ダメな場合は設定の見直しを行って下さい。

次に「2.」ですが、EC-CUBEから送信されたメールのSPFの状態を確認します。
この設定がどこで見れるかといいますと、受信メール(対象のECサイトから送信されたメール)の「メッセージのソース」から確認ができます。
(詳しい場所はメーラーにより異なるので、割愛します)

このメッセージソース内で「SPF」という文字を検索すると、EC-CUBEから送信されたメールがどの様な状態(認証結果)となっているかが確認できます。

この状態が「PASS」であれば、迷惑メールに割り振られなくなるのですが、おそらくPASSになっていないのではないかと思います。

PASSになっていないことが確認されたら、上記のメッセージソース内で、今度は「Return-Path」となっている部分のメールアドレスを確認します。
このアドレスが「1.」で設定したドメインのものになっていないのではないかと思います。

このReturn-Pathのアドレスが認証に利用されるので、ここへSPFで設定したドメインのものが設定される必要があります。

では、EC-CUBE上のどこで設定したアドレスが、ここに設定されるかといいますと、管理画面の「SHOPマスター」へ「メール送信元メールアドレス」といったそれらしい値があるかと思います。ですが、残念ながらこのアドレスがReturn-Pathとして、上手く設定されていない様です。

ということで、「3.EC-CUBEの修正」になります。

修正を行うファイルは「data/class/SC_SendMail.php」になります。
このファイルの310行目あたりを以下のように変更します。
※EC-CUBE2.12以降での場所になります。

case 'mail':
$arrParams = array(‘-f’ . ‘Return-Pathとして設定するアドレス’);
break;

注意点として、-f と Return-Pathとして設定するメールアドレスの間にスペースを入れないようにします。

Return-Pathに設定したメールアドレスが、「eccube@mail.co.jp」と仮定した場合
-feccube@mail.co.jp
となります。

これで、EC-CUBEから送信されたメールのReturn-Pathへ指定のアドレスが設定されSPFで設定が上手く行えていれば、SPF=PASSになり迷惑メール扱いから開放されるかと思います。

環境により一概に全てにおいて解決するとは言えませんが、お困りの方がいらっしゃいましたら、試してみる価値はあるのではないかと思います。

2014年11月27日木曜日

AndroidでJSOUPを使う。その2(ベーシック認証へのアクセス)

SYSTEM_KDです。

AndroidでJSOUPを使う。その1(基本的な使い方 GET, POST, クッキーについて)の続きになります。

その1の最後で宣言したとおり、ベーシック認証がかかっている状態での、GETとPOSTについてまとめます。

ベーシック認証を通したいので、行うこととしては、HTTPヘッダーへ認証情報を設定してやります。

こんな感じです。

// ベーシック認証のIDとパスワードを設定
String basicID = "ベーシック認証のID";
String basicPass = "ベーシック認証のパスワード";
// IDとパスワードを送信用に結合
String basicIdPass = basicID + ":" + basicPass;
// IDとパスワードをベーシック認証用にbase64でエンコード
String basicIdPass64 = Base64.encodeToString(basicIdPass.getBytes(), Base64.DEFAULT));

// ヘッダへ設定する情報を用意
String headKey = "Authorization";
String headValue = "Basic " + basicIdPass64;

// HTTPヘッダへの設定とConnection作成
Connection conn = Jsoup.connect("URLを指定").header(headKey, headValue);

以上です!

あとは、ベーシック認証を設定したConnectionを利用して前回紹介したようにGET, POSTを行うだけです。

もちろんCookieを設定する場合も、同様にこのConnectionに設定してやるだけです。

もったいぶって、Basic認証へのアクセスを「その2」にしてはみましたが、全然大した内容になりませんでしたねw

2014年11月26日水曜日

AndroidでJSOUPを使う。その1.5(POST後のCookieを取得する)

SYSTEM_KDです。

AndroidでJSOUPを使う。その1(基本的な使い方 GET, POST, クッキーについて)の続きです。

前回書き漏らしたけど、その2に入れるには大したこと無いネタなのでその1.5として書きたいと思います。

内容としてはタイトル通りなのですが、POSTでの送信とCookieの取得については個別に書いたのですが、POSTを受けたWEB側の処理でCookieが変更された場合、前回記載した方法では取得することができません。

POSTした結果と共にCookieを取得するには下記の様に行います。

// Connectionを作成
Connection conn = Jsoup.connect("URLを指定");
// POSTするパラメータを設定
HashMap<String, String> param = new HashMap<String, String>();

// POSTを行いレスポンスを取得
Connection.Response res = conn.data(param).method(Method.POST).execute();

// レスポンスからCookieを取得
Map<String, String> cookies = res.cookies();

// レスポンスからDocumentを取得
Document doc = res.parse();

やってること自体は大したことないですが、
最初は方法を見つけるのにかなり時間がかかりました ^^;

重要な部分は見ての通り7行目以降の部分になります。

結果を受け取る際に、「Document」を取得するのではなく「Response」を取得しそこから必要な情報を取り出す様な流れとなります。

2014年11月25日火曜日

AndroidでJSOUPを使う。その1(基本的な使い方 GET, POST, クッキーについて)

SYSTEM_KDです。

AndroidでHTMLをパースしたり、http通信時に便利なライブラリ「JSOUP(JSONじゃないよ)についての使い方を自分の備忘録をかねてまとめたいと思います。

ネット上に記事があるようで、やりたいこについてのってなかったのでまとめ。

まず、JSOUPを利用するために必要なライブラリを用意します。
必要ならライブラリは、「JSOUPのjar」と「HttpClient」になります。
それぞれ、下記からダウンロードします。

HttpClient
※Binaryのzipかtar.gzあたりをダウンロード
※2014/11/24時点の最新バージョンは 4.3.6 でした

JSOUPのjar
※2014/11/24時点の最新バージョンは 1.8.1 でした。

ライブラリをダウンロードしたら、必要なjarだけとりだします。
AndroidでJSOUPを利用するために必要なライブラリは次になります。

・jsoup-1.8.1.jar
・httpcore-4.3.3.jar
・httpmime-4.3.6.jar

あとは、上記のjarを利用するAndroidプロジェクトの「libs」にコピーすれば準備OK.

では、早速利用してみたいと思いますが、全体的なソースは省きます。
(大まかな部分はネット上にまとめられておりますので、JSOUPの使い方だけに絞ります)

まず、GETから

// Connectionを作成
Connection conn = Jsoup.connect("URLを指定");
Document doc = conn.get();

これだけです。これでHTTPへリクエスト飛ばせます。
あとは、DocumentからJQueryライクにHTMLを扱えます!

次に、POST

// Connectionを作成
Connection conn = Jsoup.connect("URLを指定");
// POSTするパラメータを設定
HashMap<String, String> param = new HashMap<String, String>();
// nameとageをPOSTする
param.put("name", "SYSTEM_KD");
param.put("age", "30");
// post
Document doc = conn.post();

以上です。これで、POSTができます。
あとは、GETと同様にDocumentからHTMLを扱います。

と、ここまでは、探せばネット上にあるかと思います。
まぁ、これだけあれば色々できるのですが、もう一歩踏み込もうとすると、とたんに情報が少なくなる気がします。

と言うことで、ちょっと踏み込んで、Cookieを利用する場合について記載したいと思います。
POSTを使う場合等は、色々やっていくうちにCookieを利用したくなるかと思います。

では、Cookieの取得から

// Connectionを作成
Connection conn = Jsoup.connect("URLを指定");
// Cookieを取得
Map<String, String> cookies = conn.execute().cookies();

もったいぶりましたが、あっさり取れます。

反対に、Cookieを設定する場合
(上記で取得した値を設定すると想定)

// Connectionを作成
Connection conn = Jsoup.connect("URLを指定");
// Cookieを設定
for (Map.Entry<String, String> cookie : cookies.entrySet()) {
conn.cookie(cookie.getKey(), cookie.getValue());
}

設定の方も簡単におこなえます。
これで、基礎的な部分は網羅できるかと思います。

次回は、その2 ベーシック認証がかかっている状態での、GETとPOSTについて書きたいと思います。

2014年11月23日日曜日

Android5.0のSmart Lockを試してみる(鍵にはAndroid4.1のXperiaVLを利用してみた)

SYSTEM_KDです。

Nexus端末へのAndroid5.0へのアップデート配信が開始されてから1週間以上経過しましたが、うちのNexus7(2013)へはまだ落ちてこなかったので、結局手動でOTAアップデートしました。
(こんなことならさっさとアップデートするべきだった。。)

まぁ、それは置いておいてw

Nexus7(2013)(※以下Nexus7)がAndroid5.0に上がったということで、新機能である「Smart Lock」を試してみました。

Smart Lockとは
Android5.0で追加された新機能で、Bluetooth機器や、NFCタグでロック画面の認証を無効化できる機能になります。

それでは早速NFCから試して見たいと思います。

手順としましては、「設定」>「セキュリティ」>「Smart Lock」を選択し、「信頼できる端末」で「信頼できるデバイスの追加」から「NFC」を選択します。

すると、下記のように信頼できるデバイスを登録する画面が表示されますので、NFCを読み込ませ、登録を行います。

Screenshot_2014-11-22-22-02-42

これで、準備は完了です。

では、実際にロックを解除してみます。

まず、Nexus7をロック画面にします。
もちろんこの状態ではまだロックされております。

LOCK1

この状態で、登録したNFCタグをかざすと、

LOCK2

見づらいですが、ロックマークが解除状態にかわりました。
後は、上にスワイプすると認証を入力することなく利用することができます。
機能自体はすごいですが、NFCかざすぐらいならPINなり、パスワードなりを入力した方が早いきがします。。
(まぁ長いパスワードの場合はこっちの方が楽ですね)

ではもう1パターンの方のBluetoothによるロック解除を試したいと思います。
こっちは、Bluetooth機器が近くにあればロックを解除できるので、実用性が高いかと思います。
主な利用シーンとしては、最近登場し始めたスマートウォッチと連携させるかたちを想定されたものだと思います。

ということで、普段はロックをかけておきたいけど、スマホを所持した状態でNexus7を利用した場合は、ロックフリーにできれば便利だな~と思いつつNFCの時と同様の手順で、今度はBluetoothでペアリングした端末を「信頼できるデバイス」として登録していきます。

今回は手持ちのXperiaVLを信頼できるデバイスとして、Nexus7のロックを外すための鍵に使ってみます。

XperiaVLとNexus7はBluetoothでペアリングさせているので、信頼できるデバイスとして、登録するだけですぐにできそうです。
(ちなみにBluetoothでペアリングさせるには、ペアリングさせる端末のBluetoothを両方ともONにして、検出させてやれば簡単に行うことができます。)

スマホを信頼できるデバイスとして、Nexus7側へ登録したので、早速ロックを解除してみたいと思います。

まず、ロック状態から

LOCK1

・・・・

あれ?

スマホ既に近くにあるのにロック状態になってる・・・。

 

そんな気はしていましたが、Bluetoothが接続状態でないとこの機能は有効になりません。
確認してみたところ、未接続の判定になっておりました。

LOCK3

ぱっと思いつく解決策としては、

1.スマホ側でBluetoothの設定を開き、手動で接続し接続が活きている間はロックが解除される。

2.Bluetoothでテザリングを行えば、接続有効になるので、その状態であればロックが解除される。

あたりかと思います。

「1.」はNFCの時と同じで手動で接続するぐらいなら、普通にロックを解除したほうが楽です。

「2.」は外出先で利用する場合に、スマホのテザリングを利用している方は、割りと有りな選択しではないかと思います。

と言うことで、とりあえず「信頼できるデバイス」として、スマホを登録しておけばテザリング時にはSmart Lockの恩恵を受けることができるかと思います。

いやーこれは、スマートウォッチほしいなー。

Smart Lockの機能に信頼できる場所が追加されたので続き書きました