世界的日曜WEBプログラマー日記 -14ページ目

世界的日曜WEBプログラマー日記

一年後に世界的なWEBサービスを運営するにはどうすればいいのか書いていく(予定)

AmazonSESをLinuxで使うための設定を記します。
コマンドベースからAmazonSESを使ってメール送信が可能です。大まかな流れて押しては、
1.API登録
2.デヴィロッパーツールのダウンロード
3.諸環境の設定
4.Amazonへプロダクション申請
となっています。


(1)まずAmazonのAPIキーは事前に取得しておく必要があります。
Amazon SES settings

(2)API取得後、次のDevelopmentToolをダウンロードして下さい。
Development Tools,
http://aws.amazon.com/developertools/Amazon-SES/8945574369528337

以下は構築した際の流れを記します。

(3)次のプロダクトをインストールして下さい。
$ mkdir -p /var/git/maishoku/webapps/scripts/ses
$ wget http://d36cz9buwru1tt.cloudfront.net/catalog/attachments/ses-tools-2012-07-09.zip
$ unzip ses-tools-*.zip # you need to install unzip command if you dont have.
$ sudo apt-get
$ sudo apt-get install gcc g++ make libyaml-perl libxml2 libxml2-dev libssl-dev
$ sudo perl -MCPAN -e 'install Digest::SHA'
$ sudo perl -MCPAN -e 'install URI::Escape'
$ sudo perl -MCPAN -e 'install Mozilla::CA'
$ sudo perl -MCPAN -e 'install Bundle::LWP'
$ sudo perl -MCPAN -e 'install LWP::Protocol::https'
$ sudo perl -MCPAN -e 'install MIME::Base64'
$ sudo perl -MCPAN -e 'install Crypt::SSLeay'
$ sudo perl -MCPAN -e 'install XML::LibXML'


続いて aws-credentials( 名前は何でもOK ) を作成します。そこの先ほど取得したAccessKEY, SecretKeyを入れて下さい。

$ emacs aws-credentials
AWSAccessKeyId=Aceess Key ID
AWSSecretKey=Secret Access Key


(4)メール送信の準備が整いました。
PERL5LIBはアマゾンのDevToolのパスを記載します。環境に応じて変えて下さい。
$ export PERL5LIB=/var/git/maishoku/webapps/scripts/ses/bin

メールを送信するses-send-email.plを使いますが、使い方は以下のとおりです。
Usage:
ses-send-email.pl [--help] [-e URL] [-k FILE] [--verbose] -s SUBJECT -f
FROM_EMAIL [-c CC_EMAIL[,CC_EMAIL]...] [-b BCC_EMAIL[,BCC_EMAIL]...]
TO_EMAIL[,TO_EMAIL]...

ses-send-email.pl [--help] [-e URL] [-k FILE] [--verbose] -r [-f
FROM_EMAIL] [TO_EMAIL[,TO_EMAIL]...]

$ ./ses-send-email.pl -k aws-credentials -s "Test Email" -f noreply@maishoku.com support@maishoku.com < README
上記コマンドでメールがおくれます。なお、プロダクションのリクエストをAmazonにしないと次のようなエラーが出ます。
Email address is not verified.

(5)プロダクションリクエストは次から行えます。
https://portal.aws.amazon.com/gp/aws/html-forms-controller/contactus/SESProductionAccess2011Q3



蛇足

エラーの詳細を知りたい場合は、上記コマンドにVerboseオプションをつけます。するとXML形式でエラーが表示されます。


Sender
MessageRejected
Email address is not verified.

4b6e77ec-7481-11e2-94e0-f9544ceb749b


お疲れ様でした。

株式会社OctOpt
コンピューターサイエンス会社OctOptの技術公式ブログ
等々力 康弘
@rocky_house
プロセス系のPythonスクリプトを書いていると、あるプログラムが指定時間以上経過したら即座にプログラムをエラーとみなして終了したい、という処理をしたい時がある。
例えばSeleniumとかでWebチェックをする時、ほっておくといつまでたっても返事がかえってこない。そのため時間制限をもうけて、時間以内は正常、それ以外は異常など処理したい時など。
お弁当宅配サイトのマイ食の自動テストサービスを作っているときにこの必要性があった)

