Прикачете имейл с прикачени файлове към друг имейл

Така че знам как да изпращам имейли с прикачени файлове... това е лесно.

Проблемът сега е, че трябва да добавя MailMessage, което има собствен прикачен файл, към различно MailMessage. Това ще позволи на потребителя да прегледа нещата и да вземе имейла, който е предварително направен, и да го изпрати, ако всичко е наред.

Не съм сигурен, че това ще бъде окончателният работен поток, но бих искал да знам дали е лесен.

Виждам куп софтуер там, който е за пари, потребителите, които получават тези имейли, ще използват Outlook клиент.

Това ще бъде внедрено в евтини споделени хостинг решения, трябва да може да работи в Meduim Trust!

Бих предпочел да не се налага да използвам софтуер на трета страна, не $ :(

Всякакви идеи биха били страхотни.


person BigBlondeViking    schedule 25.04.2011    source източник


Отговори (2)


MailMessages не могат да се прикачват към други MailMessages. Това, което ще направите, е да създадете .msg файл, който всъщност е файл, който съхранява имейл и всичките му прикачени файлове, и да го прикачите към вашето действително MailMessage. MSG файловете се поддържат от Outlook.

За повече информация относно файловото разширение отидете тук: http://www.fileformat.info/format/outlookmsg/

person Devin Burke    schedule 25.04.2011
comment
Да, но как да запазя .msg без платени dlls от трета страна? - person BigBlondeViking; 25.04.2011
comment
Ако погледнете връзката, която включих, сайтът описва целия формат на файла. Можете сами да създадете .msg файла с вашето приложение. - person Devin Burke; 27.04.2011

Както каза Джъстин, в API няма възможност за прикачване на едно MailMessage към друго. Заобиколих това с помощта на SmtpClient, за да „доставя“ вътрешното си съобщение в директория и след това прикачих получения файл към външното си съобщение. Това решение не е много привлекателно, тъй като трябва да използва файловата система, но върши работата. Би било много по-чисто, ако SmtpDeliveryMethod имаше опция Stream.

Едно нещо, което трябва да се отбележи, SmtpClient добавя заглавки X-Sender/X-Receiver за информацията в SMTP плика, когато създава файла със съобщения. Ако това е проблем, ще трябва да ги премахнете от горната част на файла със съобщението, преди да го прикачите.

// message to be attached
MailMessage attachedMessage = new MailMessage("[email protected]"
    , "[email protected]", "Attached Message Subject"
    , "Attached Message Body");

// message to send
MailMessage sendingMessage = new MailMessage();
sendingMessage.From = new MailAddress("[email protected]", "Ted");
sendingMessage.To.Add(new MailAddress("[email protected]", "Alice"));
sendingMessage.Subject = "Attached Message: " + attachedMessage.Subject;
sendingMessage.Body = "This message has a message attached.";

// find a temporary directory path that doesn't exist
string tempDirPath = null;
do {
    tempDirPath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
} while(Directory.Exists(tempDirPath));
// create temp dir
DirectoryInfo tempDir = Directory.CreateDirectory(tempDirPath);

// use an SmptClient to deliver the message to the temp dir
using(SmtpClient attachmentClient = new SmtpClient("localhost")) {
    attachmentClient.DeliveryMethod
        = SmtpDeliveryMethod.SpecifiedPickupDirectory;
    attachmentClient.PickupDirectoryLocation = tempDirPath;
    attachmentClient.Send(attachedMessage);
}

tempDir.Refresh();
// load the created file into a stream
FileInfo mailFile = tempDir.GetFiles().Single();
using(FileStream mailStream = mailFile.OpenRead()) {
    // create/add an attachment from the stream
    sendingMessage.Attachments.Add(new Attachment(mailStream
        , Regex.Replace(attachedMessage.Subject
            , "[^a-zA-Z0-9 _.-]+", "") + ".eml"
        , "message/rfc822"));

    // send the message
    using(SmtpClient smtp = new SmtpClient("smtp.example.com")) {
        smtp.Send(sendingMessage);
    }
    mailStream.Close();
}

// clean up temp
mailFile.Delete();
tempDir.Delete();
person Blake Mitchell    schedule 04.11.2011