所以我知道如何发送带附件的电子邮件......这很简单。
现在的问题是我需要将一个MailMessage添加到另一个MailMessage中,该MailMessage具有自己的附件。这将允许用户查看内容并获取预先制作的电子邮件,并在一切正常时发送。
我不确定这将是最后的工作流程,但我想知道是否容易。
我看到一堆软件用于赚钱,收到这些电子邮件的用户将使用Outlook客户端。
这将部署到廉价的共享托管解决方案,必须能够在Meduim Trust中运行!
我宁愿不必使用第三方软件,No $ :(
任何想法都会很棒。
答案 0 :(得分:1)
MailMessages无法附加到其他MailMessages。你要做的是创建一个.msg文件,它基本上是一个存储电子邮件及其所有附件的文件,并将其附加到你的实际MailMessage。 Outlook支持MSG文件。
有关文件扩展名的更多信息,请访问:http://www.fileformat.info/format/outlookmsg/
答案 1 :(得分:0)
正如贾斯汀所说,没有办法在API中将一个MailMessage附加到另一个。我使用SmtpClient来解决这个问题,将我的内部消息“传递”到一个目录,然后将生成的文件附加到我的外部消息中。这个解决方案不是非常吸引人,因为它必须使用文件系统,但它确实完成了工作。如果SmtpDeliveryMethod有一个Stream选项会更清晰。
有一点需要注意,SmtpClient在创建消息文件时为SMTP信封信息添加了X-Sender / X-Receiver标头。如果这是一个问题,您必须在附加之前将它们从消息文件的顶部剥离。
// message to be attached
MailMessage attachedMessage = new MailMessage("bob@example.com"
, "carol@example.com", "Attached Message Subject"
, "Attached Message Body");
// message to send
MailMessage sendingMessage = new MailMessage();
sendingMessage.From = new MailAddress("ted@example.com", "Ted");
sendingMessage.To.Add(new MailAddress("alice@example.com", "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();