1

我正在开发一个 asp.net c# 应用程序,该应用程序发送带有一个附件的电子邮件。附件是一个 vCalendar 文件。这是代码:

            StringBuilder sbCalendar = new StringBuilder();
            DateTime dtStart = eventDate;
            DateTime dtEnd = eventDate;

            sbCalendar.AppendLine("METHOD: REQUEST");
            sbCalendar.AppendLine("BEGIN:VCALENDAR");
            sbCalendar.AppendLine("PRODID:-//DP//NET");
            sbCalendar.AppendLine("MIMEDIR//ENVERSION:1.0");
            sbCalendar.AppendLine("METHOD:REQUEST");
            sbCalendar.AppendLine("BEGIN:VEVENT");
            sbCalendar.AppendLine("DTSTAMP:" + dtStart.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z"));
            sbCalendar.AppendLine("DTSTART:" + dtStart.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z"));
            sbCalendar.AppendLine("DTEND:" + dtEnd.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z"));
            sbCalendar.AppendLine("LOCATION:" + eventLocation);
            sbCalendar.AppendLine("DESCRIPTION;ENCODING=QUOTED-PRINTABLE:" + eventBody);
            sbCalendar.AppendLine("SUMMARY:" + eventSubject);
            sbCalendar.AppendLine("PRIORITY:3");
            sbCalendar.AppendLine("UID:" + Guid.NewGuid().ToString());
            sbCalendar.AppendLine("ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION:MAILTO:required@participant.foo");
            sbCalendar.AppendLine("ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:MAILTO:chair@foo.foo");
            sbCalendar.AppendLine("CLASS:PUBLIC");
            sbCalendar.AppendLine("ORGANIZER:MAILTO:organizer@foo.foo");
            sbCalendar.AppendLine("SEQUENCE:0");
            sbCalendar.AppendLine("STATUS:TENTATIVE");
            sbCalendar.AppendLine("END:VEVENT");
            sbCalendar.AppendLine("END:VCALENDAR");

            byte[] byteArray = Encoding.UTF8.GetBytes(sbCalendar.ToString());

            Stream contentStream = new MemoryStream(byteArray);

            SmtpClient smtp = new SmtpClient("localhost");

            MailMessage memo = new MailMessage();

            memo.IsBodyHtml = true;

            memo.From = new MailAddress("from@ddress.foo");

            foreach (string emailAddress in emailAddresses)
            {
                memo.To.Add(emailAddress);
            }

            memo.Body = messageBody;
            memo.Subject = messageSubject;

            Attachment attachment = new Attachment(contentStream, "termenLitigiu.ics", "text/calendar");
            attachment.TransferEncoding = System.Net.Mime.TransferEncoding.Base64;
            memo.Attachments.Add(attachment);
            smtp.Send(memo);

这有效并做了应该做的事情,它发送一个工作(由 Outlook 识别)的 vcalendar 文件。

问题是在邮件正文中,除了 messageBody 参数的内容外,还出现了附件的内容,如下所示:

发件人:发件人 发送时间:2010 年 10 月 5 日,星期二 4:59 PM 收件人:someemail

messageBody 内容在这里

方法:请求开始:VCALENDAR PRODID:-//DP//NET MIMEDIR//ENVERSION:1.0 方法:请求开始:VEVENT DTSTAMP:20101006T135934Z DTSTART:20101006T135934Z DTEND:20101006T135934Z 位置:Minstead 描述;我的编码:我的第一次会议摘要:学习日历和计划优先级:3 UID:721d9e3c-9010-47f5-9ad0-83c38cb0cbb7 参加者;角色=请求参与者;部分状态=需要操作:邮件:某些电子邮件参与者;角色=椅子;部分状态=接受:邮件:某些电子邮件类别:公共组织者:MAILTO:someemail 序列:0 状态:暂定结束:事件结束:VCALENDAR

我想摆脱该文本,只显示我的 messageBody 参数的内容,并将 vCalendar 文件附加到邮件消息中。我怎样才能做到这一点?这是前景问题还是编码问题?

编辑:我只对在 Microsoft Outlook 中显示消息感兴趣。我查看了消息的来源(在 Outlook 中右键单击 > 查看源),我想删除的文本位于消息的<body> </body> html 标记中)

4

1 回答 1

1

找到了解决方案:

http://msdn.microsoft.com/en-us/library/system.net.mime.dispositiontypenames.attachment.aspx

在 Attachment 的构造函数中,我替换"text/calendar"MediaTypeNames.Application.Octet并将其设置为DispositionTypeAttachment而不是Inline它可能是默认值。

            Attachment attachment = new Attachment(contentStream, "termenLitigiu.ics", MediaTypeNames.Application.Octet);
            attachment.ContentDisposition.DispositionType = DispositionTypeNames.Attachment;

它现在给了我一个干净的邮件消息,邮件正文包含它应该包含的内容和一个有效的 .ics 附件。

于 2010-10-06T09:21:32.363 回答