HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0628
wwHSPを使ったメール送信について13解決


ww

リンク

2009/6/28(Sun) 21:56:14|NO.26076

HSPのプログラムでメール送信の機能を実装しようと思っています。

http://www.orewp.net/hsp/tcp_ip/smtp.html

そこで上のページを参考にしてプログラミングをしているのですが、

>実用プログラムに使うのならば、SendDataPart関数に渡すヘッダーを含む本文データは(詳しくはSMTPではなくMIMEの話になるのでここでは割愛させていただきますが)日本語は8bitでなく7bitで転送すべきです。

ここの実装方法がわかりません。どのようにして8bitの文字列を7bitにするのでしょうか?



この記事に返信する


shinkun

リンク

2009/6/28(Sun) 22:54:35|NO.26078

う〜んと、文字コードを JIS に変換すれば良いんじゃないかな?

ここら辺の話はちょっと詳しくないんだけど、転送されてくるメールは
JIS コードで送られて来てたはず。

参考文献 [1]
http://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89#2.E3.83.90.E3.82.A4.E3.83.88.E7.B3.BB.E7.AC.A6.E5.8F.B7.E5.8C.96.E6.96.87.E5.AD.97.E9.9B.86.E5.90.88
「文字符号化方式と文字コード(キャラクタセット)」の項を参照。
JIS が 7 bit コードだと言う事が分かるはず。


変換するための How to は自分で調べてネ。



hatter

リンク

2009/6/29(Mon) 17:26:15|NO.26092

wwさんの話にあまり関係ありませんが、
Base64にエンコードする関数ってこんな感じで良いのでしょうか?

#deffunc base64encode str CODE text = "" while strlen(CODE) strs=strmid(CODE,0,1) CODE = strmid(CODE,-1,strlen(CODE)-1) cnvstow mesh,strs strs = "" while mesh pass = mesh - mesh / 2 * 2 mesh = mesh / 2 if pass:strs = "1" + strs:else:strs = "0" +strs wend while 8-strlen(strs) strs = "0" + strs wend text += strs wend mesh = "" while strlen(text) strs = strmid(text,0,6) text = strmid(text,-1,strlen(text)-6) while 6-strlen(strs) strs += "0" wend pass = 0 while strlen(strs) code = strmid(strs,0,1) strs = strmid(strs,-1,strlen(strs)-1) if code = "0":pass *= 2:else:pass = pass * 2 + 1 wend switch pass case 0:mesh += "A":swbreak case 1:mesh += "B":swbreak case 2:mesh += "C":swbreak case 3:mesh += "D":swbreak case 4:mesh += "E":swbreak case 5:mesh += "F":swbreak case 6:mesh += "G":swbreak case 7:mesh += "H":swbreak case 8:mesh += "I":swbreak case 9:mesh += "J":swbreak case 10:mesh += "K":swbreak case 11:mesh += "L":swbreak case 12:mesh += "M":swbreak case 13:mesh += "N":swbreak case 14:mesh += "O":swbreak case 15:mesh += "P":swbreak case 16:mesh += "Q":swbreak case 17:mesh += "R":swbreak case 18:mesh += "S":swbreak case 19:mesh += "T":swbreak case 20:mesh += "U":swbreak case 21:mesh += "V":swbreak case 22:mesh += "W":swbreak case 23:mesh += "X":swbreak case 24:mesh += "Y":swbreak case 25:mesh += "Z":swbreak case 26:mesh += "a":swbreak case 27:mesh += "b":swbreak case 28:mesh += "c":swbreak case 29:mesh += "d":swbreak case 30:mesh += "e":swbreak case 31:mesh += "f":swbreak case 32:mesh += "g":swbreak case 33:mesh += "h":swbreak case 34:mesh += "i":swbreak case 35:mesh += "j":swbreak case 36:mesh += "k":swbreak case 37:mesh += "l":swbreak case 38:mesh += "m":swbreak case 39:mesh += "n":swbreak case 40:mesh += "o":swbreak case 41:mesh += "p":swbreak case 42:mesh += "q":swbreak case 43:mesh += "r":swbreak case 44:mesh += "s":swbreak case 45:mesh += "t":swbreak case 46:mesh += "u":swbreak case 47:mesh += "v":swbreak case 48:mesh += "w":swbreak case 49:mesh += "x":swbreak case 50:mesh += "y":swbreak case 51:mesh += "z":swbreak case 52:mesh += "0":swbreak case 53:mesh += "1":swbreak case 54:mesh += "2":swbreak case 55:mesh += "3":swbreak case 56:mesh += "4":swbreak case 57:mesh += "5":swbreak case 58:mesh += "6":swbreak case 59:mesh += "7":swbreak case 60:mesh += "8":swbreak case 61:mesh += "9":swbreak case 62:mesh += "+":swbreak case 63:mesh += "/":swbreak swend wend while strlen(mesh)-strlen(mesh)/4*4 mesh += "=" wend return mesh



