C#邮件只发送第一个附件?

时间:2018-01-13 01:31:18

标签: c#

此处SmtpClient仅将第一个文件作为附件发送,其余的我不知道。应该有一些时间等待附件发送完整吗?

 private static void SendFiles()
 {
        var client = new SmtpClient("smtp.gmail.com");
        client.Port = 587;
        client.Credentials = new NetworkCredential("wmitask@gmail.com", "password");
        client.EnableSsl = true;
        var message = new MailMessage();
        message.From = new MailAddress("wmitask@gmail.com");
        message.To.Add("wmitask@gmail.com");
        message.Subject = "File";
        message.Body = "Test";
        Attachment attachments = null;
        foreach (var file in Directory.GetFiles(programFilesDataDir))
        {
            attachments = new Attachment(file, MediaTypeNames.Application.Pdf);
        }
        if (attachments == null)
            return;
        message.Attachments.Add(attachments);
        client.Send(message);
}

3 个答案:

答案 0 :(得分:1)

foreach (var file in Directory.GetFiles(programFilesDataDir))次迭代中,您每次都在创建一个新实例。因此,只保留添加的最后一个附件。

更改循环,将附件添加到message.Attachments循环中的for....each

答案 1 :(得分:1)

for循环中,您为每个附件反复分配attachments变量,实际上覆盖了之前变量的值。

试试这个:

    foreach (var file in Directory.GetFiles(programFilesDataDir))
    {
        attachments = new Attachment(file, MediaTypeNames.Application.Pdf);
        message.Attachments.Add(attachments);           
    }
    if(attachments.Count > 0)
        client.Send(message);

但这意味着即使没有文件也可以创建整个消息,然后永远不会发送它。如果您只想在有文件的情况下发送消息,那么如果没有文件,您可以立即退出该方法。在您的方法的顶部:

var files = Directory.GetFiles(programFilesDataDir);
if(files.Length) == 0 return;

然后在创建消息后,您可以遍历files变量,因为您已经知道有文件。

    foreach (var file in files))
    {
        attachments = new Attachment(file, MediaTypeNames.Application.Pdf);
        message.Attachments.Add(attachments);           
    }
    client.Send(message);

答案 2 :(得分:0)

要添加附件,您需要使用:

message.Attachments.Add(new Attachment(AttachTB.Text));

如果你想再添加一次,请再次打电话:

message.Attachments.Add(new Attachment(AttachTB.Text));
message.Attachments.Add(new Attachment(AttachIITB.Text));