メールのタイトル文字が長すぎるため、改行されてしまう問題の解決方法

このQ&Aのポイント
  • メールをMIMEエンコードし、別のプログラムで読み込んで送信する際、メールのタイトル文字が長すぎると改行されてしまう問題が発生します。
  • 改行されたタイトルではタイトルが半分消えてしまい、文字の意味が伝わりにくくなります。
  • この問題を解決するためには、メールのタイトルを適切なエンコード方式でエンコードする必要があります。
回答を見る
  • ベストアンサー

メールのSUBJECT

メールをMIMEエンコードし、別のプログラムで読み込んで、メールを送信していますが。。。 メールのタイトル文字が長すぎるため、下記のようにすると改行されてしまい、タイトルが半分消えてしまいます。 $str_title = mb_encode_mimeheader($title); そこで、下記のように変更しました。 $str_title = "=?iso-2022-jp?B?" . base64_encode(mb_convert_encoding( $title , "JIS" , "EUC-JP" )) . "?="."\n"; 別のプログラムでタイトルを表示させるとき、デコードされていない状態で表示されます。 ただし、メール受信のときのタイトルは表示されます。(メーラーはBeckyを使用しています。) どのようにしたら別のプログラムでも日本語が表示されるのでしょうか?

  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
回答No.1

僕もsubjectのエンコードには同じ方法を取っています。メールの表示に関してはメーラーに依存する部分も多々あるので、色々なクライアントでテストしてみる事をオススメします。 subjectが長すぎるという事ですが、どの位ですか?長すぎるsubjectですとメーラーによって途中で切れたり化けたりします。 BECKYは使ってないのですが、OEのようにメールボディをそのまま表示させる機能があれば、期待通りのメールヘッダになっているか確認してみましょう。不用意に改行が入っていたりするような事はないでしょうか?

aiurai54
質問者

お礼

すみません。表示する側の方でISO-2022-JPが小文字の場合を考慮していませんでした。。 早急に返事を頂きありがとうございます。

