QA@IT
この質問・回答は、@ITの旧掲示板からインポートされたものです。

メール送信で添付ファイル名の文字化けが起こる(VB2008)

発投稿させていただきます・・・
VB2008にてメール送信プログラムを作成していて、
Subject等の日本語表記についてはいろいろと調べた結果
解決したのですが、添付ファイルの日本語ファイル名だけ
どうしても文字化けしてしまいます。。。

ファイルを添付する箇所のコードは以下のようにしています。
どなたか解決策をご教授ください。
# 参照元記事URLを参考に作成しました。

Dim Msg As New System.Net.Mail.MailMessage()
Dim AttachData As New System.Net.Mail.Attachment("<フルパスファイル名>")
Dim SmtpMail As New System.Net.Mail.SmtpClient()
Dim enc As System.Text.Encoding = _
  System.Text.Encoding.GetEncoding("iso-2022-jp")

Msg.From = New System.Net.Mail.MailAddress("aaa@yahoo.co.jp")
Msg.To.Add(New System.Net.Mail.MailAddress("bbb@yahoo.co.jp")
Msg.Subject = "subject"
Dim htmlView = _
  System.Net.Mail.AlternateView.CreateAlternateViewFromString( _
  "本文いろいろ", _
  enc, _
  System.Net.Mime.MediaTypeNames.Text.Plain)
htmlView.TransferEncoding = System.Net.Mime.TransferEncoding.SevenBit
Msg.AlternateViews.Add(htmlView)
Msg.Attachments.Add(AttachData)
SmtpMail.Host = "locahost"
SmtpMail.Send(Msg)
Msg.Dispose()

質問者:moribun

回答

VS2005(C#)でですが、同じやり方で送信してみました。

yahooとgmailと自分のアドレスあてに送付してみましたが、yahooは化けていましたがgmailと自分のアドレス(秀丸メール)では送付した日本語のファイル名で受信できました。

受信するメーラーやサイト側のシステムに依存するのかもしれませんね。

投稿者:GENZO

編集 履歴 (0)

ご返信ありがとうございます。

当方も環境によっては表示されたりされなかったりです。
ちなみに、OE6はNGでした。
Yahoo!Mailの最新版(β版)とWindowsMailでは問題ありませんでした。

何か良い方法はないものですかね・・・
最悪の回避策としては添付する前に半角英数文字のみのZIPファイルに
してから出すしかないですかね・・・

できればそのまま添付したいのですが・・・

投稿者:moribun

編集 履歴 (0)

添付ファイル名をBエンコードしてうまくいきませんか?

投稿者:ゆうま♪

編集 履歴 (0)

moribunさんの書き込み (2008-10-10 07:58) より:

できればそのまま添付したいのですが・・・

「そのまま」という意味がよくわかりませんが(汗)。MIME(Bエンコーディング)であれば、大多数のメーラで化けずに処理できると思います。

#本来はRFC2231で書くべきですが、非対応メーラが多いので・・。

SJISやUTF-8を生のまま入れるメーラはさすがにないハズですが、受け取ったメールの扱いとしては生のままの日本語でもちゃんと処理できるメーラは意外と多いんですね(だからといって甘えていてはいけませんが・・)。

まぁ今現在でもBエンコーディングが一般的でしょう。

(参考)
  http://www.atmarkit.co.jp/fnetwork/rensai/netpro04/netpro01.html
   (「添付ファイル名」の項)
  http://www.emaillab.org/essay/japanese-filename.html

投稿者:shimix

編集 履歴 (0)

shimixさんの書き込み (2008-10-10 17:57) より:

「そのまま」という意味がよくわかりませんが(汗)。MIME(Bエンコーディング)であれば、大多数のメーラで化けずに処理できると思います。

言葉足らずですみません。。。
圧縮ファイルにしないで、元のファイル名(2バイト文字)で送りたいと思っております。
ファイル名のみBエンコードとあるのですが、ファイルを添付するときにファイル名のみ
エンコードはどのようにやるのでしょうか?
今現在、ソース上では

Msg.Attachments.Add(AttachData)

によって添付ファイルにしております。。。

投稿者:moribun

編集 履歴 (0)

メールの添付ファイルの形式を定めたRFC2045は、ファイル名に2バイト文字を使うことを全く考慮していませんでした。
しかし、「ファイル名に2バイト文字を使いたい」という需要はあったので、仕方なく各メーラーが独自の実装をしたため、「メーラーが違うと添付ファイル名が化ける」という事態が頻発しました。
そこで、1997年にRFC2231が提出され、めでたく添付ファイル名に2バイト文字が使えるようになった…と思いきや、これがどのメーラーも実装していない仕様だったため、普及が遅れました。
shimixさんが挙げられた2つの記事はどちらも書かれてかなり経っていますが、Outlook ExpressがRFC2231をサポートしなかったこともあり、未だにこの混乱は続いています。

受信したメールのContent-TypeヘッダとContent-Dispositionヘッダをここに晒していただけると議論が進むと思います。
[ メッセージ編集済み 編集者: いかわさくら 編集日時 2008-10-10 20:27 ]

投稿者:いかわさくら

編集 履歴 (0)

帰宅してしまったのでWindowsMail(正常に表示)の環境しかありませんが・・・
これで参考になるでしょうか。

Content-Type: application/octet-stream; name="=?UTF-8?B?(省略)"
Content-Dispositionヘッダはありません・・・

投稿者:moribun

編集 履歴 (0)

Outlook ExpressとかはB Encodeされたutf-8のファイル名に対応してないのかも知れません。
前に書いたように、汎用的な方法は無いに等しいですが、ファイル名をiso-2022-jpでB Encodeすれば少なくともOutlook Expressでは正常に読めるようになるとは思います。

エンコードの方法については、当方実行環境がないので詳しくは分かりませんが、System.Net.Mail.AttachmentクラスとかSystem.Net.Mime.ContentTypeクラスをゴニョゴニョすると出来るかも知れません。

投稿者:いかわさくら

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。