将电子邮件保存到磁盘 [英] Saving Email Message to disk
本文介绍了将电子邮件保存到磁盘的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
关于本文:向系统添加Save()功能.Net.Mail.MailMessage [ ^ ]
我发现有人已将此转换为VB所以我复制了它:
Regarding this article: Adding Save() functionality to System.Net.Mail.MailMessage[^]
I found someone had already converted this to VB so I copied it:
Public Shared Sub WriteEmailMessageToFile(Message As MailMessage, FileName As String)
Dim assembly As Assembly = GetType(SmtpClient).Assembly
Dim _mailWriterType As Type = assembly.[GetType]("System.Net.Mail.MailWriter")
Using _fileStream As New FileStream(FileName, FileMode.Create)
' Get reflection info for MailWriter contructor
Dim _mailWriterContructor As ConstructorInfo = _mailWriterType.GetConstructor(BindingFlags.Instance Or BindingFlags.NonPublic, Nothing, New Type() {GetType(Stream)}, Nothing)
' Construct MailWriter object with our FileStream
Dim _mailWriter As Object = _mailWriterContructor.Invoke(New Object() {_fileStream})
' Get reflection info for Send() method on MailMessage
Dim _sendMethod As MethodInfo = GetType(MailMessage).GetMethod("Send", BindingFlags.Instance Or BindingFlags.NonPublic)
' Call method passing in MailWriter
_sendMethod.Invoke(Message, BindingFlags.Instance Or BindingFlags.NonPublic, Nothing, New Object() {_mailWriter, True}, Nothing)
' Finally get reflection info for Close() method on our MailWriter
Dim _closeMethod As MethodInfo = _mailWriter.[GetType]().GetMethod("Close", BindingFlags.Instance Or BindingFlags.NonPublic)
' Call close method
_closeMethod.Invoke(_mailWriter, BindingFlags.Instance Or BindingFlags.NonPublic, Nothing, New Object() {}, Nothing)
End Using
End Sub
当我执行时,它挂起就行:
When I execute, it hangs on the line:
_sendMethod.Invoke(Message, BindingFlags.Instance Or BindingFlags.NonPublic, Nothing, New Object() {_mailWriter, True}, Nothing)
请帮我确定这行代码有什么问题。
Please help me determine what is wrong with this line of code.
推荐答案
请看我对这个问题的评论。避免做这样的事情。
我可以建议你使用另一种方法:使用与发送邮件相同的方法将邮件保存到文件:System.Net.Mail.SmptClient.Send
为此,您可以使用System.Net.Mail.SmptClient的实例
并修改其实例的两个属性:将DeliveryMethod
设置为SmtpDeliveryMethod.SpecifiedPickupDirectory
并设置PickupDirectoryLocation
到某个目录(以后可以重命名在那里创建的文件,因此它可以是一个临时目录)。您的SmptClient
实例将为您保存一条消息副本。
请参阅:
https://msdn.microsoft.com/en-us/library/ swas0fwc(v = vs.110).aspx [ ^ ],
https://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.deliverymethod(v = vs.110)的.aspx [ ^ ],
https://msdn.microsoft.com/en-us/library/system.net.mail.smtpdeliverymethod%28v=vs.110%29.aspx [< a href =https://msdn.microsoft.c om / en-us / library / system.net.mail.smtpdeliverymethod%28v = vs.110%29.aspxtarget =_ blanktitle =New Window> ^ ],
https:// msdn。 microsoft.com/en-us/library/system.net.mail.smtpclient.pickupdirectorylocation(v=vs.110).aspx [ ^ ]。
-SA
Please see my comment to the question. Avoid doing such things.
I can suggest you the alternative method I use: saving a mail message to file using the same method as sending it:System.Net.Mail.SmptClient.Send
To do so, you can use your instance ofSystem.Net.Mail.SmptClient
and modify two properties of its instance: setDeliveryMethod
toSmtpDeliveryMethod.SpecifiedPickupDirectory
and setPickupDirectoryLocation
to some directory (you can later rename the file created there, so it could be a temporary directory). YourSmptClient
instance will save a message copy for you.
Please see:
https://msdn.microsoft.com/en-us/library/swas0fwc(v=vs.110).aspx[^],
https://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.deliverymethod(v=vs.110).aspx[^],
https://msdn.microsoft.com/en-us/library/system.net.mail.smtpdeliverymethod%28v=vs.110%29.aspx[^],
https://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.pickupdirectorylocation(v=vs.110).aspx[^].
—SA
这篇关于将电子邮件保存到磁盘的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文