関連するQ&A

  • PHPから携帯へメール送信

    いつもお世話になっております。 PHPから携帯電話へ"絵文字付き"でメールを送るプログラムを作成している のですが、『base64_encode』等を使用して絵文字の表示までは行う事がで きました。 ですが、本文が途中で途切れてしまうのです・・・。 PHP側は、 $to = mb_convert_encoding(mb_decode_mimeheader($structure->headers['from']), 'SJIS', 'ISO-2022-JP'); $subject = mb_convert_encoding(mb_decode_mimeheader($structure->headers['subject']), 'SJIS', 'ISO-2022-JP'); (省略)  ・  ・ $body = $structure->body; $body = preg_replace('/\s*>\s.*/', '', $body); $body = mb_convert_encoding($body, 'SJIS', 'ISO-2022-JP'); //---------------------------------- // base64_encode //---------------------------------- $subject = "=?shift_jis?B?" . base64_encode($subject) . "?="; $body = base64_encode($body); //---------------------------------- // ヘッダを作成 //---------------------------------- $headers = "From: test@mail.com\n"; $headers .= "MIME-Version: 1.0\n"; $headers .= "Content-Type: text/plain; charset=Shift-JIS\n"; $headers .= "Content-Transfer-Encoding: base64"; //---------------------------------- // メール送信 //---------------------------------- $res = mail($to, $subject, $body, $headers);  ・  ・ (省略) 上記のように記述しています。 メールは送れます。絵文字も表示されます。ですが、本文が途中で途切れ てしまいます。 どなたかご教授をお願い致します。

    • ベストアンサー
    • PHP
  • メールのFromに半角ピリオドが入るとエラーが・・・

    PEARのメール送信について教えてください。 現在PEARのMailと、mime.phpを使用してメール送信をするプログラムを組んでいるのですが、エンコードの仕方が悪いのかメールのFromに半角ピリオド、半角カンマなどが入るとエラーが出てしまいます。 以下がそのコードの主要部分ですが、対応策がありましたらご教授ください。よろしくお願いいたします。 --------------------------------------------------------- //ヘッダーのFromエンコード(問題の部分?) $headers['From'] = mb_encode_mimeheader(mb_convert_encoding( $mail_from_name , "ISO-2022-JP", "EUC-JP"))."<".$mail_from.">"; $objMail =& Mail::factory('sendmail'); $original = mb_internal_encoding(); $headers['Subject'] = mb_convert_encoding( $sbj , "ISO-2022-JP" , "EUC-JP" ); mb_internal_encoding("ISO-2022-JP"); $headers['Subject'] = mb_encode_mimeheader($headers['Subject'],"ISO-2022-JP"); mb_internal_encoding($original); $crlf = "\n"; $mime =& new Mail_mime($crlf); $mime->setHTMLBody($body); $build_param = array( "html_charset" => "EUC-JP", "text_charset" => "ISO-2022-JP", "head_charset" => "ISO-2022-JP", ); $body = $mime->get( $build_param ); $headers = $mime->headers($headers); $objMail =& Mail::factory('sendmail'); $result = $objMail->send( $mail_to , $headers , $body );

    • 締切済み
    • PHP
  • PHPでのメール差出人名について

    PHPでのメール差出人名について PHPのmb_send_mailでメール送信プログラムを書いています。 メールは送信されるのですが、メーラーで確認すると 差出人名(送信者)がうまく表示出来ません。 具体的には、 『▲▲サイトより送信』と表示させたいのですが、 『▲▲サイトより送信@レンタルサーバのドメイン名』 と表示されてしまいます。 下記がソースになるのですが、有識者の方いらっしゃいましたら ご教授よろしくお願いします。 -------------------------------------------- //送信設定 mb_language("japanese"); mb_internal_encoding("euc-jp"); $from = mb_encode_mimeheader(mb_convert_encoding("▲▲サイトより送信","JIS","euc-jp")); $head = "From: {$from}" . "\r\n" . 'X-Mailer: PHP/' . phpversion(); //送信実行 mb_send_mail($mail_to, $title, $message, $head);

    • ベストアンサー
    • PHP
  • 自作メールフォームから送信するとメール内容がおかしくなる。

    ※PHP初心者なので、お手柔らかにお願いします。 自作メールフォームからメール送信すると、メールは送れるのですがメールの内容がおかしくなります。 現状は、件名のみ正しく表示され、差出人と本文の内容が空になります。 いろいろなサイトを見て試してみたのですが、どれも同じ結果で何が間違っているのかよくわからず困ってます。 メールの設定として下記を、 mb_language("Japanese"); mb_internal_encoding ("SJIS"); mb_detect_order("ASCII, JIS, UTF-8, EUC-JP, SJIS"); $MailTo = "送付先メールアドレス"; メール送信事態は下記ソースの通りです。 // エンコードして文字列を作成 $Name = mb_convert_encoding($Name, 'JIS', 'auto'); $Header = "From:" .mb_encode_mimeheader($Name). "<" .$Mail. ">\n"; $Subject = "=?iso-2022-jp?B?".base64_encode(mb_convert_encoding("お問い合わせ", 'JIS', 'auto')). "?="; $Message = mb_convert_encoding($Message, "JIS", "auto"); // メール送信処理 $Ret = mb_send_mail($MailTo, $Subject, $Message, $Header);

    • ベストアンサー
    • PHP
  • PHPを利用してメール送信時したときのSubjectの文字化け

    PHPを利用し携帯電話を使って、件名(Subject)と本文を入力して送信した後、送信元のアドレスに入力した件名と本文を返信するプログラムを作成しています。 しかし、件名の返信内容が送信内容とは違う形で返ってきます。(本文はそのまま返ってきます) 例:件名「あ」、本文「か」と入力し送信   返信内容→件名「=?ISO-2022-JP?B?GyRCJCIbKEI=?=」        本文「か」 現在使用しているPHPのバージョンは 4.4.6 です。 「mb_convert_encoding」や「mb_encode_mimeheader」といった関数も使用しているのですがうまくいきません。 どのように記述すればよいでしょうか? 解答お待ちしています。

    • ベストアンサー
    • PHP
  • Net_POP3 メール一覧のソート

    Net_POP3を使用してメールの閲覧を作成しています。 現在は日付の古いものから新しいものへと表示されています。 これを日付の新しいものから古いものへと表示をさせたいのですが、sortがうまくできず困っています。 ご存知の方がいらっしゃいましたらご教示お願いします。 ソースは下記になります。 $count = $pop3->numMsg(); if ($count) { $count = $pop3->getListing(); $start = 1; $end = 21; if ($count !== false) { foreach ($count as $key => $value) { if($start < $end) { $overview = $pop3->getParsedHeaders($start); $body = $pop3->getBody($start); $from = mb_decode_mimeheader($overview['From']); $from = mb_convert_encoding($from, "UTF-8", "JIS"); $subject = mb_decode_mimeheader($overview['Subject']); $subject = mb_convert_encoding($subject, "UTF-8", "ISO-2022-JP"); $subject = mb_strimwidth($subject, 0, 42, "...",'UTF8'); $date = mb_decode_mimeheader($overview['Date']); $body = nl2br($body); $maillist .= '<tr>'."\n"; $maillist .= '<td>'.$subject.'</td>'."\n"; $maillist .= '<td>' .$from. '</td>'."\n"; $maillist .= '<td>' .date('Y/m/d H:i:s',strtotime($date)). '</td>'."\n"; $maillist .= '</tr>'."\n"; $start++; } } } } 宜しくお願いします。

    • 締切済み
    • PHP
  • PHPでmb_send_mail()関数を使っときの件名について

    PHPでmb_send_mail()関数を使っときの件名について mb_send_mail()でメールの送信はできるのですが、件名(Subject)を日本語にすると8文字以上送信すると送信エラーが起こります。同じプログラムをLinuxでやるとうまくいきます。プログラムは以下のようにしています。(mail()関数を使うとこのような問題は起こりませんでした。) mb_language('Japanese'); $subject='メールテスト'; $subject=mb_convert_encoding($subject,'ISO-2022-JP','UTF-8'); $message='Webメールのテストです。'; $message=mb_convert_encoding($message,'ISO-2022-JP','UTF-8'); $head='私から送信されました。<****@****.net>'; $head=mb_convert_encoding($head, 'ISO-2022-JP', 'UTF-8'); $head=mb_encode_mimeHeader($head,'ISO-2022-JP','B'); if(mb_send_mail('****@****.com',$subject,$message,'From:'.$head)){ echo 'おくったよ。<br>'; } else{ echo 'おくれない。'; }  件名の全角での文字数を増やす方法があったら教えてください。  よろしくお願いいたします。 <システム環境>  Windows7(64Bit)  Apache2.2  PHP5.3.2

    • ベストアンサー
    • PHP
  • Mail_mimeDecodeでメール本文取得

    index.php <form action="mailto:info@hoge.com" method="get" id="join"> <input type="hidden" name="body" value="<?php echo $friend;?>" /> </center></form> empty_mail.php $params['include_bodies'] = true; $params['decode_bodies'] = true; $params['decode_headers'] = true; $params['input'] = file_get_contents("php://stdin"); $params['crlf'] = "\r\n"; $mail_data = Mail_mimeDecode::decode($params); $MailBody = getbody($mail_data); if (!$MailBody) { print "cannot get MailBody"; // エラー処理 }// $MailBodyを使った処理 function getbody($arg) { if ($arg->ctype_primary == 'multipart') { foreach($arg->parts as $parts) { $ret = getbody($parts); if ($ret) { return $ret; } } } if ($arg->ctype_primary == 'text') { if ($arg->ctype_secondary == 'plain') { if (strtolower($arg->ctype_parameters['charset']) == 'iso-2022-jp') { return mb_convert_encoding($arg->body, "UTF-8", 'JIS'); } else { return $arg->body; } } } return false; } //メールを解析する $decoder = new Mail_mimeDecode($source); $structure = $decoder->decode($params); //送信元を取得する $mail = $structure->headers['from']; $mail = addslashes($mail); $mail = str_replace('"','',$mail); $from = $structure -> headers['from']; $from = mb_decode_mimeheader($from); $from = mb_convert_encoding($from, mb_internal_encoding(),'auto'); if(preg_match( '/<(.*?)>$/' , $from , $match)){ $from = $match[1]; } $from = trim($from); $from = strtolower($from); //送信データを設定する $recipients = $from; $new_from = 'info@hoge.com'; mb_language('ja'); mb_internal_encoding('sjis'); $subject = mb_encode_mimeheader(mb_convert_encoding("登録URL", "JIS", "auto"), "JIS"); $body = "下記のURLをクリックして登録を行ってください http://hoge/hoge.php?". $MailBody . "". session_name()."=". htmlspecialchars(session_id()); と$friendを登録フォーム画面にいくまで情報を維持したいのですが、ご教授お願いします。

    • ベストアンサー
    • PHP
  • mailコマンドでは化けないSubjectがPOPで受信すると文字化け

    mailコマンドで、メールのタイトル一覧を表示した時には、Subjectは文字化けしていないのですが、 POP3でメーラ(WindowsのBecky)で受信すると Subjectが文字化けしてしまいます。 ヘッダ情報は以下のようになっています。 MIME-version: 1.0 Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit 原因は何でしょうか?

  • cgiメールの文字変換がうまくできない

    CGIメールです。 元々shiftjisなので、これをiso-2022-jpに変換させようとしてます。 $charset = "iso-2022-jp"; open(MAIL,"| $sendmail -t") || &error("失敗"); print MAIL "To: <$to>\n"; print MAIL "From: <$from>\n"; &jis("タイトル"); &base64("$msg"); print MAIL "Subject: $str\n"; print MAIL "MIME-Version: 1.0\n"; print MAIL "Content-type: text/plain; charset=$charset\n"; print MAIL "Content-Transfer-Encoding: 7bit\n"; foreach ( split(/\n/, $body) ) { &jis("$_"); print MAIL $_, "\n"; } close(MAIL); sub jis{ $msg = $_[0]; Encode::from_to($msg, "shiftjis", $charset); ####1#### } sub base64 { use MIME::Base64; $str = $_[0]; if($str =~ /[^!-~\s]/){ $str = encode_base64($str, ""); if($charset eq "utf8"){ $str = '=?utf-8?B?' . $str . '?='; }else{ $str = '=?iso-2022-jp?B?' . $str . '?='; } } } このようにしてみたのですが、タイトル部分はきちんと表示されるのですが、ボディー部分が文字化けしてしまいます。(メーラーで手動にてshit-jisにエンコードしたらボディー部分が読めタイトル部分は文字化けする) Encode::from_to($msg, "shiftjis", $charset); の$charsetを"$charset"にしても同じ現象です また、元々参考にしたものでは####1####に retern $msg; があったのですが、これを入れるとsyntax errorになったので、これをコメントアウトしたらエラーにはならず送信そのものはできました ただ目的の文字変換ができないのですが、どこをどう改善すればいいでしょうか。 どうかご存じの方ぜひ教えてください。 よろしくお願いします。

    • ベストアンサー
    • Perl