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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0828
sakureUnicodeのメールを送信したいのですが、本文が途中で切れてしまいます。5未解決


sakure

リンク

2010/8/28(Sat) 06:11:14|NO.34665

実行すると送信する文が表示されます。

実際に送信したメールを受信すると、
件名が文字化けし、
本文の最初の「이것은」以降が切れてしまいます。


どのようにすれば全文送信できるでしょうか。
よろしくお願いします。


以下コードになります。

#include "user32.as"
#include "hspinet.as"
;――――――――――――――――――――――――――――――――――――――――
;モジュール
;――――――――――――――――――――――――――――――――――――――――
;ユニコード部分
;小ワザ/Win32API関連/Unicodeのデータをmes命令のように表示する
;http://hspdev-wiki.net/?%BE%AE%A5%EF%A5%B6%2FWin32API%B4%D8%CF%A2%2FUnicode%A4%CE%A5%C7%A1%BC%A5%BF%A4%F2mes%CC%BF%CE%E1%A4%CE%A4%E8%A4%A6%A4%CB%C9%BD%BC%A8%A4%B9%A4%EB
;より転載
;
;メール送信部
;転載(転載元失念…)
;――――――――――――――――――――――――――――――――――――――――
/////////////////////////////
; ユニコード表示部
#module
#deffunc mesW var p1, local p //Unicode対応のAPIを使う
p.0 = ginfo_cx@, ginfo_cy@, ginfo_winx@, ginfo_winy@
DrawTextW@ hdc,varptr(p1),-1,varptr(p),0
return
#global

/////////////////////////////
;メール送信部
;HSP掲示板(失念…)より転載
#module
#include "hspsock.as"
#define SVR_TIMEOUT 100 ; タイムアウト時間(1/10sec)

#deffunc svrwait
sdim reslog,1024
repeat SVR_TIMEOUT
sockcheck 0
if stat=0 : break
await 10
loop
sockget reslog,1024,0
rescode=strmid(reslog,0,3)
return

#deffunc setmail str _p1, int _p2, str _p3, str _p4
; メールサーバーの設定(メールを送る前に設定してください)
; setmail "サーバーアドレス", ポート番号, "認証ユーザー名", "認証パスワード"
svradr = _p1
svrport = _p2
svruser = _p3
svrpass = _p4
return

#deffunc sendmail str adrfrom, str adrto, str subject, str txdata
; メール送信
; sendmail "送信元アドレス","送信先アドレス","タイトル","本文"
; (statが0ならば送信成功、1以上ならばエラーが発生しています)
; (先にsetmailでサーバーの設定を行なっておいてください)
sockopen 0,svradr,svrport
svrwait
if rescode!="220" : rescode@=rescode:return 1
/* EHLOコマンドを送信 */
sockput "ehlo "+svradr+"\n",0
svrwait
if rescode!="250" : return 2
/* AUTH LOGINコマンドを送信 */
sockput "auth login\n",0
svrwait
if rescode!="334" : return 3
/* ユーザー名を送信 */
srcbuf=svruser
b64encode@ res,srcbuf
sockput res+"\n",0
svrwait
if rescode!="334" : return 4
/* パスワードを送信 */
srcbuf=svrpass
b64encode@ res,srcbuf
sockput res+"\n",0
svrwait
if rescode!="235" : rescode@=rescode:return 5
/* MAIL FROMコマンドを送信 */
sockput "mail from:"+adrfrom+"\n",0
svrwait
if rescode!="250" : return 6
/* RCPT TOコマンドを送信 */
sockput "rcpt to:"+adrto+"\n",0
svrwait
if rescode!="250" : return 7
/* DATAコマンドを送信 */
sockput "data\n",0
svrwait
if rescode!="354" : return 8

data ="From:"+adrfrom+"\n"
data+="To:"+adrto+"\n"
data+="Subject: "+subject+"\n"
data+="Content-Type: text/plain; charset=UTF-8\n"
data+="Content-Transfer-Encoding: 8bit\n\n" ;ここまでヘッダ
data+=txdata ;本文

sockput data,0
sockput "\n.\n",0

svrwait
if rescode!="250" : return 9

/* QUITコマンドを送信 */
sockput "quit",0
return 0

#global

;――――――――――――――――――――――――――――――――――――――――
;本体
;――――――――――――――――――――――――――――――――――――――――
////設定
smtpServer="";サーバ
smtpPort=25;ポート番号
userID="";ユーザーID
pass="";パスワード
from="";送り元
to="";宛先

