Perlメール文字化けの問題と解決法

このQ&Aのポイント
  • Perlを使用してメール送信を作成している中で、文字化けの問題が発生しています。パソコン同士のメール送信では文字化けが解消されたが、異字体の文字化けが発生しています。また、スマホへのメール送信では全ての文字が化ける状態です。解決法としては、パソコンでの文字化けには「Content-Transfer-Encoding: 8bit」を使用することが考えられますが、具体的な使い方が分かりません。スマホでの文字コードについても調査が必要です。
  • 問題は主に2つあります。まず、パソコン同士のメール送信では文字化けが解消されましたが、異字体の文字化けが発生しています。この問題を解決するには、メール送信時に「Content-Transfer-Encoding: 8bit」を使用すると良いでしょう。具体的な使い方については、ドキュメントやネット上で調べてみてください。次に、スマホへのメール送信では全ての文字が化ける状態です。この問題は、スマホでの文字コードに起因している可能性があります。具体的な文字コードについては、スマホの仕様やドキュメントを確認してみてください。
  • Perlを使用してメール送信を作成していますが、文字化けの問題が発生しています。パソコン同士のメール送信では一部の異字体が文字化けしてしまいます。解決策としては、「Content-Transfer-Encoding: 8bit」を使用することが考えられますが、具体的な使い方が分かりません。また、スマホへのメール送信では全ての文字が化けてしまいます。スマホの文字コードについても調査が必要です。
回答を見る
  • ベストアンサー

Perl メール文字化け

#メール本体設定 my $start = '~ホームページより以下の内容を受け取りました~'; my $Name =$q->param('Name'); if($Name eq ""){ print "Content-type: text/plain; charset=Shift_JIS\n\n"; print "名前が入力されていません。\n\nブラウザの戻るボタンで戻ってください。"; exit(1); } my $Sex =$q->param('q1'); my $Age =$q->param('q2'); my $ie =$q->param('ie'); my $Tell =$q->param('Tell'); my $body = $q->param('body'); if($body eq ""){ print "Content-type: text/plain; charset=Shift_JIS\n\n"; print "本文が入力されていません。\n\nブラウザの戻るボタンで戻ってください。"; exit(1); } #my $subject = $q->param('subject'); my $End = '~~~~~~~~~~~~~~~~~~~~~'; #メール送信オブジェクト設定 my $smtp = Net::SMTP->new('n-doboku.jp'); if ( !$smtp ) { print "メールサーバーにアクセスできません!"; exit; } #メール文字コード変換 Encode::from_to($start, 'shiftjis', 'iso-2022-jp'); Encode::from_to($Name, 'utf8', 'shiftjis'); Encode::from_to($Sex, 'utf8', 'shiftjis'); Encode::from_to($Age, 'utf8', 'shiftjis'); Encode::from_to($ie, 'utf8', 'shiftjis'); Encode::from_to($Tell, 'utf8', 'shiftjis'); Encode::from_to($body, 'utf8', 'shiftjis'); Encode::from_to($End, 'shiftjis', 'iso-2022-jp'); #メール送信 $smtp->mail($from); $smtp->to($mailto); $smtp->to($mailcc); $smtp->data(); $smtp->datasend($header); $smtp->datasend("$start\n\n"); $smtp->datasend("名   前 : $Name\n\n"); $smtp->datasend("性   別 : $Sex\n\n"); $smtp->datasend("年   齢 : $Age\n\n"); $smtp->datasend("住   所 : $ie\n\n"); $smtp->datasend("電話番号 : $Tell\n\n"); $smtp->datasend("本   文 : $body\n\n"); $smtp->datasend("$End\n\n"); $smtp->dataend(); $smtp->quit; 現在、 SMTPを使用しメール送信を作成している最中です。 やっと、パソコンからパソコンへメール送信では文字化けしなくなったのですが まず (1)パソコンでも異字体などは文字化けしてしまう(髙や﨑等) おそらく「Content-Transfer-Encoding: 8bit」これを使うのですが、使いかたがわからないです・・・ (2)スマホにメール送信したときはすべて文字化けしてしまうのですが、 スマホでの文字コードとはなんなのでしょうか・・・? また、一回utf8に変換しているのですが、この場合どうするのでしょうか・・・?

  • Perl
  • 回答数4
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.4

