c# - iCalendar / InvalidRecipientsException:无法发送消息,因为它不包含收件人
问题描述
我有一个简单的方法,可以将 iCalendar 邀请发送到收件人的电子邮件地址。出于某种原因,我不断得到
{“事务失败。服务器响应为:5.2.0 STOREDRV.Submission.Exception:InvalidRecipientsException;由于消息的永久异常而无法处理消息 A 消息无法发送,因为它不包含收件人。InvalidRecipientsException:消息可以'不被发送,因为它不包含收件人。[Hostname=AM6PR10MB2759.EURPRD10.PROD.OUTLOOK.COM]"}例外。
奇怪的是,该异常与 UID 属性有关,这在 iCalendar 规范中是强制性的。当我使用指定的 UID 属性时,我根本不会收到邮件的日历邀请,因为
smtpClient.Send(mailMessage); 触发异常。
但是,当我从日历邀请中删除 UID 属性时,日历邀请邮件已正确发送到收件人的邮件,但由于缺少 UID未正确显示。
我的问题是:我是否遗漏了应在 iCalendar 消息中填充的任何其他收件人属性?
我尝试了几种方式填充 UID 属性。没有任何作品。但是,当我删除 UID 属性时,我收到了邮件,但它有“不支持的日历 message.ics”附件。
我也将消息上传到 iCalendar 验证器,它显示一个错误,这与缺少 UID 有关。
public class CalendarInvitation
{
public string Name { set; get; }
public string EmailAddress { set; get; }
public string Location { set; get; }
public DateTime StartDateTime { set; get; }
public DateTime EndDateTime { set; get; }
public string Subject { set; get; }
public string Body { set; get; }
}
public static string SendCalendarInvitation(string eMail, CalendarInvitation calendarInvitation)
{
try
{
if (!eMail.Contains("@"))
return null;
int myEmailPort = 587;
int myEmailHostName = "smtp.office365.com";
SmtpClient smtpClient = new SmtpClient(myEmailHostName, myEmailPort);
smtpClient.EnableSsl = true;
smtpClient.UseDefaultCredentials = false;
smtpClient.Credentials = new NetworkCredential("myEmail@mydomain.com", "myPassword");
smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
MailMessage mailMessage = new MailMessage();
mailMessage.From = new MailAddress("myEmail@mydomain.com", Messages.EmailNewPasswordFromIdentity);
mailMessage.To.Add(new MailAddress(calendarInvitation.EmailAddress, calendarInvitation.Name));
mailMessage.Subject = calendarInvitation.Subject;
mailMessage.Body = calendarInvitation.Body;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.AppendLine("BEGIN:VCALENDAR");
stringBuilder.AppendLine("PRODID:-//" + calendarInvitation.EmailAddress);
stringBuilder.AppendLine("VERSION:2.0");
stringBuilder.AppendLine("METHOD:REQUEST");
stringBuilder.AppendLine("BEGIN:VEVENT");
stringBuilder.AppendLine(string.Format("UID:{0}", Guid.NewGuid())); // HAVING THIS LINE OF CODE CAUSES THE EXCEPTION
stringBuilder.AppendLine(string.Format("DTSTART:{0:yyyyMMddTHHmmssZ}", calendarInvitation.StartDateTime.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z")));
stringBuilder.AppendLine(string.Format("DTSTAMP:{0:yyyyMMddTHHmmssZ}", DateTime.Now.ToUniversalTime().ToString("yyyyMMdd\\THHmmss")));
stringBuilder.AppendLine(string.Format("DTEND:{0:yyyyMMddTHHmmssZ}", calendarInvitation.EndDateTime.ToUniversalTime().ToString("yyyyMMdd\\THHmmss\\Z")));
stringBuilder.AppendLine(string.Format("SEQUENCE:0"));
stringBuilder.AppendLine(string.Format("CREATED:{0:yyyyMMddTHHmmssZ}", DateTime.Now.ToUniversalTime().ToString("yyyyMMdd\\THHmmss")));
stringBuilder.AppendLine(string.Format("LAST-MODIFIED:{0:yyyyMMddTHHmmssZ}", DateTime.Now.ToUniversalTime().ToString("yyyyMMdd\\THHmmss")));
stringBuilder.AppendLine("LOCATION:" + calendarInvitation.Location);
stringBuilder.AppendLine(string.Format("DESCRIPTION:{0}", calendarInvitation.Body));
stringBuilder.AppendLine(string.Format("X-ALT-DESC;FMTTYPE=text/html:{0}", calendarInvitation.Body));
stringBuilder.AppendLine(string.Format("SUMMARY:{0}", calendarInvitation.Subject));
stringBuilder.AppendLine(string.Format("ORGANIZER:{0}", eMail));
stringBuilder.AppendLine(string.Format("ATTENDEE;CN=\"{0}\";RSVP=TRUE:mailto:{1}", mailMessage.To[0].DisplayName, mailMessage.To[0].Address));
stringBuilder.AppendLine("BEGIN:VALARM");
stringBuilder.AppendLine("TRIGGER:-PT15M");
stringBuilder.AppendLine("ACTION:DISPLAY");
stringBuilder.AppendLine("DESCRIPTION:REMINDER");
stringBuilder.AppendLine("END:VALARM");
stringBuilder.AppendLine("END:VEVENT");
stringBuilder.AppendLine("END:VCALENDAR");
ContentType contentType = new ContentType("TEXT/CALENDAR");
contentType.Parameters.Add("METHOD", "REQUEST");
AlternateView alternativeView = AlternateView.CreateAlternateViewFromString(stringBuilder.ToString(), contentType);
mailMessage.AlternateViews.Add(alternativeView);
smtpClient.Port = myEmailPort;
smtpClient.EnableSsl = true;
smtpClient.Credentials = new NetworkCredential("myEmail@mydomain.com", "myPassword");
try
{
smtpClient.Send(mailMessage);
return string.Empty;
}
catch (Exception e) // JUMPS TO THIS EXCEPTION, WHEN HAVING UID POPULATED IN THE CODE
{
return "Fail";
}
}
catch { }
return string.Empty;
}
解决方案
推荐阅读
- swift - iOS Firebase RTDB 观察者 - 删除不再存在的路径的观察者
- office-js - macOS 上的 Excel 内容加载项:对话框消失
- python-3.x - 如何将python依赖项添加到目录中?
- firebase - Firebase 云消息传递和 Firebase 应用内消息传递有什么区别
- video - ffmpeg 将一个视频叠加在另一个视频上,只保留叠加视频的声音
- jestjs - waitFor 不会再次运行回调
- sql-server - 查看,按总和截断小数分组
- java - IF 语句未按预期工作。无法使 AND 工作
- javascript - Node.js - 使用 Axios POST 发送文件
- linux - Jenkins 日志变得巨大并填满了整个磁盘空间