Dateinamen für gespeicherte EML-Datei

  • VB.NET
  • .NET (FX) 4.0

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von so27.

    Dateinamen für gespeicherte EML-Datei

    Hallo zusammen,

    ich hoffe, ich bin hier richtig mit meiner Frage. Ich habe ein Problem beim Speichern einer E-Mail resp. eine E-Mail zu speichern ist nicht das Problem, das funktioniert über den nachfolgenden Code:

    VB.NET-Quellcode

    1. Dim SmtpServer As New SmtpClient("smtp.exampledomain.com", 25)
    2. Dim mails As New MailMessage("user@exmple.com", "someuser", "TEST email", _
    3. "Sample Message")
    4. SmtpServer.Credentials = New Net.NetworkCredential(user@exmple.com, "password")
    5. SmtpServer.Send(mails)


    Allerdings wird diese Mail dann als folgende Datei gespeichert:
    a3319e98-0618-430b-ae93-84a637c107db.eml

    Es scheint, als würde die E-Mail-ID als Dateiname verwendet werden. Wie kann ich diese Mail direkt als bsp: meine@mail.de.eml speichern?

    Umbenennen der Datei würde auch gehen, allerdings müsste ich dann wissen, wie ich mir beim Speichern schon die ID anzeigen lasse, da ich ansonsten die Datei nicht wiedererkennen kann.

    LG, so27

    so27 schrieb:

    Es scheint, als würde die E-Mail-ID als Dateiname verwendet werden.
    Wo wird die Datei gespeichert?
    Im SMTP-Server?
    Da hast du wohl keinen Einfluss drauf, wie der das speichert, zumindest nicht seitens des Client.
    Der Server wird als Dateinamen wohl eine GUID o.ä. verwenden.

    Edit:
    Du kannst vielleicht mal SendAsync versuchen und im Eventhandler prüfen, ob du mehr Informationen vom Server zurück bekommst.
    Aber ich habe da wenig Hoffnung.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Also die Datei wird wie folgt geschrieben:

    VB.NET-Quellcode

    1. Dim smtp As New SmtpClient(My.Settings.MailSMTP)
    2. smtp.Port = My.Settings.MailPort '25 '587
    3. smtp.EnableSsl = My.Settings.MailSSL 'False
    4. smtp.UseDefaultCredentials = False
    5. Passwort = KeyOff(My.Settings.MailPasswort) ' Entschlüsseln des Passworts
    6. smtp.Credentials = New System.Net.NetworkCredential(My.Settings.MailBenutzer, Passwort)
    7. smtp.Send(MyEmail) ' erst senden, dann speichern
    8. ' speichern
    9. smtp.EnableSsl = False
    10. smtp.DeliveryMethod = Net.Mail.SmtpDeliveryMethod.SpecifiedPickupDirectory
    11. 'Ausgabepfad
    12. smtp.PickupDirectoryLocation = Application.StartupPath & "\gesendet"
    13. smtp.Send(MyEmail) ' speichern
    Schau mal hier:
    http://www.codeproject.com/Articles/32434/Adding-Save-functionality-to-Microsoft-Net-Mail-Ma

    Alternativ kannst du auch die Datei nach dem Speichern umbenennen. Ist vll etwas simpler.
    Erstelle dazu einfach in Application.StartupPath & "\gesendet" SubOrdner mit zB einem exakten Timestamp oder Guid.NewGuid
    und setze dies als PickUpDirectoryLocation. Dort befindet sich dann definitiv nur die Mail. Die kannst verschieben und umbenennen und danach den Temp Ordner löschen..
    LG
    Das ist meine Signatur und sie wird wunderbar sein!
    OK.
    Du verschickst die Mail zunächst an einen SMTP-Server.

    Dann verschickst du sie ein zweites Mal mittels SmtpDeliveryMethod.SpecifiedPickupDirectory
    Dieses Verfahren ist üblicherweise dazu da, um einem lokalen SMTP-Server ein Abholverzeichnis zu bestücken.
    Da dieser lokale Server nicht existiert, wird dieses Verzeichnis nie geleert und ist so etwas wie ein Backup-Verzeichnis deiner Mails.
    So ein SMTP-Server interessiert sich nicht für Dateinamen und verschickt einfach alles was in dem Verzeichnis steht. Deshalb kannst du dort keine Dateinamen angeben.

    Das einzige, was du machen könntest, ist das (Unter-)Verzeichnis bei jedem Mail-Durchlauf entsprechend anders zu nennen und so quasi für jedes EML-File ein eigenes Verzeichnis zu haben.

    Eine andere Möglichkeit ist, eine Save-Extension selbst zu schreiben, in etwa so:
    http://www.codeproject.com/KB/IP/smtpclientext.aspx?msg=2876398

    Edit: Da hatte Mono wohl schon ähnliche Ideen ;)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()