>Encode::from_to($Name 'cp932', 'utf-8',); 意味わかって使っていますか? $Nameに文字コードCP932の文字列が入ってるから、それを文字コードUTF-8に変換して$Nameにいれてという意味ですよ? 元の$Nameに入っている文字列の文字コードは何なのですか? CP932以外でしたら嘘を教えてるんだからおかしな変換されても当然です。

r-h-a-o
質問者

お礼

ありがとうございました。 結果的には・・ HTML(シフトJIS)だったらPerlでシフトJISからUTF-8に変換して送る ということですよね・・

r-h-a-o
質問者

補足

そういうことですか・・・ まだしっかり理解ができておりません;; 元々はUTF8だと思うので Encode::from_to($Name, 'utf-8', 'cp932'); ということですね・・・ これではパソコンでは文字化けしません! しかし、スマホでは文字化けします;; これはスマホがcp932が対応していないということでしょうか・・・?

その他の回答 (3)

回答No.3

$headerで UTF-8 を指定しているのに 本文を 、'cp932'(SJIS)にしているのではあれば、文字化けするのは 当然です。 (PCで文字化けしなくなったのは、たまたまそのメーラーが 気を利かしてくれだだけでしょう) ヘッダでの宣言と 実体を一致させれば(1)は 解決します。

r-h-a-o
質問者

お礼

ありがとうございます。

r-h-a-o
質問者

補足

ということは Content-Type: text/plain; charset = "utf8" ↓ Content-Type: text/plain; charset = "cp932" ということでしょうか? これでも文字化けはしないです・・・ Content-Type: text/plain; charset = "utf8" これのまま Encode::from_to($Name 'cp932', 'utf-8',); こうすると文字化けします。。。 ただやはりどちらにしてもスマホで文字化けします・・・ まだ、完全に文字コード変換について理解できてなくすみません;;

回答No.2

(2) > Encode::from_to($start, 'shiftjis', 'iso-2022-jp'); > Encode::from_to($Name, 'utf8', 'shiftjis'); これでは、 $startを sjisからiso-2022-jpへ変換しているのに、 $Nameは utf8からSJISへ変換となっていて 本文中にiso-2020-jp とSJISを混在させてしまっています。 (ソース内で宣言した変数と、POSTされた変数で 変換元のコードが異なるのは 問題ないですが、 変換先が異なるのが問題) なのでまずは 本文で使う変数のコードを統一しましょう。 なにに統一するかというと、$headerの中身の定義が上記にはないですが、 省略されているとして、その中にコードの宣言があるはずです。 例えば $header .= "Mime-Version: 1.0\n"; $header .= "Content-type: text/plain; charset=iso-2022-jp\n"; $header .= "~\n\n"; として charseをiso-2020-jpと宣言しているならば、本文で使う変数のEncode::from_to変換先を 全て 'iso-2022-jp'にします。 (1) ただし、iso-2022-jp を使うと、髙や﨑を送ることができません。 (Outlookとかの一部のメーラーは 例外的に表示してくれますが) よって、POSTデータ(HTML)も、$headerでのメールのコード宣言も、 Encode::from_toでの変換先も 全部UTF-8にしてしまうのが確実でしょう。 (ついでに本文をencode_base64して、メールヘッダでそれを宣言)

r-h-a-o
質問者

お礼

ありがとうございます。

r-h-a-o
質問者

補足

ご回答ありがとうございます。 $startは変換をせずそのまま送ることにしました。 それでパソコンでは文字化けはしなくはなりました。 HTMLフォームから受け取ったデータに関しては そのまま送ると文字化けするみたいなので Encode::from_to($Name, 'utf-8', 'cp932'); このように記載するとパソコンでは文字化けしなくはなったのですが、 $startはそのまま送る $NameはEncode::from_to($Name, 'utf-8', 'cp932'); で送る だとスマホでは文字化けしてしまいます。 $header は下記のようになってます。 my $header = <<"MAILHEADER"; From: $from To: $mailto CC: $mailcc Subject: $subject Mime-Version: 1.0 Content-Type: text/plain; charset = "utf8" Content-Transfer-Encoding: 8bit MAILHEADER ただこれが効いているのかがわからないです。。。

