在宅ワークのリアルをベテランとビギナーにインタビュー>>

ここで一週間も止まっています、どなたか助けてください。

あるサーバーにたまっているメールを受信して
Net::POP3;
MIME::Parser;
などを利用して本文を取り出したりしています。

件名などはきちんと解析できて日本語にできるのですが、どうしても本文だけはどうなっているのかわかりません。エンコード、デコードなどの説明が書いてあるサイトをたくさんみて200回くらいいろんな方法やパターンを試してみて本文を復元しようと試みましたが 「$B$^$7$m?'%7%s%U%)%K!<$N%Q%s$K$c(B」の文字は何も変わることなく、さすがに気が狂いそうになりましたのでここで質問しようとおもいます。

emlで保存したファイルから本文を取り出すことはできますが、読める状態になりません。

どなたか教えていただけないでしょうか?

いったい、どうしたらメールの本文をきちんと読める状態にできるのしょう?

=========================
Subject: =?ISO-2022-JP?B?GyRCJF4kNyRtPyclNyVzJVUlKSVLITwbKEI=?=
To: test@test.com
Status: RO
X-UIDL: 1358842469.4950.s323,S=1722
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

$B$^$7$m?'%7%s%U%)%K!<$N%Q%s$K$c(B

このQ&Aに関連する最新のQ&A

A 回答 (2件)

No1 のお礼にあるプログラムを見る限り JIS でファイルに保存し、異なる環境 (UTF8, Shift_JIS など) で表示しているに過ぎないのではないかと思います。

確認方法として、ブラウザを利用することができます。xxx.txt などの名前で保存して、ブラウザで正常に表示されて文字エンコーディングが JIS (ISO-2022-JP) になっている、または文字エンコーディングを JIS (ISO-2022-JP) にしたら正常に表示された、のような現象であれば文字列として壊れてはいません。

文字列を変換するには、Encode モジュールを利用するのが簡単かと思います。なお、'utf8' のところは環境に合わせて変更してください ('shiftjis', 'cp932', 'euc-jp' など)。

use Encode;
...
@$message = map { encode('utf8', decode('jis', $_)) } @$message;
    • good
    • 0
この回答へのお礼

【 Perl メール 受信 文字化け 】

引き続き、解答ありがとうございますm(__)m

