c# - 用于电子邮件发送的波兰字符 MIME 格式的问题

标签 c# sockets email

我正在尝试使用传递方法 SmtpDeliveryMethod.Network 发送邮件(邮件正文包含波兰语字符)。我使用 MIME 格式、套接字、IPHostEntry 和 IPEndPoint。我的标题看起来是这样的:

Header.Append("MIME-Version: 1.0\r\n");
Header.Append("Content-type: text/plain; charset=ISO-8859-2;\r\n");
Header.Append("Content-transfer-encoding: quoted-printable\r\n");

当我尝试发送邮件时,我仍然看到问号而不是我输入的字符。有谁能够帮助我?我包括我的整个类(class)。

    using System;
using System.Net;
using System.Net.Mail;
using System.Net.Sockets;
using System.Text;
public class SmtpDirect
{
    /// <summary>
    /// Get / Set the name of the SMTP mail server
    /// </summary>
    public static string SmtpServer = "kappa.it.com.ru";
    private enum SMTPResponse : int
    {
        CONNECT_SUCCESS = 220,
        GENERIC_SUCCESS = 250,
        DATA_SUCCESS = 354,
        QUIT_SUCCESS = 221
    }

    public static bool Send(MailMessage message)
    {
        IPHostEntry IPhst = Dns.GetHostEntry(SmtpServer);
        IPEndPoint endPt = new IPEndPoint(IPhst.AddressList[0], 25);
        Socket s = new Socket(endPt.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
        s.Connect(endPt);

        if (!Check_Response(s, SMTPResponse.CONNECT_SUCCESS))
        {
            s.Close();
            return false;
        }

        Senddata(s, string.Format("HELO {0}\r\n", Dns.GetHostName()));
        if (!Check_Response(s, SMTPResponse.GENERIC_SUCCESS))
        {
            s.Close();
            return false;
        }

        Senddata(s, string.Format("MAIL From: {0}\r\n", message.From));
        if (!Check_Response(s, SMTPResponse.GENERIC_SUCCESS))
        {

            s.Close();
            return false;
        }

        string _To = message.To.ToString();
        string[] Tos = _To.Split(new char[] { ';' });
        foreach (string To in Tos)
        {
            Senddata(s, string.Format("RCPT TO: {0}\r\n", To));
            if (!Check_Response(s, SMTPResponse.GENERIC_SUCCESS))
            {
                s.Close();
                return false;
            }
        }

        StringBuilder Header = new StringBuilder();

        Header.Append("From: " + message.From + "\r\n");
        Tos = message.To.ToString().Split(new char[] { ';' });
        Header.Append("To: ");
        for (int i = 0; i < Tos.Length; i++)
        {
            Header.Append(i > 0 ? "," : "");
            Header.Append(Tos[i]);
        }
        Header.Append("\r\n");
        if (message.CC != null)
        {
            Tos = message.CC.ToString().Split(new char[] { ';' });
            Header.Append("CC: ");
            for (int i = 0; i < Tos.Length; i++)
            {
                Header.Append(i > 0 ? "," : "");
                Header.Append(Tos[i]);
            }
            Header.Append("\r\n");
        }
        Header.Append("Date: ");
        Header.Append(DateTime.Now.ToString("ddd, d M y H:m:s z"));
        Header.Append("\r\n");
        Header.Append("Subject: " + message.Subject + "\r\n");
        Header.Append("X-Mailer: SMTPDirect v1\r\n");
        string MsgBody = message.Body;
        if (!MsgBody.EndsWith("\r\n"))
            MsgBody += "\r\n";
        Header.Append("MIME-Version: 1.0\r\n");
        Header.Append("Content-type: text/plain; charset=ISO-8859-2;\r\n");
        Header.Append("Content-transfer-encoding: quoted-printable\r\n");
        Header.Append("\r\n");
        Header.Append("This is a multi-part message in MIME format.\r\n");
        StringBuilder sb = new StringBuilder();
        sb.Append("--unique-boundary-1\r\n");
        sb.Append("Content-type: text/plain; charset=ISO-8859-2\r\n");
        sb.Append("Content-transfer-encoding: quoted-printable\r\n");
        sb.Append("\r\n");
        sb.Append(MsgBody + "\r\n");
        sb.Append("\r\n");

        MsgBody = sb.ToString();

        Senddata(s, ("DATA\r\n"));
        if (!Check_Response(s, SMTPResponse.DATA_SUCCESS))
        {
            s.Close();
            return false;
        }
        Header.Append("\r\n");
        Header.Append(MsgBody);
        Header.Append(".\r\n");
        Header.Append("\r\n");
        Header.Append("\r\n");
        Senddata(s, Header.ToString());
        if (!Check_Response(s, SMTPResponse.GENERIC_SUCCESS))
        {
            s.Close();
            return false;
        }

        Senddata(s, "QUIT\r\n");
        Check_Response(s, SMTPResponse.QUIT_SUCCESS);
        s.Close();
        return true;
    }
    private static void Senddata(Socket s, string msg)
    {
        byte[] _msg = Encoding.ASCII.GetBytes(msg);
        s.Send(_msg, 0, _msg.Length, SocketFlags.None);
    }
    private static bool Check_Response(Socket s, SMTPResponse response_expected)
    {
        string sResponse;
        int response;
        byte[] bytes = new byte[1024];
        while (s.Available == 0)
        {
            System.Threading.Thread.Sleep(100);
        }

        s.Receive(bytes, 0, s.Available, SocketFlags.None);
        sResponse = Encoding.ASCII.GetString(bytes);
        response = Convert.ToInt32(sResponse.Substring(0, 3));
        if (response != (int)response_expected)
            return false;
        return true;
    }
}

我用这个:

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Text;

namespace FakeSMTP
{
    class TestClass
    {
        public static void Main()
        {
            MailMessage mail = new MailMessage("guesswho@hi.com.pl", "guesswho@xyz.pl");
            SmtpClient client = new SmtpClient();
            client.DeliveryMethod = SmtpDeliveryMethod.Network;
            client.UseDefaultCredentials = false;
            client.Host = "kappa.it.com.ru"";
            client.Port = 69;
            mail.Subject = "Zgłoszenie z systemu OZ <<547-gf45d>>";
            mail.Body = "TUTAJ PODAJE CAŁE ZGŁOSZENIE Z SYSTEMU - można odpowiadać z Outlooka.";

            SmtpDirect.Send(mail);
        }
    }
}

最佳答案

没关系。

byte[] _msg = Encoding.UTF8.GetBytes(msg);

有帮助

关于c# - 用于电子邮件发送的波兰字符 MIME 格式的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31916385/

相关文章:

c# - confuserEx、Clickonce 和 Icon

c# - 通过 WMI 更新

c# - 我可以使用哪些工具在 Visual Studio 2010 Professional Edition 中分析 .Net 应用程序

c - 接受为第二个、第三个等客户端返回 0

node.js - meteor JS : Generating emails from templates server-side

objective-c - 将 HTML 内容设置为 MFMailComposeViewController View 的邮件正文

php - 如何设置 php 电子邮件表单正文的样式?

c# - 在C#中序列化为XML时将属性更改为camelCase

sockets - sendmsg返回错误空间不可用

c# - Image.FromStream 使用 networkStream