Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在使用System.Net.Mail发送电子邮件时捕获邮件大小过大异常?_C#_Exception Handling_Smtpclient_System.net.mail - Fatal编程技术网

C# 如何在使用System.Net.Mail发送电子邮件时捕获邮件大小过大异常?

C# 如何在使用System.Net.Mail发送电子邮件时捕获邮件大小过大异常?,c#,exception-handling,smtpclient,system.net.mail,C#,Exception Handling,Smtpclient,System.net.mail,我正在使用System.Net.Mail library以C#格式发送电子邮件。我想以某种方式检查消息没有发送的情况,因为它太大了。这是我为说明问题而编写的示例代码: internal class Program { private static void Main() { var client = new SmtpClient(); try { var mail = new MailMessage();

我正在使用System.Net.Mail library以C#格式发送电子邮件。我想以某种方式检查消息没有发送的情况,因为它太大了。这是我为说明问题而编写的示例代码:

internal class Program
{
    private static void Main()
    {
        var client = new SmtpClient();
        try
        {
            var mail = new MailMessage();
            mail.From = new MailAddress("sender@mail.com");
            mail.To.Add(new MailAddress("recipient@mail.com"));
            mail.Subject = "Mail Subject";
            mail.Body = "Mail Body";
            mail.Attachments.Add(CreateAttachment());
            var smtpClient = new SmtpClient("SomeHost", 25)
            {
                EnableSsl = false,
                Credentials = new NetworkCredential("username", "password"),
            };
            smtpClient.Send(mail);
        }
        catch (SmtpException e)
        {
            // somehow verify that this exception happened because exceeding message size
            Console.WriteLine("Message was not sent because it was to big"); ;
        }
    }

    // This method generates an attachment that exceed maximum size allowed by the server
    private static Attachment CreateAttachment()
    {
        var str = "Some message\n";
        var superBigMessage = new System.Text.StringBuilder();
        for (int i = 0; i < 10000000; i++)
        {
            superBigMessage.Append(str);
        }
        return Attachment.CreateAttachmentFromString(superBigMessage.ToString(), "Attachment.txt");
    }
}
内部类程序
{
私有静态void Main()
{
var client=新的SmtpClient();
尝试
{
var mail=new MailMessage();
mail.From=新邮件地址(“sender@mail.com");
mail.To.Add(新邮件地址(“recipient@mail.com"));
mail.Subject=“邮件主题”;
mail.Body=“邮件正文”;
Add(CreateAttachment());
var smtpClient=新的smtpClient(“SomeHost”,25)
{
EnableSsl=false,
凭据=新网络凭据(“用户名”、“密码”),
};
发送(邮件);
}
捕获(SMTPE异常)
{
//以某种方式验证此异常是否由于超出消息大小而发生
WriteLine(“由于太大而未发送消息”);
}
}
//此方法生成的附件超过了服务器允许的最大大小
私有静态附件CreateAttachment()
{
var str=“一些消息\n”;
var superBigMessage=new System.Text.StringBuilder();
对于(int i=0;i<10000000;i++)
{
superBigMessage.Append(str);
}
返回Attachment.CreateAttachmentFromString(superBigMessage.ToString(),“Attachment.txt”);
}
}
我想提到的是,在
SmtpException
上有一个名为
StatusCode
的属性,但它没有提供必要的细节,以防消息太大
StatusCode=TransactionFailed
并且异常消息显示
Transaction failed。服务器响应为:拒绝-邮件大小超过固定的最大邮件大小。大小:147442 KB,最大大小:20480 KB

您的MTA如何处理“太大”以及如何报告它取决于该MTA。不同的MTA可能有完全不同的消息。
SMTP
中没有标准化“太大”的内容


因此,您需要解析消息,并准备在MTA更改时进行更新(包括软件升级和配置更改)。

@mjwills很难验证消息的确切大小,因为消息可能会在发送过程中被编码,并且可能会在发送过程中发送一些附加信息,因此,我怀疑我能否准确计算邮件大小。你能检查一个下限(例如18MB)给自己一点缓冲吗?@mjwills我猜,但这可能不是一个很好的解决方案,即使可以发送邮件,我也可能不发送邮件。@mjwills我将csv报告作为电子邮件附件发送,它可能会变得很大,所以我想建立一些安全机制,防止大消息发送。我也在压缩这个文件,但它不能保证它足够小。压缩后的CSV大于20MB?