具有不同编码附件的电子邮件服务

时间:2013-08-19 14:21:08

标签: .net character-encoding email-attachments

我正在尝试制作一个电子邮件服务,发送已经在我们系统的其他地方处理过的附件。对此的要求是客户端期望在作业的设置中指定特定的编码。在测试应用程序中,我试图发送带有不同编码附件的电子邮件,但是当我在IE或记事本++中查看时,我得到一堆问号,而不是正确编码的文件。我做得不对劲?

        var current_month = @"<?xml version=""1.0"" encoding=""utf-8""?>
                                <test>
                                ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789
                                abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ
                                –—‘“”„†•…‰™œŠŸž€ ΑΒΓΔΩαβγδω АБВГДабвгд
                                ∀∂∈ℝ∧∪≡∞ ↑↗↨↻⇣ ┐┼╔╘░►☺♀ fi�⑀₂ἠḂӥẄɐː⍎אԱა

                                Οὐχὶ ταὐτὰ παρίσταταί μοι γιγνώσκειν, ὦ ἄνδρες ᾿Αθηναῖοι,
                                ὅταν τ᾿ εἰς τὰ πράγματα ἀποβλέψω καὶ ὅταν πρὸς τοὺς
                                λόγους οὓς ἀκούω· τοὺς μὲν γὰρ λόγους περὶ τοῦ
                                τιμωρήσασθαι Φίλιππον ὁρῶ γιγνομένους, τὰ δὲ πράγματ᾿
                                εἰς τοῦτο προήκοντα,  ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αὐτοὶ
                                πρότερον κακῶς σκέψασθαι δέον. οὐδέν οὖν ἄλλο μοι δοκοῦσιν
                                οἱ τὰ τοιαῦτα λέγοντες ἢ τὴν ὑπόθεσιν, περὶ ἧς βουλεύεσθαι,
                                οὐχὶ τὴν οὖσαν παριστάντες ὑμῖν ἁμαρτάνειν. ἐγὼ δέ, ὅτι μέν
                                ποτ᾿ ἐξῆν τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον
                                τιμωρήσασθαι, καὶ μάλ᾿ ἀκριβῶς οἶδα· ἐπ᾿ ἐμοῦ γάρ, οὐ πάλαι
                                γέγονεν ταῦτ᾿ ἀμφότερα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν
                                προλαβεῖν ἡμῖν εἶναι τὴν πρώτην, ὅπως τοὺς συμμάχους
                                σώσομεν. ἐὰν γὰρ τοῦτο βεβαίως ὑπάρξῃ, τότε καὶ περὶ τοῦ
                                τίνα τιμωρήσεταί τις καὶ ὃν τρόπον ἐξέσται σκοπεῖν· πρὶν δὲ
                                τὴν ἀρχὴν ὀρθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι περὶ τῆς
                                τελευτῆς ὁντινοῦν ποιεῖσθαι λόγον.
                                </test>";

        var newEncoding = Encoding.UTF8;

        var bytes = Encoding.Default.GetBytes(current_month);
        var newBytes = Encoding.Convert(Encoding.Default, newEncoding, bytes);

        var msCurrent = new MemoryStream(newBytes);

        var attachment = new Attachment(msCurrent, "testattachment3.xml", MediaTypeNames.Text.Xml);
        attachment.ContentType = new ContentType("text/xml");

        var message = new MailMessage("them", "me");
        message.BodyEncoding = newEncoding;

        message.Attachments.Add(attachment);

        new SmtpClient("192.168.6.25")
        {
          UseDefaultCredentials = true
        }.Send(message);

1 个答案:

答案 0 :(得分:0)

在此测试中,字符串UTF8正确编码和解码 为什么编码为默认和转换而不是直接将字符串加载到UTF8?

string current_month = @"<?xml version=""1.0"" encoding=""utf-8""?>
                    <test>
                    ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789
                    abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ
                    –—‘“”„†•…‰™œŠŸž€ ΑΒΓΔΩαβγδω АБВГДабвгд
                    ∀∂∈ℝ∧∪≡∞ ↑↗↨↻⇣ ┐┼╔╘░►☺♀ fi�⑀₂ἠḂӥẄɐː⍎אԱა

                    Οὐχὶ ταὐτὰ παρίσταταί μοι γιγνώσκειν, ὦ ἄνδρες ᾿Αθηναῖοι,
                    ὅταν τ᾿ εἰς τὰ πράγματα ἀποβλέψω καὶ ὅταν πρὸς τοὺς
                    λόγους οὓς ἀκούω· τοὺς μὲν γὰρ λόγους περὶ τοῦ
                    τιμωρήσασθαι Φίλιππον ὁρῶ γιγνομένους, τὰ δὲ πράγματ᾿
                    εἰς τοῦτο προήκοντα,  ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αὐτοὶ
                    πρότερον κακῶς σκέψασθαι δέον. οὐδέν οὖν ἄλλο μοι δοκοῦσιν
                    οἱ τὰ τοιαῦτα λέγοντες ἢ τὴν ὑπόθεσιν, περὶ ἧς βουλεύεσθαι,
                    οὐχὶ τὴν οὖσαν παριστάντες ὑμῖν ἁμαρτάνειν. ἐγὼ δέ, ὅτι μέν
                    ποτ᾿ ἐξῆν τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον
                    τιμωρήσασθαι, καὶ μάλ᾿ ἀκριβῶς οἶδα· ἐπ᾿ ἐμοῦ γάρ, οὐ πάλαι
                    γέγονεν ταῦτ᾿ ἀμφότερα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν
                    προλαβεῖν ἡμῖν εἶναι τὴν πρώτην, ὅπως τοὺς συμμάχους
                    σώσομεν. ἐὰν γὰρ τοῦτο βεβαίως ὑπάρξῃ, τότε καὶ περὶ τοῦ
                    τίνα τιμωρήσεταί τις καὶ ὃν τρόπον ἐξέσται σκοπεῖν· πρὶν δὲ
                    τὴν ἀρχὴν ὀρθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι περὶ τῆς
                    τελευτῆς ὁντινοῦν ποιεῖσθαι λόγον.
                    </test>";
Encoding newEncoding = Encoding.UTF8;
byte[] bytes = newEncoding.GetBytes(current_month);
string stringOut = newEncoding.GetString(bytes);
System.Diagnostics.Debug.WriteLine(string.Compare(current_month, stringOut).ToString());
tb1.Text = current_month;
tb2.Text = stringOut;