WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:perlでsendmailで添付ファイル

0:[投稿] kougamiteru [2002/04/12 16:29 ][環境:WIN+IE UNIX系+Perl]

お聞きします。
perlでCGIを組み、ある処理を経てメールがsendmail送信されるスクリプトで添付ファイルを添付したものを送信することは可能ですか?もちろん、添付したいファイルはすでにサーバーにあるものとします。

print OUT "Errors-To: $mailto\n";
print OUT "To: $attimail\n";
print OUT "From: $kottimail\n";
&cngjis("Subject: $subject"); print OUT "$msg\n";
print OUT "Content-Transfer-Encoding: 7bit\n";
print OUT "Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n\n\n";

&cngjis("-----送信内容-----"); print OUT "$msg\n\n";
中身
&cngjis("------------------"); print OUT "\n$msg\n\n";
close(OUT);

sub cngjis {
    $msg = $_[0]; &jcode'convert(*msg, 'jis');
}

こんな感じの状態ですが、ここのヘッダに付け加えるといいのでしょうか?(勘)
ご存知の方いらっしゃいましたらよろしくお願いします。


1:[回答] age [2002/04/12 17:41 ]

http://www.parkcity.ne.jp/~chaichan/src/perl05.htm#sendmail
とりあえず、この辺でどうでしょうか...。


2:[回答] kougamiteru [2002/04/15 15:54 ]

ありがとうございました。できました。
ところで、サーバーにアップしているデータファイルをサーバー上で圧縮してメールに添付するなんて荒業は可能なのでしょうか。
ふと思ったものです。


3:[回答] kougamiteru [2002/04/15 17:35 ]

open(IN,"$csv_file");
flock( IN,1 );
@lines = <IN>;
flock( IN,8 );
close(IN);

push(@lines,"$a,$b,$c,$d,$e\n");

open(OUT,">$csv_file");
flock( OUT,2 );
print OUT @lines;
flock( OUT,8 );
close(OUT);

&send_mail;
&fin_html;

こんな風にフォームから送られてきたデータをcsvファイルに上書き保存したのち、サブルーチンsend_mailにてそのcsvデータを送信してみていますが、どうしても一番新しいデータの途中までしか追加されていません。
処理が間に合わないなんてことあるのでしょうか。
教えてください。


4:[回答] kougamiteru [2002/04/15 18:38 ]

処理が終わったから(csvへの書き込みが完了したから)サブルーチンsend_mailへ移行しているのではないのですか?
それなのに未だ$csv_fileが未完成というのはわかりません。
何度も何度も試していますが、そのたびにcsv_fileに書き込まれている量が変わります。
($cまでのときもあるし、$dの途中までのときもある)


5:[回答] kougamiteru [2002/04/18 12:29 ]

すみません、もう一度質問させていただきます。

フォームがあり、そこに記入し送信すると「送信しました画面」が出ます。

内部では、
・フォームからもらったデータをcsvに書き出し処理
・「送信しました画面」表示処理
・mail送信処理(csv添付)

となっていますが、送信されてきたmailに添付されているcsvファイルが、なぜか尻切れのデータなのです。
過去データに新しいデータを上書き保存し送信しているはずなのですが、その最新データ(今回のメールを送信するきっかけとなったフォーム送信データ)の途中までしかcsvファイルに記録されていません。
例えば
※名前,住所,年齢,コメントとします。

山田太郎,東京都,45,こんにちは
木村次郎,大阪府,16,こんばんわ
鈴木一郎,愛知県,27,打率4割

というcsvファイルを添付し送信するはずが

山田太郎,東京都,45,こんにちは
木村次郎,大阪府,16,こんばんわ
鈴木一郎,愛知県,27,打

というふうに、途中までしか記録されていないのです。
どうしてなんでしょう。

対応策が思いつかないのでどなたかアドバイスをお願いします。


6:[回答] age [2002/04/18 13:25 ]

base64のエンコーディングは、ちゃんとしましたか?


7:[回答] kougamiteru [2002/04/18 15:00 ]

してある・・と思います。
以下、そのスクリプトです。

require './mimew.pl';


sub sendlog {
    open(FILE,"$csvfile")|| &error('開きません');
    $sdata = join('',<FILE>);
    close(FILE);

    $encodedata = &bodyencode($sdata);
    $encodedata .= &benflush;

    $header =<<"END";
FormMailer: FormMail
To: $mailto
From: $hostmail
Subject: $subject
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="$bound"
END

    $body =<<"END";
--$bound
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit

csvデータを添付しているメールです。

--$bound
Content-Type: application/octet-stream; name="$csvfile"
Content-Transfer-Encoding: BASE64

$encodedata

--$bound--
END

    &jcode'convert(*header,'jis');
    &jcode'convert(*body,'jis');
    $header .= "Content-length: ".length($body)."\n";

    if (open(OUT,"| $sendmail -t")) {
        print OUT "$header\n$body";
        close(OUT);
    }
}