回答No.1

髙ってShift_JISには存在していない文字では?

r-h-a-o
質問者

お礼

ありがとうございます。

r-h-a-o
質問者

補足

回答ありがとうございます。 >髙ってShift_JISには存在していない文字では? だと思い my $Name =$q->param('Name'); Encode::from_to($Name, 'utf8', 'shiftjis'); 例えば ホームページの名前入力欄からのデータの受け渡しが上記のコードのName なのですが、 これはutf8に変換するという形にしたつもりなのですが・・・

関連するQ&A

  • Centos5(utf8)のperl でメール送信の関数プログラムを作

    Centos5(utf8)のperl でメール送信の関数プログラムを作成しています。 bccにもメールを送信したいのですが、呼び出される度にbccのメールアドレスの数が異なります。以下はテスト的に作った動くサンプルです。 #!/usr/bin/perl use Net::SMTP; use Encode; use strict; 1 my $ServerName = 'mail.server.jp'; 2 my $from = 'from@mailaddress'; 3 my $to = 'to@mail.address'; 4 my $bcc = 'bcc0@mail.address'; 5 my $anotherbcc = 'bcc1@mail.address'; 6 my $onemorebcc = 'bcc2@mail.address'; 7 my $smtp = Net::SMTP->new($ServerName, Debug => 0); 8 $smtp->mail($from); 9 $smtp->to($to); 10 $smtp->bcc($bcc, $anotherbcc, $onemorebcc); 11 # to ( ADDRESS [, ADDRESS [...]] ) 12 # cc ( ADDRESS [, ADDRESS [...]] ) 13 # bcc ( ADDRESS [, ADDRESS [...]] ) 14 $smtp->data(); 15 $smtp->datasend("From: $from\n"); 16 $smtp->datasend("To: $to\n"); 17 my $SUBJECT = "日本語タイトル"; 18 my $body = "日本語本文\n"; 19 Encode::from_to($SUBJECT, "utf8", "iso-2022-jp"); 20 Encode::from_to($body, "utf8", "iso-2022-jp"); 21 $smtp->datasend("Subject: ".$SUBJECT."\n"); 22 $smtp->datasend("MIME-Version: 1.0\n"); 23 $smtp->datasend("Content-Type: text/html; charset=iso-2022-jp\n"); 24 $smtp->datasend("\n"); 25 $smtp->datasend($body); 26 $smtp->dataend(); 27 $smtp->quit; 10行目の通り、メールアドレスを羅列して渡すとメールは配信されます。 メールアドレスを配列渡し( @bccarray=('bcc0@mail.address', ・・・); で@bccarrayを渡す)と配信されません。 これを関数化し、bccアドレスの数を可変にしたいのですが良い方法はないでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • Perl メールフォーム

    Perl勉強中です。ご教示お願いします。 #!/usr/bin/perl -w use Encode qw(from_to encode); use Net::SMTP; use strict; my $from = 'xxxx@xxxxx.jp'; my $mailto= 'xxxx@xxxxx.jp'; my $mailcc= 'xxxx@xxxxx.jp'; my $subject = 'ホームページからのお問い合わせ'; from_to($subject, 'shiftjis', 'iso-2022-jp'); encode('MIME-Header-ISO_2022_JP', $subject); my $header = << "MAILHEADER"; From: $from To: $mailto CC: $mailcc Subject: $subject Mime-Version: 1.0 Content-Type: text/plain; charset = 'ISO-2022-JP" Content-Trensfer-Encoding: 7bit MAILHEADER my $message = "テスト"; from_to($message, 'shiftjis', 'iso-2022-jp'); my $smtp = Net::SMTP->new('xxxx-xxxx.jp'); if ( !$smtp ) { print "メールサーバーにアクセスできません!"; exit; } #メール送信 $smtp->mail($from); $smtp->to($mailto); $smtp->to($mailcc); $smtp->data(); $smtp->datasend($header); $smtp->datasend($message); $smtp->dataend(); $smtp->quit; 現在ここまでできています。 「ホームページ→お問い合わせクリック→メール送信」 そして、今回教えていただきたいのが、 イメージなのですが、 ホームページ→お問い合わせクリック→メールフォームのページに移動→内容入力 →確認ボタンクリック→確認画面→送信ボタンクリック→送信+送ってきた人へ自動返信(定型文) という風にしたいのですが、どうすればいいのかわかりません・・・ できればコードを教えて頂ければ嬉しいです。

    • ベストアンサー
    • Perl
  • Perl メール フォーム

    ホームページのメールフォームについて教えてください。 現在ホームページで、お問い合わせページを作っている最中です。 そこで、現在下記のコードまでできております。 #!/usr/bin/perl -w use Encode qw(from_to encode); use Net::SMTP; use strict; use warnings; use Encode; use CGI; my $p = new CGI; #メールアドレス設定 my $from = 'aaaa@aaaaa.jp; my $mailto= 'aaaa@aaaaa.jp; my $mailcc= 'aaaa@aaaaa.jp; #サブジェクト設定 my $subject = 'ホームページからのお問い合わせ'; from_to($subject, 'shiftjis', 'iso-2022-jp'); encode('MIME-Header-ISO_2022_JP', $subject); #メールヘッダー設定 my $header = << "MAILHEADER"; From: $from To: $mailto CC: $mailcc Subject: $subject Mime-Version: 1.0 Content-Type: text/plain; charset = 'ISO-2022-JP" Content-Trensfer-Encoding: 7bit MAILHEADER #メール本体設定 my $message = "a"; #my $subject = $p->param('subject'); #文字コードをJISに変換 from_to($message, 'shiftjis', 'iso-2022-jp'); #メール送信オブジェクト設定 my $smtp = Net::SMTP->new('aaaaaaa.jp'); if ( !$smtp ) { print "メールサーバーにアクセスできません!"; exit; } #メール送信 $smtp->mail($from); $smtp->to($mailto); $smtp->to($mailcc); $smtp->data(); $smtp->datasend($header); $smtp->datasend($message); $smtp->dataend(); $smtp->quit; これだと、ホームページのボタン等をクリックすると メールは送られます。 差出人が'aaaa@aaaaa.jp 件名がホームページからのお問い合わせ 内容がa です。 これは、コード内にこう書いているから必然的にこれがくるわけなのですが、 そうではなく、 ホームページでお問い合わせボタンがありそこに <a href="http://aaaaaa.jp/cgi/mailform.pl"><img src="img/share/mail.gif" width="100" height="50" alt=""></a> mailform.plもしくはmeilform.htmlを表示させ下記のコードで表示されるページにアクセスし #!/usr/bin/perl <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>メールフォーム</title> </head> <body> <h1 class="title">メールフォーム</h1> <form method="post" action="mail.pl"> <input type="hidden" name="a" value="exec"> 件名(Subject) :<br /> <input type="text" name="subject" size="80" value=""><br /> 宛先(To) :<br /> <input type="text" name="to" size="80" value=""><br /> 差出人(From) :<br /> <input type="text" name="from" size="80" value=""><br /> 本文(Body) :<br /> <textarea name="body" rows="10" cols="65"></textarea><br /> <p> <input type="submit" value="送信"> </p> </form> </body> </html> ここで 差出人、件名、内容を入力し、送信のボタンを押すと my $subject = 'ホームページからのお問い合わせ'; my $message = "a"; my $from = 'aaaa@aaaaa.jp; この3つをmailform.plもしくはmailperl.htmlで 入力した内容で送信をしたいのですが、 これのやり方を教えてほしいです。。。 当方ホームページ作りも初心者で、Perlも最近はじめたとこでまだ理解できていないとこも 多いため説明がわかりにくいかもしれません・・・ その時は、ご指摘ください;; また、業者に頼むことは考えておりません・・・ 参考書やいろいろネットサーフィンしてみたのですが、上手くできません どうかお力添えをお願い致します!

    • ベストアンサー
    • Perl
  • perlでSMPT認証してメールを送信したい。

    こんばんわ。 Perlで一点伺いたいことがございます。 SMTP認証して、メールを送信したいのですが ネット上でサンプルをさがしてきて実際に試したのですが うまくいきません。 どうしたらいでしょうか?以下が実施に動かしているコードです。 #!/perl/perl/bin/perl use strict; use warnings; use CGI::Carp qw(fatalsToBrowser); print"content-type: text/html\r\n\r\n"; print "Hello World!\n"; use Net::SMTP; #SMTPサーバの指定 my $mailhost = 'smtp.gmail.com'; my $mailport = 587; my $mail_username = 'XXX@gmail.com'; my $mail_password = 'パスワード'; my $to_mail = '宛先'; my $from_mail = '送信先'; my $smtp = Net::SMTP->new($mailhost,Port => $mailport); $smtp->auth($mail_username, $mail_password); #メールの送信先 $smtp->mail($from_mail); $smtp->to($to_mail); #メールの内容 $smtp->data(); $smtp->datasend("From: $from_mail\n"); $smtp->datasend("To: $to_mail\n"); $smtp->datasend("Subject: test\n"); $smtp->datasend("\n"); $smtp->datasend("test\n"); #メール内容終わり $smtp->dataend(); #接続を切る。 $smtp->quit; print $smtp; ほぼコピーアンドペーストなのですが、うまくいきません。 とりあえず、newしたオブジェクト $smtpを出力してみると アドレス的なものが表示されます。 Net::SMTP=GLOB(0x7d15ec) ただ、これは認証情報が適当でも出力されるようです。 何度やってもメールは届いていないようなので認証の時点でまちがっているのでしょうか? ただ、認証情報は実際にメールソフトで使っているものなので、間違いないと思うのですが、識者の方よろしくご教授お願いします。

    • ベストアンサー
    • Perl
  • UTF8コードでのメール送信

    現在、以下の内容でメールサーバおよびシステムを運用してます。 レンタルサーバを以下の内容で OS:FreeBsd DB:postgresql (eucコードで運用) PG:perl5.8.8  (eucコードで記述) 最近、当システムから携帯電話(スマートフォン含む)へのメール送信で受信側(携帯)で文字化けが多くなっている。それで、システムの一部のUTF8化しようと思いました。それで、メール送信のライブラリを以下のように修正してみたが、本文が文字化けしてしまいます。なぜ文字するか原因がわかりません。 以下のソースはUTF8Nで記述しています。 ※システム全部をUTF8コード化やDB(POSTGRESQL)もUTF8にする案もありますが、 改修作業が大きくて作業時間が少ない方法も模索しています。 どなたかご教授願います。 binmode(STDOUT, ":utf8"); use Encode; use Encode qw(from_to); use MIME::Base64; use MIME::Entity; use Net::SMTP; use MIME::Words qw (:all); sub sendmail() { my ($mail_date) = @_; <==メールのハッシュ配列(DBに登録されているメールの件名、本文) my $smtp_server = $mail_date->{SMTPsrv}; my $smtp_port = '25'; # 送信者のメールアドレスを設定する。 my $mail_from = $mail_date->{MailFr}; # 宛先のメールアドレスを設定する。 my $mail_to = $mail_date->{MailTo}; # メールの件名を設定する。 from_to($mail_date->{Subjct},"euc-jp","utf8"); #UTF8に変換 $utf8_str_sub = $mail_date->{Subjct}; # メールの内容を設定する。 my $message; my $utf8_str; from_to($mail_date->{Message},"euc-jp","utf8"); #UTF8に変換 $message = $mail_date->{Message}; $utf8_str = $message; # メールヘッダを作成する。 # from、to、件名共にMIME-Header(UTF-8)へエンコードします。 my $mail_header; $mail_header = "From: " .encode('MIME-Header-ISO_2022_JP',$mail_from)."\n"; $mail_header .= "To: " .encode('MIME-Header-ISO_2022_JP',$mail_to) ."\n"; $mail_header .= "Subject: ".encode('MIME-Header-ISO_2022_JP',$utf8_str_sub) ."\n"; # UTF-8とbase64 encodeを使う事を明記します。 $mail_header .= "MIME-Version: 1.0\n"; $mail_header .= "Content-type: text/plain; charset=utf-8\n"; $mail_header .= "Content-Transfer-Encoding: base64\n"; $mail_header .= "\n"; # SMTPでメールを送る。 my $SMTP = Net::SMTP->new($smtp_server,Port=>$smtp_port); $SMTP->mail($mail_from); $SMTP->to($mail_to); $SMTP->data(); $SMTP->datasend($mail_header); $SMTP->datasend(encode_base64(encode('utf8', $utf8_str))); $SMTP->dataend(); $SMTP->quit; }

  • Perl+UTF8で文字化け

    以下の環境にてメール送信プログラムを作成していますが、 ありがちな文字化け、且、ボディーが表示されない不具合が発生しています。 サーバ:linux apache レンタルサーバ ※Encode.pm、Jcode.pm無し。モジュールインストール不可。 Perl version: 5.006001 ソースエンコード:utf-8 自分の解釈としてはutf8で記述しているので、 charset=utf-8にしておけば、 MIMEエンコードさえしてやれば 表示できると考えているのですが、 やはり甘い考えなのでしょうか? また、同サイト質問NO2868794も参考にさせていただきましたが、上手くいきません。 以下ソース(エンコード:utf-8) use utf8; use MIME::Base64; use POSIX; ※アドレス表記はこのサイトの投稿チェックに引っかかるので省略します。 my $to = 'XXXX@XXXX'.XXX; my $from_nm = "送信者名"; my $from_adr = "XXXXX@XXX.XXX"; my $subject = "メール表題"; my $body = "本文"; # 送信者名を MIME エンコード encode_base64($from_nm,""); # subjectを MIME エンコード encode_base64($subject,""); $subject = "=?utf-8?B?" . $subject . "?="; # 本文を MIME エンコード encode_base64($body); my $MailPass = "XXXX/XXXX/XXX"; #SendMail Pass open(MAIL,"| $MailPass -t"); #======================================================== print MAIL <<"EOF_MAIL"; From: $from_nm<$from_adr> To: $to Subject: $subject Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 MIME-Version: 1.0 $body EOF_MAIL #======================================================== close MAIL; その他、色々ググっては見たのですが、自分ではみつけられず、 どうかアドバイスありましたらよろしくお願いいたします。

  • Net::SMTPでエラーの場合のリトライ方法

    PerlのSMTP処理がエラーの場合に、リトライする方法 下記のようなPerlスクリプトを例に、質問させていただきます。2点あります。 ------------------------------------------------------------------------- 01: use Net::SMTP; 02: use Encode; 03: my($smtp,$ret); 04: $smtp = Net::SMTP->new('xxx.xxx.jp', Hello=>"xxx.com", Timeout => 120); 05: $ret = $smtp->mail($from); 06: $ret = $smtp->to($to); 07: $ret = $smtp->cc($cc) if("$cc" ne ""); 08: $ret = $smtp->data(); 09: $ret = $smtp->datasend("From:$from\n"); 10: $ret = $smtp->datasend("To:$to\n"); 11: $ret = $smtp->datasend("Cc:$cc\n") if("$cc" ne ""); 12: Encode::from_to($subject,"s-jis","jis"); 13: $ret = $smtp->datasend("Subject:$subject\n"); 14: $ret = $smtp->datasend("Content-Transfer-Encoding: 7bit\n"); 15: $ret = $smtp->datasend("Content-Type: text/plain;charset=\"ISO-2022-JP\"\n\n"); 16: Encode::from_to($body,"s-jis","jis"); 17: $ret = $smtp->datasend("$body\n"); 18: $ret = $smtp->dataend(); 19: $ret = $smtp->quit; ------------------------------------------------------------------------- ($from,$to,$cc,$subject,$body 等は上位で設定しているものとします) 質問1) 例えば、08行目でエラー($ret==0)になった場合に、リトライしたければ、 少し待って(sleep等)から、08行目からを再実行すればOKでしょうか、 それとも、05行目、あるいは、04行目のSMTP->newの再取得からやり直さなければならないでしょうか。 質問2) また、18行目でエラー($ret==0)の場合、実際にはメールは送信されるようですが、 そのまま放置しておいても特に問題ないでしょうか。 以上、よろしくお願いいたします。

  • smtp送信時の認証をperlで書きたい

    smtpで認証が必要なメールサービスがあり、これをperlで記述しています。 「pop befor smtp」では、駄目でした。 そのた、authでの認証(良く分からず)行って見ましたが、システムでは無視されました。何方かご指導よろしくお願いします。 現状のソースを添付します。 $smtp = Net::SMTP->new("smtp$server"); $smtp->mail($from); $smtp->to($to); $smtp->data(); $smtp->datasend("Date:2009/01/10 18:30\n"); $smtp->datasend("From:$from\n"); $smtp->datasend("To:$to\n"); $smtp->datasend("Subject:$Subject\n"); $smtp->datasend("Content-Transfer-Encoding: 7bit\n"); $smtp->datasend("Content-Type: text/plain;charset=\"iso-2022-jp\"\n\n"); $smtp->datasend("\n"); $smtp->datasend("これは、テストです。\n"); $smtp->dataend(); $smtp->quit;

    • ベストアンサー
    • Perl
  • Perl でメール送信プログラム。

    Perl でメール送信プログラムを作ったのですが、自宅の環境から会社に持ってきてテストすると文字化けしてしまいます。 自宅は、Yahoo ! , Biglobe なので送信できたのですが、会社は、自社でメールサーバを構築しているようです。 メールサーバは、qmail のようです。 ソースは、 $smtp = Net::SMTP->new("mailserver"); $smtp->mail($mailaddress); $smtp->to($mailaddress); $smtp->data(); $smtp->datasend("Date:$date\n"); $smtp->datasend("From:$mailaddress\n"); $smtp->datasend("To:$mailaddress\n"); $smtp->datasend("Subject:あいうえお\n"); $smtp->datasend("Content-Transfer-Encoding: 7bit\n"); $smtp->datasend("Content-Type: text/plain;charset=\"iso-2022-jp\"\n\n"); $smtp->datasend("\n"); $smtp->datasend("$StringBuffer\n"); $smtp->dataend(); $smtp->quit; こんな感じで一般的なものです。 “あいうえお”が“ツつツつ「ツつ、ツつヲツつィツ”こんな感じに文字化けしています。 どなたかわかる方いませんか?

    • ベストアンサー
    • CGI
  • メール送信で(1)などの丸数字の文字化けについて

    ウェブページ(charset=utf-8)からメールを送信するプログラム(Perl)について質問があります。 本文中に ---------- (1) ↓ \x{2460} ---------- と変換されてメールが届いてしまいます。 メインのCGIでは、 use utf8; を宣言しています。 utf-8のページから、CGIではパラメータを以下のように受けています。 my $query = new CGI; for my $p ($query->param) { my @v = map {Encode::decode_utf8($_)} $query->param($p); $query->param($p, @v); } my $mailtext = $query->param("mailtext"); その後、 「~(波ダッシュ)」と「-(全角マイナス)」は以下のようにを強制的に置換しました。 (これは検索して見つけることができましが、丸数字については探しきれませんでした。) $mailtext =~ tr/\x{ff5e}\x{ff0d}/\x{301c}\x{2212}/; # UTF8フラグをON $mailtext = Encode::decode_utf8($mailtext ); # UTF8からJISに変換 Encode::from_to($mailtext , "utf8", "jis", Encode::XMLCREF); としてメールを送信しています。 パラメータの受け取り方に問題があるのでしょうか? それとも丸数字などを個別に置換する方法があるのでしょうか。 色々調べて試したりしたのですがダメでした。 すみませんが、よろしくお願いいたします。

    • ベストアンサー
    • Perl

専門家に質問してみよう