Прикрепить письмо с вложениями к другому письму

Итак, я знаю, как отправлять электронные письма с вложениями... это просто.

Теперь проблема в том, что мне нужно добавить 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 без сторонних платных dll? - 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