////ユニコードのメール内容を作成
#define SIZE 70
;65279=FEFF BOM
unicode_num.0=65279,51060,44163,51008,40,12371,12428,12399,41,32
unicode_num.10=50976,45768,53076,46300,51032,40,12518,12491,12467,12540
unicode_num.20=12489,12398,41,32,47928,51109,51077,45768,44620,63
unicode_num.30=40,25991,12391,12377,12363,65311,41,13,10,13
unicode_num.40=10,45348,44,40,12399,12356,12289,41,32,50976
unicode_num.50=45768,53076,46300,51077,45768,45796,46,40,12518,12491
unicode_num.60=12467,12540,12489,12391,12377,12290,41,0,0,0

////件名
sdim unicode_subject,SIZE*2
repeat 10
wpoke unicode_subject,cnt*2,unicode_num.cnt
loop

////本文
sdim unicode_text,SIZE*2
repeat SIZE
wpoke unicode_text,cnt*2,unicode_num.cnt
loop

////作った内容を表示
screen 0,640,480
font msmincho, 16
pos 0,0 :mes "件名":mesW unicode_subject
pos 0,100 :mes "本文":mesW unicode_text
redraw 1

////メール送信
setmail smtpServer,smtpPort,userID,pass
sendmail from,to,unicode_subject,unicode_text
dialog "送信しました"
end



この記事に返信する


skyblue

リンク

2010/8/28(Sat) 10:08:42|NO.34669

こっちで実行したところ、件名&本文がまともに送れていないみたいでした。



sakure

リンク

2010/8/29(Sun) 01:30:12|NO.34689

動作確認ありがとうございます。
引き続き解決への助言を募集します><



木村

リンク

2010/8/29(Sun) 21:11:19|NO.34710

 役に立つかは分かりませんが気付いた点を書かせていただきます。このユニコード文の
メモリダンプの冒頭部分は以下のようになっています。

  0字目<FEFF> (<FF><FE>) [BOF]
  1字目<C774> (<74><C7>) [이]
  2字目<AC83> (<83><AC>) [것]
  3字目<C740> (<40><C7>) [은]
  4字目<0028> (<28><00>) [(]
  5字目<3053> (<53><30>) [こ]

 4文字目に注目してください。この文字は<00>と<28>の2バイトで構成されていますが、
内一つが<00>です。<00>はASCIIコードやShift-JISにおける終端コード[BOF]です。
 HSPのヘルプではsockput命令は『文字列型変数の内容をそのまま送信』すると書かれて
います。送信するサイズ指定がない事も併せて考えると、sockput命令は<00>のバイトに
突き当たるまでの範囲の情報を転送する命令の可能性があります。
 そうなると、本文が3文字しか転送できなかった理由も説明できる可能性があります。(
4文字目の頭がEOFだった為、4文字目以降の情報が送られなかったと類推できるから)

 件名の文字化けについても何となく予想できそうな可能性があります。文字化けの内容は
『??ヌΞ@ヌ(』のような感じでしょうか? だとすれば、件名をShift-JIS形式で読み込んだ
為に文字化けしたのだと思われます。

 残念ながら、こちらの環境では『b64encode@』命令がコンパイルに引っ掛かって確認は取れ
ませんでした。ですので、もしよろしければ送る文字コードを以下のように修正してみたものを
試してみてください。

(A) unicode_num.4を10000に書き換える。(予想が正しければ4文字目の<00>が消えるので
    『이것은✎これは』まで本文が表示されると思われる)
(B) unicode_num.3を65に書き換える。(予想が正しければ3文字目の冒頭に<00>が表れる
    ので『이것』までしか本文が表示されないと思われる)

 最後に、もしこちらの勘違いだったとしたら無駄な労力を取らせてしまった事になるので
予めお詫びいたします。御無礼をば



sakure

リンク

2010/8/30(Mon) 08:43:46|NO.34715

木村さんありがとうございます!

件名は本文の頭から10文字を抜き出したものを送信しており、
受信結果は「ÿþtǃ¬A」という物になっております。

(A)は「이것은✐これは਩」となりました。
(B)は「이것ੁ」となりました。

<00>を終了とみなす命令がHSPには結構あるのは知っていたのですが、
sockputもそうだったのですね。HSPデバッガもそのようですし(汗

sockputを実装するとなると、Winsockでしょうか?う〜む。



inovia

リンク

2010/8/30(Mon) 09:07:39|NO.34716

>sockputを実装するとなると、Winsockでしょうか?う〜む。

sockputbで充分だと思いますが、どうですか?



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