SYAM

リンク

2009/6/29(Mon) 18:05:27|NO.26093

数字と対応した特定の文字を得るには、
文字列変数の配列を作っておくか、
文字を全部突っ込んだ文字列からstrmidで1文字を取得するか。
どっちかにするとスクリプトがスマートにできますね。



(^q^)

リンク

2009/6/29(Mon) 20:52:56|NO.26094

>変換するための How to は自分で調べてネ。
いやあ・・・これが調べてもわかんないもので・・・(^ω^;)

>hatterさん
何処かでビットシフトとか使った画期的なスクリプトを見た覚えが・・・どこいったんだろう・・・



(^q^)

リンク

2009/6/29(Mon) 20:54:28|NO.26095

あらま名前が('A (^q^)→ww



hatter

リンク

2009/6/29(Mon) 21:29:05|NO.26096

> SYAMさん
つまり
switch pass 〜 case0 〜 case1 〜swend
の部分を
mesh += strlen(base64,pass,1)
に置き換えて
適当な位置に以下のような定義を入れると言うことですね。
base64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
どうも、親切にご指摘ありがとうございます。



hatter

リンク

2009/6/29(Mon) 21:31:40|NO.26098

mesh += strlen(base64,pass,1)
ではなく
mesh += strmid(base64,pass,1)
でしたどうも失礼しました。



hatter

リンク

2009/6/30(Tue) 15:36:45|NO.26110

> >実用プログラムに使うのならば、SendDataPart関数に渡すヘッダーを含む本文データは(詳しくはSMTPではなくMIMEの話になるのでここでは割愛させていただきますが)日本語は8bitでなく7bitで転送すべきです。
> ここの実装方法がわかりません。どのようにして8bitの文字列を7bitにするのでしょうか?
あのページのスクリプトで以下のようになっているのを
data+="Content-Transfer-Encoding: 8bit\n\n" ;ここまでヘッダ
以下のようにして
data+="Content-Transfer-Encoding: base64\n\n" ;ここまでヘッダ
本文を
base64でエンコードすれば平気だと思います。
参考文献[1]
http://ja.wikipedia.org/wiki/Multipurpose_Internet_Mail_Extensions#Content-Transfer-Encoding

あと、Base64にエンコードする関数として載せたコードは
strmidとstrlenが日本語文字が2byteなので2文字と識別するため、
日本語文字を上手く変換できません。どうすればいいのでしょうか?



shinkun

リンク

2009/6/30(Tue) 21:00:29|NO.26122

> ww さん

以下のページに書かれたコードが参考になると思います。

参考資料 [1]
http://www.tohoho-web.com/wwwkanji.htm
「各コード間の変換アルゴリズム」項の「(4) シフトJIS から JIS に変換」

このコードで本当に変換出来るか確認していませんが、
有名なとほほさんのページなので、たぶん大丈夫かと。

ページ中では、C 言語で解説してあるみたいですが、
知らなくても理解出来ると思いマス。

頑張って!!



shinkun

リンク

2009/6/30(Tue) 21:21:18|NO.26123

> hatter さん

> あのページのスクリプトで以下のようになっているのを
> data+="Content-Transfer-Encoding: 8bit\n\n" ;ここまでヘッダ
> 以下のようにして
> data+="Content-Transfer-Encoding: base64\n\n" ;ここまでヘッダ
> 本文を
> base64でエンコードすれば平気だと思います。

ああ、ごめんなさい。
Wikipedia の Base64 を見てみたら、base64 も電子メールで利用されてるんですね。
日本語で電子メールと言ったら、JIS とばっかり…。

勉強になります。



ロックンロールウインドウズ

リンク

2009/7/2(Thu) 06:58:53|NO.26151

ttp://www.squirrelmail.jp/
こちらにPHPでWEBメールってのがあります。
参考になるかならないかわかりませんが、一応アドレス張っておきますね。
HSPNEXTさんでサンプルが登場してから勉強させてもらおうと思ってるオイラはへタレ(笑)。



hatter

リンク

2009/7/2(Thu) 10:08:24|NO.26153

前のbase64エンコードして送る方法は
このhttp://www.orewp.net/hsp/tcp_ip/smtp.hspのスクリプトの

data ="From: "+FROM+"\n" data+="To: "+TO+"\n" data+="Subject: "+SUBJECT+"\n" data+="Content-Type: text/plain; charset=Shift_JIS\n" data+="Content-Transfer-Encoding: 8bit\n\n" data+=MAINDATA
以上の部分を


data = "Date: Mon, 19 Jun 2009 09:6:29 +0900\n" data += "From: "+FROM+"\n" data += "To: "+TO+"\n" data += "Subject: "+SUBJECT+"\n" data += "MIME-Version: 1.0\n" data += "Content-Type: multipart/mixed; boundary=\"boundary_str\"\n" data += "Content-Transfer-Encoding: base64\n\n" data += "--boundary_str\n" data += "Content-Type: text/plain; charset=Shift_JIS\n" data += "Content-Transfer-Encoding: base64\n\n" date = base64(MAINDATA)

以上にようにしてbase64エンコードするbase64という関数を定義すればO.K
私が作ったヤツでも構いませんが日本語対応はまだしておりませんので...

以下にMIMEとBase64の関係について書いてあると思います。
[参考文献]
http://www.atmarkit.co.jp/fnetwork/rensai/netpro03/netpro01.html




(^q^)

リンク

2009/7/2(Thu) 21:29:07|NO.26165


#module #deffunc __initBase64 if fInitBase64:return encodeTable="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" dim decodeTable,256/4 : memset decodeTable,128,256 repeat 26:poke decodeTable,'A'+cnt,cnt:loop repeat 26:poke decodeTable,'a'+cnt,cnt+26:loop repeat 10:poke decodeTable,'0'+cnt,cnt+52:loop poke decodeTable,'+',62 poke decodeTable,'/',63 poke decodeTable,13,129 poke decodeTable,10,129 poke decodeTable,'=',254 poke decodeTable,0,255 fInitBase64=1 return #defcfunc EncodeBase64 var src,int srclen __InitBase64 mref destIndex,64 dest="":memexpand dest,(srclen+2)/3*4+(srclen+2)/3*4/76*2+1 srcIndex=0 : destIndex=0 repeat srclen/3 rdata=peek(src,srcIndex)<<16 | peek(src,srcIndex+1)<<8 | peek(src,srcIndex+2) poke dest,destIndex,peek(encodeTable,rdata>>18) poke dest,destIndex+1,peek(encodeTable,rdata>>12&63) poke dest,destIndex+2,peek(encodeTable,rdata>>6&63) poke dest,destIndex+3,peek(encodeTable,rdata&63) srcIndex+=3 : destIndex+=4 if destIndex\78==76: poke dest,destIndex,"\n" : destIndex+=2 loop if srclen\3>0{ rdata=peek(src,srcIndex) poke dest,destIndex,peek(encodeTable,rdata>>2) if srclen\3==1{ poke dest,destIndex+1,peek(encodeTable,rdata<<4&63) wpoke dest,destIndex+2,0x3d3d ;'==' }else{ rdata=(rdata&3)<<8 | peek(src,srcIndex+1) poke dest,destIndex+1,peek(encodeTable,rdata>>4) poke dest,destIndex+2,peek(encodeTable,rdata<<2&63) poke dest,destIndex+3,'=' } destIndex+=4 if destIndex\78==76: poke dest,destIndex,"\n" : destIndex+=2 } poke dest,destIndex,0 return dest #global

このモジュール(どこで拾ってきたっけ・・・)とNO.226153で解決しました hatterさん他ありがとうございます><



ONION software Copyright 1997-2023(c) All rights reserved.