• 締切済み

(C#)auに、絵文字をHTMLメールにて送信したい。

C#初心者です。 C#でauに、絵文字をHTMLメールにて送信したいのですが、 一部の絵文字は送信できるようになったのですが、 AUのE-MAIL送出用S-JISの絵文字CDの頭2ケタが(EB~EC)の絵文字が、すべて「・」になって、送信されてしまいます。 これらの絵文字も送れるようにしたいのですが、 どなたか絵文字・C#に詳しいかたいらっしゃいましたら、是非教えて下さい。 ------------------ using System; using System.Collections.Generic; using System.Text; using System.Net.Mail; using System.Net.Sockets; using System.IO; using System.Net.Mime; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { Send_JIS_Mail(); } static string Enco(int code) //S-JIS 変換 { byte[] data = { (byte)(code / 256), (byte)(code % 256) }; return System.Text.Encoding.GetEncoding(932).GetString(data); } private static string myEncode(string str, Encoding enc) //base64 変換 { string base64str = Convert.ToBase64String(enc.GetBytes(str)); return string.Format("=?{0}?B?{1}?=", enc.BodyName, base64str); } private static void Send_JIS_Mail() { SmtpClient smtp = new SmtpClient(); MailMessage msg = new MailMessage(); Encoding myEnc = Encoding.GetEncoding("iso-2022-jp"); // 送信元 msg.From = new MailAddress( "XXXXXXXXXXXXXXXX@co.jp", myEncode("送信元", myEnc)); // 送信先 msg.To.Add(new MailAddress( "XXXXXXXXXXXXXXX@ezweb.ne.jp", myEncode("送信先", myEnc))); // 件名 msg.Subject = myEncode("件名", myEnc); msg.IsBodyHtml = true; // TEXTメール本文 msg.Body = "こんにちわ!!"; // HTMLメール本文 string sBody = "<html><body bgcolor = \"#ffff00\">" + "<div>絵文字⇒</div>" + Enco(0xEB59) + Enco(0xEB5A) + "</body></html>"; AlternateView altView = AlternateView.CreateAlternateViewFromString( sBody, myEnc, System.Net.Mime.MediaTypeNames.Text.Html); // Content-Transfer-Encoding: 7bit altView.TransferEncoding = System.Net.Mime.TransferEncoding.SevenBit; // altViewをメッセージに追加 msg.AlternateViews.Add(altView); // SMTPサーバ smtp.Host = "XXXXXXXX.co.jp"; try { // 送信 smtp.Send(msg); } catch (SmtpException exc) { // SMTPサーバー接続失敗時のエラー処理 // メッセージは、excですので、それを表示してもOK。 } //後始末 msg.Dispose(); } } }

みんなの回答

  • chie65535
  • ベストアンサー率43% (8523/19372)
回答No.1

>頭2ケタが(EB~EC)の絵文字が、すべて「・」になって、送信されてしまいます。 SJIS⇒JIS変換の >return System.Text.Encoding.GetEncoding(932).GetString(data); を確かめてみてください。 もし、このルーチンが「第1バイトがEBとECだったら、そこには漢字が無いので『・』のJISコードである0x2126を返す」とかやってたら、全部「・」になります。 こういう「実行時のロケールや、インストールされている文字セットの影響を受ける、標準的なコード変換ルーチン」は、上記のような「小さな親切、大きなお世話」な処理をしてくれるので、こういう場合は「使い物にならない」です。 こういう場合は「文字セットやコード定義域を完璧に無視した、独自のコード変換ルーチン」が必要です。 http://www.slayers.ne.jp/~oouchi/code/sjistojis.html を参考に、SJIS⇒JIS変換ルーチンを自作しましょう。 JISコードの前後に付けるESCシーケンスは http://www.slayers.ne.jp/~oouchi/code/jis.html を参考に。 基本的に「SJIS2バイト」を「ESC $ B JISコード2バイト ESC ( J」にすれば良いです。 ともかく >return System.Text.Encoding.GetEncoding(932).GetString(data); が「ESC $ B !& ESC ( J」を返して来てないか、確かめましょう。16進コードだと「1B 24 42 21 26 1B 28 4A」です。

関連するQ&A

  • C#でメール送信

    C#の System.Text.Encoding enc = System.Text.Encoding.GetEncoding(50220); System.Net.Mail.SmtpClient sc = new System.Net.Mail.SmtpClient(); //SMTPサーバーを指定する sc.Host = "localhost"; //メッセージを送信する sc.Send(msg); で送信したメールと メーラー(Becky)で送信したメールでは Subjectなどの変換後の文字コードが全く違うものとなっており、 そのためか、文字化けしてしまいます。 メーラーと同じような変換で文字化けせずにメールを送信するには、 どのようにしたらいいのでしょうか?

  • C#のメール送信時のエラーについて

    こんにちは、今現在C#でメールの送信部分を作っているのですがどうしても送信途中でエラーがでてとまってしまいます。 一応、当方で確認したところによると文字コードに関するエラーが出ず、ただただ「送信ができませんでした」とハンドラで表示されます。 どのようにしたらよいでしょうか? どなたかご教授お願いします。 メールソフトのソースプログラム private void seButton_Click(object sender, EventArgs e) { //JISコード System.Text.Encoding enc = System.Text.Encoding.GetEncoding(50220); //MailMessageの作成 System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage(); //件名と本文の文字コードを指定する msg.SubjectEncoding = enc; msg.BodyEncoding = enc; //メールの送信元のアドレス msg.From = new System.Net.Mail.MailAddress("niihama-kosen@test.ac.jp"); //メールの送信先のアドレス msg.To.Add(new System.Net.Mail.MailAddress(adressBox.Text)); //メールの件名 msg.Subject = "coBox.Text"; //メールの本文 msg.Body = "hoBox.Text"; //SMTPサーバの設定 System.Net.Mail.SmtpClient sc = new System.Net.Mail.SmtpClient(); //SMTPサーバの指定 sc.Host = "smtpBox.Text"; //メールの送信 sc.Send(msg); //msgの破棄 msg.Dispose(); }

  • C# 文字コード変換

    お世話になります C#でプログラムを開発しております その際、ハードウェアへデータを送信するのですが 送信する文字列データをANKコードで送信しなければなりません。 そこで行き詰っているのですが ハードウェアへ ひらがなの 「あ」 を送信する際 「$"」 へ変換して送信する形です ・・・参考・・・ JIS0208コード表 http://ash.jp/code/codetbl2.htm ANKコード表 http://www.asahi-net.or.jp/~ax2s-kmtn/ref/codes. … 以下がプログラムです      str = "あ";      byte[] data = Encoding.GetEncoding("EUC-JP").GetBytes(str);      ret = Encoding.GetEncoding("ASCII").GetString(data);      System.Console.WriteLine("ret:" + ret); 上記のコードでできると思ったのですが ret2:?? となってしまいます。 Javaではできたのですが・・・ いちおう成功したJavaのコードを載せます      str = "あ";      byte[] jis = str.getBytes("jis0208");      String strAscii = new String(jis, "ASCII");      System.out.println("strAscii:" + strAscii); 結果 $" Javaではjis0208でエンコードしてるところを C#ではEUC-JPで行っているのが原因だとは思うのですが ネットで調べてもjis0208はEUC-JPでエンコードするようにあります 私の理解が不足しているのでしょうか お分かりになる方、宜しくお願い致します。

  • 「C#」文字コードの取得&文字変換

    C#で文字コードを調べるプログラムを作成しています。 そこで2つ質問をさせてください。 1つ目(文字コード調べ) TextBoxに漢字を入力して,各エンコーディングの文字コードを調べるときに,UNICDEの場合, Encoding enc_default = Encoding.GetEncoding(932); string input = tb_input.Text; byte[] byte_input = enc_default.GetBytes(input); string outtext_unicode = ""; Encoding enc_unicode = Encoding.Unicode; byte[] byte_unicode = Encoding.Convert(enc_default,enc_unicode, byte_input); foreach (byte b in byte_unicode) { outtext_unicode += string.Format("{0:X}", (int)b); } tb_output_unicode.Text = outtext_unicode; とすると,調べたい文字コードがLE(リトルエディアン)で出力されます。これをBE(ビッグエディアン)で出力されるにはどうしたらよいでしょうか? ご存知の方がいらっしゃいましたら,ぜひ教えてください。 よろしくお願いいたします。 2つ目(文字コードから文字を取得する) 上記の質問と逆のパターンで,TextBoxに文字コードを入力してもらい,人間が読める文字に変換する場合下記のようなコードを書くと, string codePoint_string = tb_output_unicode.Text; int codePoint = int.Parse(codePoint_string); char c = (char)codePoint; tb_input.Text = Convert.ToString(c); ASCIIの文字コードを入力した場合には,きちんと変換してくれるのですが,漢字の文字コードを入力すると,FormatExceptionが発生します。 何か勘違いをしているのかもしれませんが,いまいちやり方が創造できません。 こちらも,ご存知の方がいらっしゃいましたら,ご教示願います。

  • 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
  • C# 文字コード変換

    お世話になります。 宜しくお願いします。 C#でプログラムを開発しております。 その中で、文字列をShift-JISでテキストファイルへ書き出す という処理があるんですが 以下のように指定しても文字コードがUTF-8で書き出されているようです。 コードを調べましたが間違いが見つけられません。 どこか間違いはございますでしょうか。 ご教授宜しくお願いします。 ・文字コードを判別する場所 : http://encode-detector.uic.jp/tool ・テキストの形式 :ファイル名.DMD /////////////// 以下コード /////////////////////////     String param = "テキストへ書き込む内容";     System.IO.StreamWriter sw =          new System.IO.StreamWriter(             @"C:\hoge.DMD",              false,             System.Text.Encoding.GetEncoding("Shift_JIS") );     System.Text.Encoding src = System.Text.Encoding.UTF8;     System.Text.Encoding dest = System.Text.Encoding.GetEncoding("Shift_JIS");     byte[] temp = src.GetBytes(param);     byte[] sjis_temp = System.Text.Encoding.Convert(src, dest, temp);     param = dest.GetString(sjis_temp);     sw.Write(param);     sw.Close();

  • [再質問]VC#で2進数の文字列をバイト列に変換する方法

    No.1029439で質問して回答頂きましたが、もう一度お願いします。 string strに2進数の文字列がNバイト分入っているとします(0か1が8×N個入っている)。これを1バイト分ずつbyte型の配列に入れたいです。 例えば、str = "1010111100101100"と2バイト分入ってるときは、byte型の配列bytesに bytes[0] =0xAF(10101111) bytes[1] =0x2C(00101100) となるようにしたいです。 最終的には↓のようにして、文字を出力したいためです。 Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS"); string str = sjisEnc.GetString(bytes); http://www.atmarkit.co.jp/fdotnet/dotnettips/011byte2str/byte2str.html よろしくお願いします。

  • smtpでメール送信

    いつもお世話になっております。 mail()、mb_send_mail() が使用できないため、smtp から 直接メール送信をしようと考えております。 (なぜ、mail()、mb_send_mail() が使用できないのかはわかりません。) // 件名 $subject = mb_convert_encoding($subject, "JIS", "EUC-JP"); $subject = '=?iso-2022-jp?B?' . base64_encode($subject) . '?='; // 本文 $msg = mb_convert_encoding($msg, "JIS", "EUC-JP"); // 送信 $fp = fsockopen('localhost', 25, $err_str, $err_no, 5); $header = "From: " . $from . "\r\n"; $header .= "To: " . $to . "\r\n"; $header .= "Reply-To: " . $from . "\r\n"; $header .= "Subject: " . $subject . "\r\n"; $header .= "Mime-Version: 1.0\r\n"; $header .= "Content-Type: Text/Plain; charset=iso-2022-jp\r\n"; $header .= "Content-Transfer-Encoding: 7bit\r\n"; fputs($fp, "HELO " . $smtp . "\r\n" ); fputs($fp, "MAIL FROM:" . $from . "\r\n"); fputs($fp, "RCPT TO:" . $to . "\r\n"); fputs($fp, "DATA \r\n"); fputs($fp, $header . $msg . "\r\n.\r\n"); fputs($fp, "QUIT \r\n"); 上記のように書きました。 一回目は送信できるのですが、二回目以降が送信できません。 サーバを再起動するとまた送信できるようになるのですが、 二回目以降はやはり送信できません。 何か原因が考えられますでしょうか。 ご教示よろしくお願いいたします。

    • 締切済み
    • PHP
  • PHPでHTMLメールを送信、文字化けします。

    Mail/mime.php を利用してHTMLメールの送信をしようとしています。 試行錯誤をしているのですが、どうしても文字化けしてしまいます。 データベースから取得したデータをHTMLメールにして送信したいのですが、 このままでは、タイトルはきちんと送れていますが、本分が文字化けします。 何か抜けたり、設定が変だったりはありますでしょうか? ご教授お願いいたします。 以下にソースを記しています。 データベースとPHPのソースはどちらも【UTF-8】です。 /*-------------------ここから データベースより取得----------*/ $recipients //送信先 $sender //送信元 $Subject //タイトル $body //本文 /*--------------------ここまでデータベースより取得--------------*/ mb_language("japanese"); mb_internal_encoding("UTF-8"); require_once("Mail.php"); require_once("Mail/mime.php"); $params = array( "host" => "自ドメイン", "port" => 587, "auth" => true, "username" => "送信元アカウント", "password" => "********" ); $mailObject = Mail::factory("smtp", $params); $mimeObject = new Mail_Mime("\n"); $mimeObject -> setHTMLBody($body); $bodyParam = array( "head_charset" => "ISO-2022-JP", "html_charset" => "Shift_Jis" ); $body = $mimeObject -> get($bodyParam); $addHeaders = array( "To" => "$recipients", "From" => "$sender", "Subject" => mb_encode_mimeheader("$Subject") ); $headers = $mimeObject -> headers($addHeaders); $mailObject -> send($recipients, $headers, $body);

    • ベストアンサー
    • PHP
  • 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; }

専門家に質問してみよう