【问题标题】:Check if email attachment is password protected before sending发送前检查电子邮件附件是否受密码保护
【发布时间】:2017-11-15 17:06:50
【问题描述】:

我正在尝试在发送电子邮件之前检查我的所有附件,看看它们是否受密码保护。这些通常是 Word、Excel 或 PowerPoint 文件。

我看看有没有附件。

我不知道如何遍历邮件文件中的每个附件以查看每个附件是否受密码保护。

Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)

Dim attachments2 As Outlook.attachments
Dim attachm As Outlook.Attachment

If Item.attachments.Count > 0 Then

    Set attachments2 = Item.attachments

    Set attachm = Item.Attachment

    For Each attachm In attachments2

    ' ***IM GUESSING CODE TO CHECK IF ATTACHMENTS ARE PROTECTED WOULD GO IN HERE?***

    Next

End If

End Sub

【问题讨论】:

  • 请定义“受保护”...即对于 Word 文档,您的意思是“受密码保护”还是“受保护以供填写表格”或其他定义。然后,您需要确定需要检查的所有文件类型,因为每种文件可能需要不同的方法。
  • 抱歉 - 它们受密码保护,因此如果没有正确的密码,您将无法查看文件的内容。
  • 您的问题是否不仅仅是“查看密码是否受保护”?我可以理解您是否想要保护每个附件密码,或者想要确保没有一个密码受到保护,然后允许或阻止发送。文件是否有足够的密码保护,还是您需要知道密码?您的代码可以尝试打开每个文件,但需要更多信息。
  • 我只想要代码来检查电子邮件的附件,如果有 - 看看它们是否受密码保护,以及是否有任何不能标记电子邮件的警告即将发送并提供取消发送的选项。我不知道如何编写 VB 代码是如何检查每个附件以查看它们是否受密码保护,感谢您的帮助。
  • 我将提交一些关于如何检查密码的非常原始的代码作为答案。在现实生活中,我会调用该函数,传递路径和文件名,然后让它确定文件的类型以及是否有密码。你可以从你的模块中调用它。但是,我一直无法找到如何在您拥有代码的位置或用户附加文件时(我认为代码应该去的地方)获取文件的路径名。如果你能找到路径,那就太好了。可以添加其他文件类型来检查密码。

标签: vba outlook email-attachments


【解决方案1】:

下面的代码不能解决您的问题,但确实显示了如何检查文档和数据库以查看密码是否受保护。如果能够获取文件路径,则可以修改此代码以传递路径和文件名,然后返回一个标志以指示 PW 状态。或者只是修改此代码并将其嵌入到您的模块中。

修订版 1:与其尝试查找文件的路径来检查密码,另一种解决方案是让您的代码将文件保存到临时文件夹,然后在完成后删除。以下代码行将为您提供一个临时文件夹(即 C:\Users\MyName\AppData\Local\Temp)

strFolder = objFSO.GetSpecialFolder(2)

这个想法来自一个允许你重命名附件的帖子:http://www.flobee.net/rename-outlook-attachments-before-you-send-them/

此外,OP 需要考虑如何实施/执行密码检查。如果代码被称为“自动”,那么除非您有一些规则只检查某些文件,否则您的代码将始终检查所有电子邮件的所有附件!我怀疑这就是你想要发生的事情。也许是工具栏上的用户按钮?

原代码:

Option Compare Database
Option Explicit

Public Function Check_For_Passwords()
Dim objWord     As Word.Application
Dim objWordDoc  As Word.Document
Dim sPath       As String
Dim sFileName   As String
Dim oAccess     As Access.Application

    On Error GoTo Error_Trap

    ' Set the following string to the path of your Word Document
    sPath = "C:\data\WP\"                   ' <<< CHANGE THIS!!
    sFileName = "Access.doc"                ' <<< CHANGE THIS!!
    Set objWord = CreateObject("Word.Application")
    objWord.Visible = False
    ' Use a fake password - if no password on doc, OK; If password protected will fail
    Set objWordDoc = objWord.Documents.Open(sPath & sFileName, , True, , "*****")
    'Err: 5408    The password is incorrect. Word cannot open the document.

    Set oAccess = CreateObject("Access.Application")
    oAccess.Visible = False
    sPath = "C:\data\Access\"                   ' <<< CHANGE THIS!!
    sFileName = "PWD_DB.mdb"                    ' <<< CHANGE THIS!!

    'If error, then database has password
    oAccess.DBEngine.OpenDatabase sPath & sFileName, False
    'Err: 3031    Not a valid password.

    Exit Function

Error_Trap:
    If Err.Number = 5408 Then
        MsgBox "Document has a password! Do whatever...  " & sPath & sFileName
    ElseIf Err.Number = 3031 Then
        MsgBox "Access DB has a password! Do whatever...  " & sPath & sFileName
    Else
        MsgBox "Unexpected error: " * Err.Number & vbTab & Err.Description
    End If
End Function

【讨论】:

  • 对于找到此答案的未来搜索者。我建议您将附件保存在指定的文件夹中,以便您知道路径。根据文件扩展名打开应用程序,然后在完成密码检查后终止临时保存的文件。
  • @niton,我喜欢您的想法,因此进行了更多搜索,发现了您建议的变体。它涉及将附件保存到您的临时文件夹,完成后删除。由于没有进行任何更改,因此可以正常工作。我在上面的答案中添加了更多信息。谢谢!
猜你喜欢
  • 2015-08-24
  • 2013-02-05
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多