こんなかんじです。
参考になりますか?


8:[回答] B-Cus [2002/04/19 02:58 ]

>>7
> $header .= "Content-length: ".length($body)."\n";

このときの改行コードは LF で、送信されたメールは CR+LF に
なってるに一票。


まずは、受け取ったメールのソースを見るべきでしょう。

そこが尻切れになってるなら、メール送信の問題。
ちゃんと --$bound-- まで送られてるなら、$encodedata の問題。


9:[回答] kougamiteru [2002/04/19 10:18 ]

追記
サーバーにあるcsvファイルをftpで落としてみると、きちんと保存されていました。

なお調査中・・・


10:[回答] kougamiteru [2002/04/19 10:23 ]

> ちゃんと --$bound-- まで送られてるなら、$encodedata の問題。

送られています・・
コード変換に的を絞ってみます。


11:[回答] kougamiteru [2002/04/19 11:38 ]

http://www.parkcity.ne.jp/~chaichan/src/perl05.htm#sendmail

ここの書き方をそのまま使っているのですが、うまくいきません。
どなたか添付マスターいませんか?


12:[回答] B-Cus [2002/04/19 13:00 ]

>>10
> 送られています・・
> コード変換に的を絞ってみます。

じゃあ、bodyencode した結果を bodydecode して、元データと
一致するか調べるとか。mimer.pl はここにあります。
 http://www.cc.rim.or.jp/~ikuta/mime_pls/index.html

あと、できればこういう MIME の作り方はせずに、まともなパッケージを
使った方がよいでしょう。
 MIME::Sender http://jenda.krynicky.cz/perl/Sender.pm.html

> どなたか添付マスターいませんか?

普通のメーラーで multipart メールを送って そのソースを見れば、
どういう形式が正しいのかわかるでしょう。


ところで、
 http://www.parkcity.ne.jp/~chaichan/src/perl05.htm#sendmail
からたどれる
 http://www.parkcity.ne.jp/~chaichan/src/mimew.txt
って、再配布の条件に従っていないんじゃないですか?

# http://www.cc.rim.or.jp/~ikuta/mime_pls/document.html#distribute

仮に従っているとしても、こういう置き方ではドキュメントはないし、配布元の
web ページもわからないし、最新版であることも保証できないんじゃないですか?
何を考えて mimew.pl だけ置いているのか全く理解できないです。


13:[回答] しなのむし [2002/04/19 13:51 ]

>普通のメーラーで multipart メールを送って そのソースを見れば、
>どういう形式が正しいのかわかるでしょう。

そうそう。微妙なところでおかしくなったりします。
Outlook Expressで読めてもEudraで読めないなんてことも
ありましたから、複数のメーラーでテスト
うまくいかないメーラーがあればそのソースと見比べる
といった作業が必要かもしれません。


14:[回答] kougamiteru [2002/04/19 19:12 ]

> うまくいかないメーラーがあればそのソースと見比べる
といった作業が必要かもしれません。

早速、ソースを単純比較してみました。

ソース表示はいずれもOE6.0。
OEからOEへ送り正確に表示されたものに「あり」
フォームから送り不正確であったものに「ない」
部分がいくつかありました。
(※以後上記OE間送信を○、フォーム送信を×とします)
以下に記します。(※〜このみみずに囲まれた部分はコメントです。〜)

〜ヘッダ付近〜
X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook Express 6.00.2600.0000
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000
Status:  

This is a multi-part message in MIME format.

------=_NextPart_000_008A_01C1E7CF.6BAC8740
Content-Type: multipart/alternative;

〜この下から本文です〜
〜本文の終わり〜

