PREV | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

| スポンサー広告 | --:-- | comments(-) | trackbacks(-) | TOP↑

≫ EDIT

開発実況3日目

メール送信用のデータまで出来たので、今日は実際にメールサーバーと通信してメールデータを送ってみたいと思う。

「smtp プロトコル」でgoogle検索。

プロトコルに直接触れる - SMTP

メールサーバーにTelnetで入れるのか。実際にやってみる。



mailt1
例にならってTelnetで手動メール送信

mailt2 
お~、ちゃんとメール来たよ

おお、ちゃんとメールが届いてる。SMTP送信の場合はユーザーもパスワードも無しでいけるのか。だからPOP before SMTPとか同じネットワーク上からしか送信出来ないしくみがあるんだな。
とりあえずセキュリティは考えないで単純に送るしくみだけ作ってみよう。

多分ポート25でサーバーにつないで以下の手順でデータを送れば出来るのだろう。

←ポート25でサーバーに接続
→220 なんちゃらが返ってくる
←HELO 127.0.0.1とか送る
→250 なんちゃらが返ってくる
←MAIL FROM:<送信者アドレス>
→250 なんちゃら
←RCPT TO:<宛先アドレス>
→250 なんちゃら
←DATA
→354 なんちゃら
←昨日作ったメールのデータ
←.
→250 なんちゃら
←quit

ピリオドが終端だとすると、メール本文に「.」だけの行があった場合どうなるんだろう。とりあえずこちらは先に調べておこう。

SMTPコマンドリファレンス

ふむふむ、今はHELOの代わりにEHLOを使った方が良いらしい。「.」が行頭にくる場合、「..」に置き換えると良いらしい。

さて、TCP/IP通信の処理を組もう。と思ったが、壁が。Windows CEはCAsyncSocketやCSocketが使えないので通信処理の組み込みが難しい。 かと言ってWinsockの通信を自力でやるのも面倒だ。
調べてみるとCSocketのサブセットのCCeSocketが使えるらしい。とりあえずCSocketで組んでみよう。

(試行錯誤)

なんとか通信部分完了。簡単に書くと

・CSocketのサブクラスを作る
・Connectでサーバーに接続
・OnReceiveでデータ通知を受け取る
・Receiveでデータを受け取る
・Sendでデータをほりなげる
・終了したらShutdownした後終了。

OnReceiveでメッセージを受け取って、220とか250とか来たら次のアクションに移る。 横着だけどOnTimerを使って5秒間アクションがなかったらタイムアウトで切断する。

これでやってみる。EHLOを使ったら、2回に分けてメッセージが飛んできて判定が面倒なのでHELOを使う。

さぁ、実行だ~

mailt3 
昨日のメールデータ作成に続き、そのままTCP/IPでデータ送信

mailt4
Telnetのやりとりを自動でやる感じ

mailt5
Beckyで受信~

やた~~~メール送れた~ばんざ~い。
多少力技でやってるので他のサーバーでもちゃんと動くかは分からないがまぁとりあえずはよしとしよう。

さて、これでPC上からは添付付きのメールを自力で送れたので、今度はCEへの移植作業へと移る。 Unicodeでプログラム組んだので、コードで修正するのはCSocketぐらい。上手く動くといいな~。

と思いつつやや大きめのファイルを添付してみると添付ファイルが上手く開けない事が発覚。 調べてみると受信時Base64のデータが2kb毎に1バイト改行コードに置き換わってしまっている。なぜだろう。

[PHP-users 20626]Re: mail関数で文字数制限?

どうやら1行1000文字制限があるらしい。面倒だけどRFCを見てみる。

RFC 2821

確かに1000文字と書いてある。というわけでBase64のエンコード処理に300バイト単位で改行を入れてみる。

再度挑戦。OK。完璧。

つづく~

| 開発 | 10:31 | comments:0 | trackbacks:0 | TOP↑

COMMENT















非公開コメント

TRACKBACK URL

http://nefa.blog117.fc2.com/tb.php/16-6dd4dc58

TRACKBACK

PREV | PAGE-SELECT | NEXT

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。