ここではフォークして、今の仕事を子供プロセスに任せる。親プロセスは子プロセスを指定時間までまち、指定時間経過後もまだ子供プロセスが生きていたら殺す。というプログラムの例を載せる。
signal, os, sysなどを使う。
本当はThreadingを使ってSignalをやりとりでいいじゃないか!という人もいるかもしれないけれど今回はそうしなかった。感覚的にThreadingでSignalをやり取りするのはなんかマズイ気がするが…。

とにかく今回はForkで。。

import time, os, sys, signal

def mysleep( secs ):
time.sleep( secs )

def doit( limit_waiting_time, function, **args ):
child_id = os.fork()
if child_id != 0: # Parent process
# Waiting for child process to do some works
time.sleep( limit_waiting_time )
# Seach child process whther the process is workinng.
commands = os.popen( 'ps aux | grep %d | grep -v grep' % child_id )
lines = commands.readlines()
# There is no line or Zonbi process in the line, then the child was dead. ( OK )
if len( lines ) == 0 or 'Z+' in lines[ 0 ].strip():
CAN_KILLED=True
else: # The child process is still working( not killed, not good )
os.kill( child_id, signal.SIGKILL ) # kill it.
CAN_KILLED=False


if CAN_KILLED:
return True
else:
return False

else: # !! Child process !!
function( **args ) # doit something as child.
sys.exit() # <= not to write os._exit

def main():
print doit( 3, mysleep, secs = 5.0 )

if __name__ == '__main__':
main()


関数のmysleepはサンプルのために作った適当な関数。この部分を独自の関数にすればいい。
doitがメインの関数となっている。(名前に問題あるかもしれないけど、今はこれでいいかなと)

株式会社OctOpt
コンピューターサイエンス会社OctOptの技術公式ブログ
等々力 康弘
@rocky_house
宅配弁当のマイ食では40店舗近い飲食店さんと現在やりとりさせていただいてます。
なんと、ほとんどがE-mailではなくFaxベースです。

Faxを受信後、E-mailでその内容を送信できたらなぁと思ったらできたので、そのやり方を記します。
GmailでLinuxからEmailを送る方法についても下で説明致します。

まずはファックス受信サーバーの構築


FaxDispatchの作成。
次に新しくファイルを作って下さい。通常では無いはずです。
$ emacs /var/spool/hylafax/etc/FaxDispatch
SENDTO=todoroki@maishoku.com;
FILETYPE=tif;

これだけで上記指定のE-mailにTifを送信してくれます。やさしい。
PDFが良ければtifをPFDに変更する。
また複数の場合はSENDTO=newemail@new.com; ドンドン縦に列挙して下さい。


メール送信サーバーの構築@linux and Postfix(Gmail経由)


ただし、送信にはPostfixの設定が必要。
さらにSmtpでメール送信サーバーを…とややこしくなるので、ここでは
Gmailを利用したPostfixサーバーを構築します。
(要はGmail経由でメールが送信できる!)

Postfix で Gmail を relayhost にする (Ubuntu)

Ubuntu を触ることのほうが多いので、設定方法をメモしておきます。

必要なパッケージをインストール。
$ sudo apt-get install sasl2-bin postfix libsasl2-2 ca-certificates libsasl2-modules
postfix の設定ファイルを編集
$ sudo emacs /etc/postfix/main.cf
以下の内容を追記
relayhost = [smtp.gmail.com]:587
#sasl setting
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
#tls setting
smtp_use_tls = yes

/etc/postfix/sasl_passwd を作成(メールアドレスやパスワードは各自のものを)
$ emacs /etc/postfix/sasl_passwd
[smtp.gmail.com]:587 username@gmail.com:password

/etc/postfix/sasl_passwd の権限変更

$ chown root:root /etc/postfix/sasl_passwd
$ chmod 600 /etc/postfix/sasl_passwd


hash形式の /etc/postfix/sasl_passwd.dbを作成
$ postmap /etc/postfix/sasl_passwd

postfixの再起動

$ /etc/init.d/postfix restart

無事に出来たかどうかは次のコマンド
$ sudo apt-get install mailutils # mailコマンドのインストール
$ echo test|mail anyany@anynamehere.domain.com # テスト送信

FAXを無事受診して送ってくれた。やるでやんす。

株式会社OctOpt
コンピューターサイエンス会社OctOptの技術公式ブログ
等々力 康弘
@rocky_house