Content-Type: text/html;
    charset="iso-2022-jp"
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Diso-2022-jp">
<META content=3D"MSHTML 6.00.2600.0" name=3DGENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV><FONT size=3D2><FONT=20
size=3D3>=1B$BKLN&7z@_90:Q2qMM=1B(B<BR><BR>=1B$BK\F|$N%m%0%G!<%?$H$J$j$^$=
9!#=1B(B<BR>=1B$B$h$m$7$/$*4j$$$7$^$9!#=1B(B</FONT></FONT></DIV></BODY></=
HTML>

〜ここまで【謎】のHTML?〜
〜ここからはcsvデータ〜

×データは1行に72文字記されているのに対し、○データは76文字と4文字多く、ちなみに44行と8文字でした。×のデータ量は46行ジャスト。
これを見る限り、ひょっとして端数切り捨てられたのかな?と思ってしまいます。

それ以外は違いが見当たりませんでした。
これって参考になりますか??ここまで来たら知りたいです。(モジュールも知りたいですが^^)


15:[回答] しなのむし [2002/04/21 01:00 ]

(BASE64エンコーディングがうまくいっていると仮定して)
要は正しく表示されるmultipartのメールと同じようなソースを吐くように
プログラムを作りかえれば良いわけでしょう?

間違いさがしのようなものなので
フォームから送ったメールのソースを丸々公開したら
早いような気もしますが。


16:[回答] R.M [2002/04/22 03:03 ]

> ×データは1行に72文字記されているのに対し、○データは76文字と4文字多く、ちなみに44行と8文字でした。×のデータ量は46行ジャスト。
同じバイナリを使っているならサイズがおかしいと思います。
base64がうまくいっているかどうか、調べるべきかと。
...最後の行がとんでるとか?


17:[回答] kougamiteru [2002/04/22 10:14 ]

> 間違いさがしのようなものなのでフォームから送ったメールの
> ソースを丸々公開したら早いような気もしますが。

そうですね。前回送ったものがほとんど全部だったのですが、一応丸々送ります。(ただ、アドレスなどは変更しています。)
#####################################################

>From bin  Mon Apr 22 10:23:00 2002
Received: from test.test.to (test.test.to [192.168.0.0])
    by test.test.go (8.9.3+3.2W/3.7W.1) with SMTP id KAA11722
    for <test@test.to>; Mon, 22 Apr 2002 10:23:00 +0900
Received: (qmail 30311 invoked by uid 80); 22 Apr 2002 00:45:47 -0000
Date: 22 Apr 2002 00:45:47 -0000
Message-ID: <20020422004547.30310.qmail@test.test.to>
FormMailer: FormMail
To: test@test.go
From: test@test.to
Subject: 添付ファイルテスト
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="doushiteshirigire"
Status:  

--doushiteshirigire
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit

ドラえもんへ

用件は添付ファイルにあります。
助けてドラえもん。

--doushiteshirigire
Content-Type: application/octet-stream; name="kougamiteru.csv"
Content-Transfer-Encoding: BASE64
Content-Disposition: attachment; filename="kougamiteru.csv"

MjAwMi8wNC8xOShGcmkpIDEwOjExLGRuczEucGFsZXR0ZS13ZWIuY28uanAsMjEwLjIzMC4y
MDYuMjI2LHB3LnBla29yaS5qcCxNU0lFIDYsV2luMjAwMCwyLHdhZXRhd2UsNDCNzpHjLJJq
kKsskM6Q7IynLHZlcnRlcnQsd2V0d2V0QHdldHdlLndldHdlCjIwMDIvMDQvMTkoRnJpKSAx
MDoxMyxkbnMxLnBhbGV0dGUtd2ViLmNvLmpwLDIxMC4yMzAuMjA2LjIyNixwdy5wZWtvcmku
anAsTVNJRSA2LFdpbjIwMDAsMyxkb3JhZW1vbm5vYml0YWt1bnN1bmVvZ2lhbnNoaXp1a2Fj
aGFuZGVraXN1Z2lrdW4sNDCNzpHjLI+XkKssi3uP6YynLGRvcmFlbW9ubm9iaXRha3Vuc3Vu
ZW9naWFuc2hpenVrYWNoYW5kZWtpc3VnaWt1bixkb3JhZW1vbm5vYml0YWt1bnN1bmVvZ2lh
bnNoaXp1a2FjaGFuZGVraXN1Z2lrdW5Aby5vCjIwMDIvMDQvMTkoRnJpKSAxMDo1OCxkbnMx
LnBhbGV0dGUtd2ViLmNvLmpwLDIxMC4yMzAuMjA2LjIyNixwdy5wZWtvcmkuanAsTVNJRSA2
LFdpbjIwMDAsMyxkb3JhZW1vbm5vYml0YWt1bnN1bmVvZ2lhbnNoaXp1a2FjaGFuZGVraXN1
Z2lrdW4sNDCNzpHjLI+XkKssi3uP6YynLGRvcmFlbW9ubm9iaXRha3Vuc3VuZW9naWFuc2hp
enVrYWNoYW5kZWtpc3VnaWt1bixkb3JhZW1vbm5vYml0YWt1bnN1bmVvZ2lhbnNoaXp1a2Fj
aGFuZGVraXN1Z2lrdW5Aby5vCjIwMDIvMDQvMTkoRnJpKSAxMTowMSxkbnMxLnBhbGV0dGUt
d2ViLmNvLmpwLDIxMC4yMzAuMjA2LjIyNixwdy5wZWtvcmkuanAsTVNJRSA2LFdpbjIwMDAs
Myxkb3JhZW1vbm5vYml0YWt1bnN1bmVvZ2lhbnNoaXp1a2FjaGFuZGVraXN1Z2lrdW4sNDCN
zpHjLI+XkKssi3uP6YynLGRvcmFlbW9ubm9iaXRha3Vuc3VuZW9naWFuc2hpenVrYWNoYW5k
ZWtpc3VnaWt1bixkb3JhZW1vbm5vYml0YWt1bnN1bmVvZ2lhbnNoaXp1a2FjaGFuZGVraXN1
Z2lrdW5Aby5vCjIwMDIvMDQvMTkoRnJpKSAxMTo1MSxkbnMxLnBhbGV0dGUtd2ViLmNvLmpw
LDIxMC4yMzAuMjA2LjIyNixwdy5wZWtvcmkuanAsTVNJRSA2LFdpbjIwMDAsMyxkb3JhZW1v
bm5vYml0YWt1bnN1bmVvZ2lhbnNoaXp1a2FjaGFuZGVraXN1Z2lrdW4sNDCNzpHjLI+XkKss
i3uP6YynLGRvcmFlbW9ubm9iaXRha3Vuc3VuZW9naWFuc2hpenVrYWNoYW5kZWtpc3VnaWt1
bixkb3JhZW1vbm5vYml0YWt1bnN1bmVvZ2lhbnNoaXp1a2FjaGFuZGVraXN1Z2lrdW5Aby5v
CjIwMDIvMDQvMTkoRnJpKSAxMTo1NCxkbnMxLnBhbGV0dGUtd2ViLmNvLmpwLDIxMC4yMzAu
MjA2LjIyNixwdy5wZWtvcmkuanAsTVNJRSA2LFdpbjIwMDAsMiyCzYK2gt+CxJFTlZSNxYzj
gtyCxZGXguqCvYFFgUWCsYLqgsWQrIz3gsiCzIK+guuCpIKpgUKC3IK+iOqTeILIgsyCxZCz
kryLXoKigs2QsILqgsiCoiw3MI3OiMiP4yySapCrLJDDiaqMpyyQw4mqiNqPWox2ieYyLTIs
bmlpZ2F0YWhhZG9ueW9yaWt1cmFpaGliaWdha29rb3Jvbm9uYWthd29tdXNpYmFtdXlvdW5h
a2lnYXN1cnVub2RlQHNoaXp1b2thbmkuaWp1CjIwMDIvMDQvMTkoRnJpKSAxNjoxNCxkbnMx
LnBhbGV0dGUtd2ViLmNvLmpwLDIxMC4yMzAuMjA2LjIyNixwdy5wZWtvcmkuanAsTVNJRSA2
LFdpbjIwMDAsMSyPiZBTjtKCzIK9gt+CzINHg1iLjJO+gumT/Jblg3CBW4OLg0GDk4Nog1aB
W0dJjL6M6oOKg3SDQIOMg5ODWCw3MI3OiMiP4yySapCrLIt7j+mMpyyCoIKigqSCpoKogqmC
q4Ktgq+CsYKzgrWCt4K5gruCvYK/gsKCxILGgsiCyYLKgsuCzCxhYmNkZWZnQGhpamtsbW4u
b3BxcnN0dQoyMDAyLzA0LzE5KEZyaSkgMTY6NDYsZG5zMS5wYWxldHRlLXdlYi5jby5qcCwy
MTAuMjMwLjIwNi4yMjYscHcucGVrb3JpLmpwLE1TSUUgNixXaW4yMDAwLDEsk5aRSY7Sgs2N
xILRgUGOd5a8guKPWo+KgUGTZJhilNSNhoFBj6SVaYLMlV2Jv4LIgseCzI/ulfGC8JP8l82C
tYLEkZeQTYK3gumBQoKxguqCyYLmgsGCxJBIlWmDgYFbg0qBW4LNj8GU747Sg4qDWINnguKP
pJVpgsyKtJF6gsiCx4Lwj1eC34LnguqC6YFCLDEwjc6IyIm6LI+XkKssiauT6oynLJPflGWO
c4K1gueCu4LTgp+C3YLqgscsYWtlbWFzaGl0ZW9tZWRldG91QHBhbGV0dGUtd2ViLmNvLmpw
CjIwMDIvMDQvMTkoRnJpKSAxODoyMixkbnMxLnBhbGV0dGUtd2ViLmNvLmpwLDIxMC4yMzAu
MjA2LjIyNixwdy5wZWtvcmkuanAsTVNJRSA2LFdpbjIwMDAsNCyTlpFJjtKCzY3EgtGBQY53
lryC4o9aj4qBQZNkmGKU1I2GgUGPpJVpgsyVXYm/gsiCx4LMj+6V8YLwk/yXzYK1gsSRl5BN
greC6YFCgrGC6oLJguaCwYLEkEiVaYOBgVuDSoFbgs2PwZTvjtKDioNYg2eC4o+klWmCzIq0
kXqCyILHgvCPV4LfgueC6oLpgUIsNTCNzpHjLJJqkKssjq2OmZOHjKcsk5aRSY7Sgs2NxILR
gUGOd5a8guKPWo+KgUGTZJhilNSNhoFBj6SVaYLMlV2Jv4LIgseCzI/ulfGC8JP8l82CtYLE
kZeQTYK3gumBQoKxguqCyYLmgsGCxJBIlWmDgYFbg0qBW4LNj8GU747Sg4qDWINnguKPpJVp
gsyKtJF6gsiCx4Lwj1eC34LnguqC6YFCLGFrZW1hc2hpdGVvbWVkZXRvdWhhamltZW1hc2hp
dGVAa29ubmljaGl3YS5iYWliYWlzYXlvdW5hcmEKMjAwMi8wNC8yMihNb24pIDA5OjQ1LGRu
czEucGFsZXR0ZS13ZWIuY28uanAsMjEwLjIzMC4yMDYuMjI2LHB3LnBla29yaS5qcCxNU0lF
IDYsV2luMjAwMCwyLIKxgvGCyYK/gs2BQiw1MI3OkeMskmqQqyyQwpBYjKcskLeJqo5zLGhh
cnVoYWFrZWJvbm9AeW95b3VzaGlyb2t1bmFyaXl1a3V5YW1hZ2l3YXN1a29zaWFrYXJpdGVt
dXJhc2FraWRhdGl0YXJ1a3Vtb25vaG9zb2trdXRhbmFiaWtpdGFydXRvaXV5dXVtZWluYWt1
Z2FhcmlhbXN1Z2Frb3JlaGFtdXJhc2FraXNoaWtpYnVub2thaXRhbW9ub2Rlc3VuZS5jb20K


--doushiteshirigire--

########################################################
こんな感じです。

> ...最後の行がとんでるとか?

やっぱり、確信しました。何度フォームから送っても、データを見ると上記のように確実に端数切捨て?されています。
つまり、最後の行を切り捨てられてるのではないでしょうか。
何のためにそんなことを・・・chopなどもどこにもないのですけどね。


18:[回答] しなのむし [2002/04/22 10:59 ]

10行13列のCSVファイルですよね?
ちゃんとOEでデコード出来ましたよ。

ヘッダがOEのものとだいぶ異なるようなので
まずは整えてみてはいかがでしょう。


19:[回答] kougamiteru [2002/04/22 12:32 ]

ただいま整え中ですが、完全に同じくするのはやや厳しいようですね。
謎のHTML(>14)など、よくわからない記述がありますし。


20:[回答] kougamiteru [2002/05/02 10:22 ]

> 同じバイナリを使っているならサイズがおかしいと思います。
> base64がうまくいっているかどうか、調べるべきかと。

恐れ入ります。どうやって調べるといいのでしょうか。

> ...最後の行がとんでるとか?

相変わらずきれいに飛んでいます・・・


21:[回答] kougamiteru [2002/05/02 10:46 ]

OEから自分宛に添付メール送信をしていますが、今まで
Content-Transfer-Encoding: base64

となっていたものが
Content-Transfer-Encoding: quoted-printable
となっています。何もしていないのに。
ソースも、違うコードっぽく記述されています。
どうしてなのでしょうか。また余計な問題が増えてしまった・・


22:[完了] kougamiteru [2002/05/02 15:10 ]

かっっ解決しました!

$encodedata = &bodyencode($sdata);
$encodedata .= &benflush;

↓↓↓

$encodedata = &bodyencode($sdata, "b64");
$encodedata .= &benflush("b64");

としたら、尻切れ問題が解決しました!
mimew.plをもっとよく観察すればよかったのかな。
気分晴れ晴れ^^またperlをすきになりそう
何はともあれ、みなさまありがとうございました。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World