ASP.NET C# 电子邮件附件在发送到多个电子邮件地址时最终变为 0 字节

Posted

技术标签:

【中文标题】ASP.NET C# 电子邮件附件在发送到多个电子邮件地址时最终变为 0 字节【英文标题】:ASP.NET C# Email Attachments Eventually go to 0 Bytes When Sending to Multiple Email Addresses 【发布时间】:2016-03-30 02:01:33 【问题描述】:

我有这个例程将电子邮件发送到如下列表,并且我已经对其进行了测试。我收到的第一封电子邮件很好,但第二封电子邮件的字节数少于实际文件导致其打开时损坏的字节数。我怎样才能使每个电子邮件附件都能正确发送而不发送任何 0 字节附件?我通过 ASP.NET C# webform 将附件直接发送给收件人,但大多数 PDF 附件都通过错误消息解码不正确。这是页面的主要电子邮件代码:

if (emailIsValid(EmailToSend))

    string TheSubject = SubjectTxt.Text;
    string TheBody = "Dear " + FirstName + ",<br/><br/>" + MessageTxt.Text;
    TheBody = TheBody + " EMail Body "
    string BodyTxt = TheBody.Replace(Environment.NewLine, "<br />");

    MailMessage mailObj = new MailMessage(
        "noreply@company.com", EmailToSend, TheSubject, BodyTxt);
    SmtpClient SMTPServer = new SmtpClient("unknown.company.com");

    string RPT = FromTxt.Text;
    mailObj.ReplyToList.Add(RPT);
    mailObj.BodyEncoding = System.Text.Encoding.UTF8;
    mailObj.IsBodyhtml = true;


    string filePath = txtAttachment.PostedFile.FileName;
    string filename = Path.GetFileName(filePath);
    string ext = Path.GetExtension(filename);
    string contenttype = String.Empty;

    //Set the contenttype based on File Extension
    switch (ext)
    
        case ".doc":
            contenttype = "application/vnd.ms-word";
            break;
        case ".docx":
            contenttype = "application/vnd.ms-word";
            break;
        case ".xls":
            contenttype = "application/vnd.ms-excel";
            break;
        case ".xlsx":
            contenttype = "application/vnd.ms-excel";
            break;
        case ".ppt":
            contenttype = "application/vnd.ms-powerpoint";
            break;
        case ".pptx":
            contenttype = "application/vnd.ms-powerpoint";
            break;
        case ".jpg":
            contenttype = "image/jpg";
            break;
        case ".png":
            contenttype = "image/png";
            break;
        case ".gif":
            contenttype = "image/gif";
            break;
        case ".pdf":
            contenttype = "application/pdf";
            break;
        case ".csv":
            contenttype = "text/csv";
            break;
        case ".txt":
            contenttype = "text/csv";
            break;
        default:
            contenttype = "Unknown Content Type";
            break;


    

    if (txtAttachment.PostedFile != null && contenttype != "Unknown Content Type")
    
        try
        
            string strFileName =
            System.IO.Path.GetFileName(txtAttachment.PostedFile.FileName);
            Attachment attachFile =
            new Attachment(txtAttachment.PostedFile.InputStream, strFileName, contenttype);                                           
            mailObj.Attachments.Add(attachFile);
        
        catch
        

        
    

    try
    
        SMTPServer.Send(mailObj);

        SqlConnection con2 = new SqlConnection(CS);

        con2.Open();

        DateTime now = DateTime.Now;
    
catch
    
    

【问题讨论】:

您的代码中有一个空的 catch 块。你几乎不应该那样做。这是一种反模式。如果您不打算对失败的电子邮件采取任何措施,至少记录下它发生了。 好的,谢谢,但这不是导致我的电子邮件问题的原因 而不是将contenttype 设置为“未知内容类型”,您应该使用问题Is there a “default” MIME type? 中所述的“应用程序/八位字节流”,此外,您还应该遵循C# 标准命名约定。 contenttype -> contentType, strFileName -> fileName, mailObj -> messagemailMessage 【参考方案1】:

之前

Attachment attachFile =
        new Attachment(txtAttachment.PostedFile.InputStream, strFileName, contenttype);

尝试重置流光标,如下所示:

txtAttachment.PostedFile.InputStream.Position = 0;
Attachment attachFile =
        new Attachment(txtAttachment.PostedFile.InputStream, strFileName, contenttype);

【讨论】:

这似乎成功了!谢谢安德森,我投票并标记为答案。 非常有帮助。谢谢你的回答。

以上是关于ASP.NET C# 电子邮件附件在发送到多个电子邮件地址时最终变为 0 字节的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET 中使用具有 HTML 正文 + 附件的 GMAIL API 发送电子邮件

发送电子邮件 asp.net c#

ASP .Net C# 代码向多个用户发送邮件,这些用户的邮件 ID 应隐藏在组名中

如何在 asp.net C# 中使用启用两因素身份验证的 office365 电子邮件帐户发送电子邮件?

GMAIL API 在 C# 中发送带附件的电子邮件

从 C# 发送带有附件的电子邮件,附件在 Thunderbird 中作为第 1.2 部分到达