ブラウザにて確認した所、JIS形式になっていましたΣ(゜Д゜)
そして、文字化けもなく 綺麗に「ましろ色シンフォニーのパンにゃ
」と表示されていました・゜・(ノД`;)・゜・

つまり、サーバーに置いてある時点で JIS形式 それを何も加工せずにそのままeml形式に持って行っているという事でしょうか?

さっそく、教えていただいたコードを組み込んで見たいと思います!(またご報告いたします)

========================

お礼日時:2013/02/16 14:54

> $B$^$7$m?'%7%s%U%)%K!<$N%Q%s$K$c(B



本当にこれだけですか?

これだけだと、ISO-2022-JPのESC抜け、という典型的な文字化けパターンになっています。
先頭の$Bの前と、最後の(Bの前にESC( "\e" )を補って、ISO-2022-JP(いわゆる「JIS」)として解釈すれば

ましろ色シンフォニーのパンにゃ

と読めます。

○ メールの通信中にESCが落ちることがあります。
元のメールにESCが無い状態になっているのなら、自前で補う必要があります

○ メールには入っているのに、表示されていない、ということもあります。
ESCのようなコントロールキャラクタは、それ自体が表示されないことがよくあります。
例えば、質問に添付されているメール、どうやって貼り付けましたか?
cat XXXX.eml とか type XXXX.eml
とかして、画面に表示されたものをコピー&ペーストしてませんか?

○ どこかで、コントロールコードを削除するような処理は入っていませんか?
    • good
    • 0
この回答へのお礼

はい、本当にこれだけです。こちらのサイトを参考にして、BODY部分を取り出したりしていました。

http://digit.que.ne.jp/work/index.cgi?Perl%E3%83 …


以下は、そのプログラム(サブルーチン)ですが、

sub main {

my ($server, $account, $password, $protocol, $output) = @_;
my ($outfile, $message);

mkdir($output, 0777) unless (-d $output);
# Net::POP3オブジェクトを生成し、ログイン
my $pop3 = Net::POP3->new($server) or die "Can't not open account.";
my $login = (lc($protocol) eq 'apop') ? 'apop' : 'login';
my $count = $pop3->$login($account, $password);
# メールID/サイズのハッシュリファレンスを取得
my $messages = $pop3->list();
# メールを"<プロセスID>_<連番>_.eml"に保存
foreach $id (sort (keys %{$messages})) {

# $id番のメールを受信
$message = $pop3->get($id);

if ( $message ) { print "メールがありません $message"; }

# ファイル出力
$outfile = sprintf('%s/%d_%s.eml', $output, $$, $id);
if (open(OUT, ">$outfile")) {
print OUT @{$message};
close OUT;

}

}

# 接続を終了
$pop3->quit;

}


これを実行するとしていしたフォルダにemlファイルが生成されます。
そのemlファイルの本文の文字が文字化けしていて、そこでひっかかっていました。

お礼日時:2013/02/15 23:37

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QPerlからメール送信で文字化け

Perl5.8からsendmailを使ってメール送信しています。
髙や﨑が入ると文字化けします。文字化けしないようにする方法を教えてください。



#!/usr/bin/perl
require 'jcode.pl';
require 'mimew.pl';
$sendmail = '/usr/lib/sendmail';

print"Content-type: text/html\n\n test\n";

if (!(open(OUT,"| $sendmail -t -i -f xxxx\@hogehoge.co.jp"))) { ; }

print OUT "To: xxxx\@hogehoge.co.jp\n";
print OUT "From: xxxx\@hogehoge.co.jp\n";
print OUT "Reply-To: xxxx\@hogehoge.co.jp\n";

$subject = "サブジェクト 髙﨑";
$subject = &mimeencode($mail_subject);
print OUT "Subject: $mail_subject\n";

print OUT "Mime-version: 1.0\n";
print OUT "Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n";
print OUT "Content-Transfer-Encoding: 7bit\n\n";

$honbun = "メール本文 髙﨑";
&jcode'convert(*honbun, 'jis');
print OUT "$honbun\n";

close(OUT);

Perl5.8からsendmailを使ってメール送信しています。
髙や﨑が入ると文字化けします。文字化けしないようにする方法を教えてください。



#!/usr/bin/perl
require 'jcode.pl';
require 'mimew.pl';
$sendmail = '/usr/lib/sendmail';

print"Content-type: text/html\n\n test\n";

if (!(open(OUT,"| $sendmail -t -i -f xxxx\@hogehoge.co.jp"))) { ; }

print OUT "To: xxxx\@hogehoge.co.jp\n";
print OUT "From: xxxx\@hogehoge.co.jp\n";
print OUT "Reply-To: xxxx\@hogehoge.co.jp\n";

$subject = "サ...続きを読む

Aベストアンサー

根本的には perl の問題ではありません。
「髙」や「﨑」といった文字は、JIS(ISO-2022-JP)では規定されていないため、
ISO-2022-JPのメールに入れることはできないのです。

文字コードがUnicodeであれば、「髙」や「﨑」を表現できますので、

・perlのスクリプトを、Unicode(UTF-8)で記述するようにする
・メールのcharset を UTF-8で送信するようにする
・文字コードの変換を、perl4時代の古いライブラリ(Unicode非対応)である「mimew.pl」や「jcode.pl」ではなく、perl5世代の「Encode.pm」を使う

という対応になるかと思います。

---ここから---
#!/usr/bin/perl
use strict;
use utf8;

use Encode;

my $sendmail = '/usr/lib/sendmail';

print "Content-type: text/html\n\n test\n";

my $out;
if (!(open($out,"| $sendmail -t -i -f xxxx\@hogehoge.co.jp"))) { ; }

print $out "To: xxxx\@hogehoge.co.jp\n";
print $out "From: xxxx\@hogehoge.co.jp\n";
print $out "Reply-To: xxxx\@hogehoge.co.jp\n";

my $mail_subject = "サブジェクト 髙﨑";
$mail_subject = encode('MIME-Header', $mail_subject);
print $out "Subject: $mail_subject\n";

print $out "Mime-version: 1.0\n";
print $out "Content-Type: text/plain\; charset=\"UTF-8\"\n";
print $out "Content-Transfer-Encoding: 8bit\n\n";

my $honbun = "メール本文 髙﨑";
$honbun = encode("UTF-8", $honbun);
print $out "$honbun\n";

close($out);
---ここまで---

といった形でしょうか。

ただし、最近はまず大丈夫だと思いますが、
「日本語のメール」としては、ISO-2022-JPで送るのが主流であり、UTF-8で送った場合にはメールソフトによっては問題が出るかもしれないことは覚悟する必要があるかと思います。

根本的には perl の問題ではありません。
「髙」や「﨑」といった文字は、JIS(ISO-2022-JP)では規定されていないため、
ISO-2022-JPのメールに入れることはできないのです。

文字コードがUnicodeであれば、「髙」や「﨑」を表現できますので、

・perlのスクリプトを、Unicode(UTF-8)で記述するようにする
・メールのcharset を UTF-8で送信するようにする
・文字コードの変換を、perl4時代の古いライブラリ(Unicode非対応)である「mimew.pl」や「jcode.pl」ではなく、perl5世代の「Encode.pm」を使う

という対...続きを読む

QPerlにおいてPOP3経由でメールを受信する方法。添付ファイル

http://digit.que.ne.jp/work/index.cgi?Perl%A5%E1%A5%E2%2FPerl%A4%C7%A5%E1%A1%BC%A5%EB%A4%F2%BC%F5%A4%B1%A4%EB

を参考にしてメールを受信するプログラムをつくってみました。
しかし、添付ファイルを別に保存する方法がわかりません。
(http://digit.que.ne.jp/work/index.cgi?Perl%A5%E1%A5%E2%2FPerl%A4%C7%A5%E1%A1%BC%A5%EB%A4%F2%BC%F5%A4%B1%A4%EB より)

if (open(OUT, ">$outfile")) {
print OUT @{$message};
close OUT;
}

のところで @{$message} を操作すれば、本文や添付ファイルを別々に保存することができるとおもうのですが、やり方がわかりません。MIME::Parserを使えばよいという情報がありましたが、日本語ファイル名で不具合があるなどという情報も見受けられます。
実際レンタルサーバにおくのでMIMI::Parserも使えるかどうか微妙です。



添付ファイルと本文を別々に保存する方法が分かる方がおられましたら、ご教授お願いします。

http://digit.que.ne.jp/work/index.cgi?Perl%A5%E1%A5%E2%2FPerl%A4%C7%A5%E1%A1%BC%A5%EB%A4%F2%BC%F5%A4%B1%A4%EB

を参考にしてメールを受信するプログラムをつくってみました。
しかし、添付ファイルを別に保存する方法がわかりません。
(http://digit.que.ne.jp/work/index.cgi?Perl%A5%E1%A5%E2%2FPerl%A4%C7%A5%E1%A1%BC%A5%EB%A4%F2%BC%F5%A4%B1%A4%EB より)

if (open(OUT, ">$outfile")) {
print OUT @{$message};
close OUT;
}

のところで @{$message} を操作す...続きを読む

Aベストアンサー

Net::POP3に詳しくないのであれですが、とりあえず「$message」を「use Data::Dumper」してみては?

use Data::Dumper;
print $message;

#最悪内容がそのままでも、mime_plsとか使えば何とかなるでしょう。

QPerlでメール本文と添付ファイルを切り分ける方法?

perlでメールを受信して、添付ファイル部分をファイルにするスクリプトを書こうとしているのですが
知識がなく進めません。

単なるメールの受信は Mail::POP3Clientを使えば、簡単に出来ましたが
BODY部で、本文と 添付ファイルを区別して
本文には $honbun
添付ファイル @tenpu({-fname=>ファイル名, -content=>中身ファイル}, ...

という風に、簡単にメールボディ部を切り分ける方法やモジュールはあるのでしょうか?

例)
This is a multi-part message in MIME format.------=_NextPart_000_000F_01C59927.53E8
B0E0Content-Type: text/plain;format=flowed;charset="iso-2022-jp";reply-type=
originalContent-Transfer-Encoding: 7bit------=_NextPart_000_000F_01C59927.53E8B0E0C
ontent-Type: application/octet-stream;name="Tk-800.024.tar.gz"Content-Transfer-En
coding: base64Content-Disposition: attachment;filename="Tk-800.024.tar.gz"H4sICBX
bhDwCA1RrODAwLjAyNC50YXIA7DxrV9vIkvka/Yq6xBvLQX7ySnDCxRgTvAs2i0weJx

...

perlでメールを受信して、添付ファイル部分をファイルにするスクリプトを書こうとしているのですが
知識がなく進めません。

単なるメールの受信は Mail::POP3Clientを使えば、簡単に出来ましたが
BODY部で、本文と 添付ファイルを区別して
本文には $honbun
添付ファイル @tenpu({-fname=>ファイル名, -content=>中身ファイル}, ...

という風に、簡単にメールボディ部を切り分ける方法やモジュールはあるのでしょうか?

例)
This is a multi-part message in MIME format.------=_N...続きを読む

Aベストアンサー

添付ファイル付きのメールは、普通、multipart/mixed とか multipart/form-data の形式になっていると思います。
なので、単純にboundary(デリミタ)で切り分ければいいだけですが、面倒ならMIME::Parserモジュールでも簡単ですね。

複数のファイルが添付されていれば、同じように区切られているだけですが、同じファイル名の場合もあるので注意が必要です。

ちなみに、自分で切り分ける方法をもう少し詳しく書くと、メッセージヘッダの中に「boundary=xxx」なんていうものが書かれているはずですから、これは「xxx」によって区切られている、という意味です。区切ったものは、さらにコンテントヘッダなどが付いていて、続いてボディ部、つまりデータが並んでいます。

Qutf-8でメールを送信すると件名が文字化け

Perlでメールフォームを作成しております。
今後のこともあってUTF-8でファイル、HTMLの出力をおこなっております。
なにかとutf-8便利でさくさくと問題なく作成していたのですがメール送信の肝心な部分で問題が出てきました。
送信先はiモードで506iです。
メールのヘッダーを以下のようにして送ると件名の日本語がどうしても文字化けします。本文はしません。アウトルックエクスプレス6.0では文字化けしません。YahooWebメールは文字化けしました。

Reply-To: $adminmail
Errors-To: $adminmail
To: $user_mail
From: $adminmail
Subject: $subject
content-transfer-encoding: 7bit
Content-type: text/plain; charset=utf-8

・携帯がutf-8に対応していないメーラーなんだろうと思いますがなぜ本文は文字化けしないんでしょうか。
・件名を文字化けをしないようにする方法はありますでしょうか?(ファイルの保存形式はutf-8を変えずに)

Perlでメールフォームを作成しております。
今後のこともあってUTF-8でファイル、HTMLの出力をおこなっております。
なにかとutf-8便利でさくさくと問題なく作成していたのですがメール送信の肝心な部分で問題が出てきました。
送信先はiモードで506iです。
メールのヘッダーを以下のようにして送ると件名の日本語がどうしても文字化けします。本文はしません。アウトルックエクスプレス6.0では文字化けしません。YahooWebメールは文字化けしました。

Reply-To: $adminmail
Errors-To: $adminmail
To: $u...続きを読む

Aベストアンサー

私もサブジェクトが文字化けしてしまい苦しみました。
携帯での文字化けということなので役に立つかわかりませんが、

以下のサイトを参考にして、
http://www.securehtml.jp/utf-8/perl_utf_mail.html
メールフォーム用に書き直してみたものです。

<!-- ここから -->
##Perlの冒頭に入れる1行
##MIME::Base64がインストールされていることが前提
use MIME::Base64;

##送信処理
local($msub,$mbody,$headers);
$msub = $_[0];
$mbody = $_[1];
$headers = $_[2];

# メールタイトル
$msub = "テスト送信完了通知";

$mbody .= "メール送信テスト\n\n";
$mbody .= "名前:$in{'name'}\n\n";

$msub = $subject;

$headers = "From:$email\nMIME-Version: 1.0\nContent-Type: text/plain; charset=utf-8\nContent-Transfer-Encoding: base64\n";

$eol = "";
$msub_b = encode_base64($msub,$eol);
$msub_b = "=?utf-8?B?" . $msub_b . "?=";

open(MAIL,"| $mailprog -t") || &error("メール送信に失敗しました");
print MAIL $headers;
print MAIL "To: $mailto\n";
print MAIL "Subject: $msub_b\n\n";
print MAIL encode_base64($mbody);
close(MAIL);
<!-- ここまで -->

$msubがサブジェクトで、$mbodyが本文です。
$msub_bがエンコードされたサブジェクトということになります。
エンコード対象外(半角英数のみ)の部分を$headersにまとめています。
参考サイトのソース順のまま流用しようとすると文字化けします。

参考URL:http://www.securehtml.jp/utf-8/perl_utf_mail.html

私もサブジェクトが文字化けしてしまい苦しみました。
携帯での文字化けということなので役に立つかわかりませんが、

以下のサイトを参考にして、
http://www.securehtml.jp/utf-8/perl_utf_mail.html
メールフォーム用に書き直してみたものです。

<!-- ここから -->
##Perlの冒頭に入れる1行
##MIME::Base64がインストールされていることが前提
use MIME::Base64;

##送信処理
local($msub,$mbody,$headers);
$msub = $_[0];
$mbody = $_[1];
$headers = $_[2];

# メールタイトル
$msub = ...続きを読む

Qメールのヘッダーに書かれている”Date”について

みなさまこんにちは。
お伺いしたいのは、受信したメールのヘッダーの"Date"についてです。

時差のある外国に住んでいる人からメールが来ました。
Dateには、日時の後に標準時刻が+-で表示されますよね?見てみると、確かにはっきりと日本との時差が出ています。
これは、相手が送信した(書いた?)日時なのですよね?
この日時と言うのは、送信者のパソコンで設定している日時なのでしょうか?

…例えば、送信者が自分のPCの時刻を変更して送信した場合も、こうやって表示されるものなのですか?

また、そのメールはYAHOOメールだったのですが、
あぁいったサービスでは、その辺はどう反映されるのでしょうか?YAHOOメールで時刻が設定されているのか、やはり送信者のPCの設定によるものなのか…。
疑問が疑問を生んでいて、頭がこんがらがっています。

また、X-ArrivalTimeというのは何なんでしょうか?
調べても探しきれませんでした…。

どうぞよろしくお願い致します。

Aベストアンサー

Date:ヘッダにある+-の数字は、正確には世界標準時(GMTまたはUTC)と現地標準時との時差です。
(ご存じかもしれませんが念のため)

> これは、相手が送信した(書いた?)日時なのですよね?

そうです。メールを送信した日時です。

> この日時と言うのは、送信者のパソコンで設定している日時なのでしょうか?

はい。通常はそうです。その為、時々数年先の未来や何年も前の過去からメールが届くことがあります(笑)
# 送り主が日付の設定を間違えているだけの話ですが

> …例えば、送信者が自分のPCの時刻を変更して送信した場合も、こうやって表示されるものなのですか?

はい。変更した後の時刻や時差が反映されます。

> あぁいったサービスでは、その辺はどう反映されるのでしょうか?

きちんと確認したわけではないですが、画面を表示させているWWWサーバ側の設定が反映されるものと思われます。(PCでは表示と入力をやっているだけなので)

> また、X-ArrivalTimeというのは何なんでしょうか?

よく判りませんが、受信者のメーラーまたは受信側のメールサーバが、メールを受信した時刻だと思います。
インターネットで共通して使用しているヘッダではないので、恐らく情報はないかあっても見つけにくいと思います。

Date:ヘッダにある+-の数字は、正確には世界標準時(GMTまたはUTC)と現地標準時との時差です。
(ご存じかもしれませんが念のため)

> これは、相手が送信した(書いた?)日時なのですよね?

そうです。メールを送信した日時です。

> この日時と言うのは、送信者のパソコンで設定している日時なのでしょうか?

はい。通常はそうです。その為、時々数年先の未来や何年も前の過去からメールが届くことがあります(笑)
# 送り主が日付の設定を間違えているだけの話ですが

> …例えば、送信者が自分の...続きを読む

Qメールのデコード方法について教えてください

受信メールから、本文と添付ファイルを取出してサーバー内の
ディスクへの保存するというperlスクリプトの作成を考えています。
そこでbase64のデコードの為のモジュールとしてMIME::Base64
(Version: 3.07)を使いたかったのですが、MIME::Base64が対応する
のはperlのバージョンが5.008以上のようでした。
(サーバー内のperlは5.004です)

既存のプログラムへの影響を考えてperlのバージョンをあげずに
受信メールの本文と添付ファイルをデコードする方法はありましたら
御教示お願いします。

(必要な情報が不足していましら御指摘下さい)

Aベストアンサー

古いバージョンには当たってみましたか?
MIME::Base64はver.2.13ならperl 5.004でも使えそうです。

http://search.cpan.org/~gaas/MIME-Base64-2.13/

要求versionは5.002になっています。

Q文字コードの変換(Shift-JISからUTF8)

文字コードがShift-JISのCSVファイルを読み込み、UTF-8のテキストファイルに出力するのに
プログラムの中で変更しようとしているのですが、うまくいきません。出力ファイルの文字コードを
確認するとShift-JISのままです。
どなたか教えていただけないでしょうか?
ActivePerl v5.16.0を使用し、Encodeモジュールのfrom_toを使用しています。

#!/usr/bin/perl

use strict;
use warnings;

use utf8;
use Encode;

my $input_file="input.csv";
my $output_file="output.txt";
open (IN, $input_file) or die "$!";
open (OUT, ">$output_file") or die "$!";

while (<IN>){
chomp ($_);
my @data=split(/,/,$_);

for(my $i=0;$i<@data;$i++){
$data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換
$data[$i]=~s/\s+//g;
print OUT $_;
}
print OUT "\n";
}
close (IN);
close (OUT);

文字コードがShift-JISのCSVファイルを読み込み、UTF-8のテキストファイルに出力するのに
プログラムの中で変更しようとしているのですが、うまくいきません。出力ファイルの文字コードを
確認するとShift-JISのままです。
どなたか教えていただけないでしょうか?
ActivePerl v5.16.0を使用し、Encodeモジュールのfrom_toを使用しています。

#!/usr/bin/perl

use strict;
use warnings;

use utf8;
use Encode;

my $input_file="input.csv";
my $output_file="output.txt";
open (IN, $input_file) or die "$!...続きを読む

Aベストアンサー

あの、私のや他の回答をよく読んで考えてください。


for(my $i=0;$i<@data;$i++){
$data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換
$data[$i]=~s/\s+//g;
print OUT $_;
}

この部分は **** $_には何の影響も与えません ****
よって、** 出力に関することだけに注目したら **

for(my $i=0;$i<@data;$i++){
print OUT $_;
}

これと等価です。どこで「Shift_JIS からUTF-8へ変換」してますか?
$_は「while (<IN>){」の<IN>で1行読み込まれ、「chomp ($_);」で末尾の改行コードが削除されただけで、移行なにも変化していません。コードは入力のまま=Shift_JISです。それをそのまま出力すればShift_JISになるのが正解です。
しかも、項目数分だけ繰り返し出力されます。
(重複行になる、と#1に書いたのはchompのことを失念していた私のミスです)

@dataを変更したのなら、出力するのは@dataでしょう。
join(",", @data)とすれば、項目をカンマ区切りの文字列にすることができます。


あと#2にあったfrom_toの使い方。マニュアルをよく読みましょう
http://perldoc.perl.org/Encode.html#[$length-=]-from_to($octets,-FROM_ENC,-TO_ENC-[,-CHECK])
・$octetsを直接変換する
・$octetsの長さを返す
とあります。つまり
$data[$i]=Encode::from_to($data[$i],'shiftjis','utf8')
だと,$data[$i]には元の内容は破棄されて、文字列の長さになってしまいます。



各項目毎に処理したい、という意図はわかりました。

ですが、文字コードの変換が項目毎に違うなんてことはまず無いでしょう。
それならば、$_で1行をコード変換→splitして項目毎の処理、としてもいいのでは?

ついでにPerlIOを使って
open (IN, "<:encoding(shift_jis)", $input_file) or die "$!";
open (OUT, ">:utf8", $output_file) or die "$!";
とでもやれば、プログラム中はコードをあまり意識せずに文字列処理ができます。

あの、私のや他の回答をよく読んで考えてください。


for(my $i=0;$i<@data;$i++){
$data[$i]=Encode::from_to($data[$i],'shiftjis','utf8'); #Shift-JISからUTF-8に変換
$data[$i]=~s/\s+//g;
print OUT $_;
}

この部分は **** $_には何の影響も与えません ****
よって、** 出力に関することだけに注目したら **

for(my $i=0;$i<@data;$i++){
print OUT $_;
}

これと等価です。どこで「Shift_JIS からUTF-8へ変換」してますか?
$_は「while (<IN>){」の<IN>で1行読み込まれ、「chomp ($_);」で末尾の改行コ...続きを読む

QPostfixでメールを受信したらPerlスクリプトを実行したい

Solaris10で構築したサーバにて、ユーザー宛のメールを受信したら
Perlで記述したスクリプトを実行したい為、下に記載の手順1及び2の
方法で受信メールを渡すパイプを記述したのですがスクリプトが実行されませんでした。
手順1,2共に他のメールアドレスへ転送させた場合、メールの転送は正常に行われました。
メールを受信したらPerlスクリプトを実行するには、どのように設定すればよいのでしょうか?
main.cfやmaster.cfに更なる設定の記述が必要なのでしょうか?
主な環境は下記の様になっているのですが不足がありましたら御指摘下さい。
申し訳ありませんがよろしくお願いします。

【手順1】~/.forwardによるスクリプト起動
    (1)~/.forwardに、下記の様な記述をしましたがスクリプト起動せず。
(.forwardの記述)
       (パターン1) \username,"|/home/username/test.pl"
       (パターン2) "|/home/username/test.pl"
       (パターン3) |"/home/username/test.pl"
       (パターン4) "|/usr/local/bin/perl /home/username/test.pl"

       ※下記のような転送は処理されました
        \username,username@test.ne.jp

【手順2】main.cf修正によるスクリプト起動
    (1)/usr/local/etc/postfix/main.cfに下記行を作成
      alias_maps = hash:/usr/local/etc/postfix/aliases,hash:/usr/local/etc/postfix/usr_alias

      (usr_aliasの記述) username: :include:/home/username/include
      (includeの記述) |"/home/username/test.pl"
              他に上記.forwardの記述の4パターンを試しましたが全てスクリプト起動せずでした。

【サーバ環境】
OS:Solaris10(Sparc)
MTA:postfix-2.5.3

【test.plの内容】
#!/usr/local/bin/perl
open(DATA_FILE, "> test_log.txt");
print DATA_FILE "Test_OK!!!\n";
close(DATA_FILE);

    ※備考
      ・保存場所:/home/username/test.pl
      ・パーミション:test.plと/home/username共に777
(オーナはusername)

【main.cfについて】
念のために
allow_mail_to_files = alias,forward,include
allow_mail_to_commands = alias,forward,include
の記述を追加しています。

Solaris10で構築したサーバにて、ユーザー宛のメールを受信したら
Perlで記述したスクリプトを実行したい為、下に記載の手順1及び2の
方法で受信メールを渡すパイプを記述したのですがスクリプトが実行されませんでした。
手順1,2共に他のメールアドレスへ転送させた場合、メールの転送は正常に行われました。
メールを受信したらPerlスクリプトを実行するには、どのように設定すればよいのでしょうか?
main.cfやmaster.cfに更なる設定の記述が必要なのでしょうか?
主な環境は下記の様になっているの...続きを読む

Aベストアンサー

転送の方法はそれであっています。

>全てスクリプト起動せずでした。
起動できないと判断したのはどういう事から?
その判断の仕方が間違っている可能性もあります。

QPerlの変数に文字数制限(容量制限)はあるか

Perlの変数に文字数制限(容量制限)はあるか

Perlで書いた自作の掲示板なのですが、ずっと普通に動いていたのですが
急にデータが欠けてしまいました。書き込みデータはテキスト形式で、
↓の様な形で保存しています。

<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n

1つの書き込みは1行に収まっていて、書き込み時に \n を付けて保存して、
読み込み時は配列に読み込んで、べろっと出すだけの処理です。
掲示板書き込みなので unshift で上が新しい書き込みにしてあります。
通常のタグ禁止処理や、改行コード処理はしてあります。Perl5.6.1です。

数日前、容量が減っていることに気付き、調べてみると、

<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き

のような形でデータが欠けていました。欠けていると言っても9割方消えていました。
残っていたのは新しい側の書き込みです。
いつ消えたのか、何をした時に消えたのかが不明のため、原因を探っている段階です。

もちろん、一番怪しいのはプログラムのミスなのですが、それも調べつつ、
ちょっと前から気になっていた点として、データ容量が1.5MBぐらいまで
ふくらんでいて重くなっていたんです。
data.dat のような1ファイルにテキストばかり1.5MB、そして内部の処理でも
普通にその容量を一つの変数に入れたりしています。
データが唐突にぶつっと切れていることと、容量が多くて気になっていたこと、
この辺りでちょっと怪しいのですが、変数の容量制限、ファイルの容量制限が
調べても出てきません。知っている方いましたら教えてください。

他にも、そういうバグの時こういうミスがあったよ、など、ありましたら
アドバイスをお願いします。
自分が作った物のデバッグで恐縮なのですが、よろしくお願いします。

Perlの変数に文字数制限(容量制限)はあるか

Perlで書いた自作の掲示板なのですが、ずっと普通に動いていたのですが
急にデータが欠けてしまいました。書き込みデータはテキスト形式で、
↓の様な形で保存しています。

<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n
<div>1つの書き込みの中身</div>\n

1つの書き込みは1行に収まっていて、書き込み時に \n を付けて保存して、
読み込み時は配列に読み込んで、...続きを読む

Aベストアンサー

No.3&6です。

> flock してません・・・・・・。
> つまり、読み込み時に競合があって書き込まれたため、開いたままのデータが
> 変なところで書き込み処理に割り込まれて、おかしくなったということでしょうか。
> でしょうか、というか、その可能性があった、というところですかね?

ちょっと説明が足りなかったので補足します。

読み込み時にflock()しなかった場合ですが、書き込みが純粋に追記だけの場合は(記事表示で途中で切れることはあるかもしれませんが)データファイルの破損までは至らないかなと思います。もちろん、読み込み内容が壊れるには違いないですので、読み込みルーチンにもflock()は追加すべきです。

データファイルが壊れるケースですが、既存記事の修正機能が実装されている場合などで、読み込みルーチンで取得した@BbsDataの値を使った書き込みルーチンが別にあった場合には、たとえその書き込みでファイルロックがされていたとしてもデータファイルが壊れることになります。

もっともその場合、データ変更に関する一連のロジック自体を見直す必要があるかもしれません。
既存記事の変更を行う場合には、「一度のファイルオープン+ファイルロックの間に、読み書きを全て済ませる」という処理に置き換えないと、ほぼ同時に複数の書き込みが発生した場合に一部のデータが失われるという別の不具合が発生する恐れがあります。ご参考まで。

No.3&6です。

> flock してません・・・・・・。
> つまり、読み込み時に競合があって書き込まれたため、開いたままのデータが
> 変なところで書き込み処理に割り込まれて、おかしくなったということでしょうか。
> でしょうか、というか、その可能性があった、というところですかね?

ちょっと説明が足りなかったので補足します。

読み込み時にflock()しなかった場合ですが、書き込みが純粋に追記だけの場合は(記事表示で途中で切れることはあるかもしれませんが)データファイルの破損までは至らないかなと...続きを読む

Qemlをtxtに変換するには?

パソコンに詳しくないので教えてほしいことがあります。

emlのファイルをtxtに変換したいのですが、1件ずつのやり方しかわかりません。
emlファイルがたくさんあるので変換に時間がかかります。

早急にtxtに変換し、wordに貼り付けて印刷したいのですが、
一気にtxtに変換する方法はないでしょうか?
教えてください、お願いします。


ちなみにoutlook2010、Windows7を使用中です。

Aベストアンサー

>携帯のメールを変換してemlでメールを開くことはできました。

eml形式のファイルは、Thunderbirdのどれでもよいですが、トレイの画面にドラッグ&ドロップで取り込めます。
その方法で閲覧できたら、次のアドオンのImport Export ToolsをThunderbirdにインストールして、有効にしたら、前記のemlファイルを取り込んだトレイの上で右クリック→インポート・エクスポート→フォルダ内の全てのメッセージをエクスポートで、
〇プレーンテキスト形式
〇プレーンテキスト形式(単一ファイル)
が実行できますから、それぞれtxtファイルとして出力できます。
それぞれ指定した場所にフォルダに入った状態でエクスポートされます。

単一ファイルの方はそのままそのtxtファイルを印刷したら、褌状態で連続した印刷物が手に入ります。
添付ファイルは当然落ちますが、ファイル名はスタンプされます。
今後もそのような利用をされることがあるのでしたら、Thunderbirdは便利ですから、入れておけばよいですね。
http://mozilla-remix.seesaa.net/article/28838742.html

>携帯のメールを変換してemlでメールを開くことはできました。

eml形式のファイルは、Thunderbirdのどれでもよいですが、トレイの画面にドラッグ&ドロップで取り込めます。
その方法で閲覧できたら、次のアドオンのImport Export ToolsをThunderbirdにインストールして、有効にしたら、前記のemlファイルを取り込んだトレイの上で右クリック→インポート・エクスポート→フォルダ内の全てのメッセージをエクスポートで、
〇プレーンテキスト形式
〇プレーンテキスト形式(単一ファイル)
が実行できますから、そ...続きを読む


人気Q&Aランキング