Пересылка вложений OpenPOP на SMTP (System.Net.Mail)

У меня есть приложение, которое я создал в 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.

Заранее большое спасибо, и я ценю ваше время.


person Michael Callas    schedule 18.03.2020    source источник
comment
Является ли класс Attachment из пространства имен System.Net.Mail? Это конструкторы для этого класса. Я не знаю, какого типа ваша переменная вложения, я не знаком с msgPOP.FindAllAttachments()   -  person mason    schedule 20.03.2020
comment
.FindAllAttachments — это метод OpenPop для разбора вложений из сообщения. И да, класс Attachment принадлежит пространству имен System.Net.Mail.   -  person Michael Callas    schedule 20.03.2020
comment
Верно, но я не знаю, какой тип возвращается. Дело в том, что вам нужно найти способ преобразовать его в System.Net.Mail.Attachment.   -  person mason    schedule 20.03.2020


Ответы (1)


Решение находится в отредактированной функции AddAttachments в моем исходном сообщении выше.

person Michael Callas    schedule 30.03.2020