У меня есть приложение, которое я создал в Visual Studio с помощью VB.NET, которое извлекает почтовые сообщения из почтового ящика Outlook, сохраняет информацию о сообщениях в базе данных и загружает вложения (если они есть) в папку. Перед сохранением почтового сообщения в моей базе данных, если сообщение от определенного пользователя, я пересылаю его в другой почтовый ящик (и, таким образом, я не сохраняю сообщение). Все это работает нормально, за исключением случаев, когда я пытаюсь переслать сообщение с вложениями.
Как указано в заголовке, я использую OpenPOP для получения почты и SMTP для передачи почты. Когда я пытаюсь создать SMTP-вложение из сообщения OpenPOP, я получаю следующую ошибку:
System.InvalidCastException: преобразование типа "MessagePart" в тип "String" недопустимо.
Сообщение создается функцией AddAttachments (ниже) в строке:
myAttachment = Новое вложение (вложение) (в выражении For Each)
Public Sub ForwardMessage(
ByVal msgPOP As OpenPop.Mime.Message,
toAddress As String,
fromAddress As String,
subject As String,
body As String
)
Dim smtpServer As New System.Net.Mail.SmtpClient(Me.serverName)
Dim msgSMTP As New MailMessage()
msgSMTP.Sender = New MailAddress(fromAddress)
msgSMTP.To.Add(New MailAddress(toAddress))
msgSMTP.Subject = subject
msgSMTP.Body = body
msgSMTP.IsBodyHtml = True
Dim attachments As Object
attachments = AddAttachments(msgPOP, msgSMTP)
msgSMTP.Attachments.Add(New Attachment(attachments))
smtpServer.Send(msgSMTP)
End Sub
С помощью друга я наконец-то разобрался. Функция AddAttachments ниже была изменена, чтобы показать исправление.
Public Function AddAttachments(
ByVal msgPOP As OpenPop.Mime.Message,
ByVal msgSMTP As MailMessage
) As MailMessage
Dim attachments As Object = msgPOP.FindAllAttachments()
Dim myAttachment As Attachment = Nothing
For Each attachment As OpenPop.Mime.MessagePart In attachments
Dim sName As String = attachment.FileName
Dim sContentType As String = attachment.ContentType.MediaType
Dim stream As MemoryStream = New MemoryStream(attachment.Body)
myAttachment = New Attachment(stream, sName, sContentType)
msgSMTP.Attachments.Add(myAttachment)
Next
Return msgSMTP
End Function
Я потратил часы на изучение этой проблемы, и я еще не нашел ни одного решения. Я пытался изменить тип данных application на String и OpenPOP.MIME.MessagePart, но безрезультатно. Я попытался добавить "ToString" в переменную attachment и получил следующую ошибку:
System.InvalidCaseException: оператор «&» не определен для типа «MessagePart» и строки «.ToString».
Я читал о MIME, чтобы посмотреть, не предложит ли это какие-то идеи, хотя я не смог соединить точки. Я предполагаю, что это возможно, и надеюсь, что кто-то сможет поделиться решением, и я буду доволен либо VB.NET, либо C#.NET.
Заранее большое спасибо, и я ценю ваше время.
Attachment
из пространства имен System.Net.Mail? Это конструкторы для этого класса. Я не знаю, какого типа ваша переменная вложения, я не знаком сmsgPOP.FindAllAttachments()
- person mason   schedule 20.03.2020