我目前正在开发一个Python项目,该项目将连接到电子邮件服务器并查看最新的电子邮件,以告知用户电子邮件中是否嵌入了附件或链接。我有前者而不是后者。
我可能在我的脚本的if any()部分遇到麻烦。因为我测试的时候似乎有一半工作。虽然可能是由于电子邮件字符串的打印方式?
这是我的代码,用于连接到gmail,然后查找链接。
import imaplib
import email
word = ["http://", "https://", "www.", ".com", ".co.uk"] #list of strings to search for in email body
#connection to the email server
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('[email protected]', 'password')
mail.list()
# Out: list of "folders" aka labels in gmail.
mail.select("Inbox", readonly=True) # connect to inbox.
result, data = mail.uid('search', None, "ALL") # search and return uids instead
ids = data[0] # data is a list.
id_list = ids.split() # ids is a space separated string
latest_email_uid = data[0].split()[-1]
result, data = mail.uid('fetch', latest_email_uid, '(RFC822)') # fetch the email headers and body (RFC822) for the given ID
raw_email = data[0][1] # here's the body, which is raw headers and html and body of the whole email
# including headers and alternate payloads
print "---------------------------------------------------------"
print "Are there links in the email?"
print "---------------------------------------------------------"
msg = email.message_from_string(raw_email)
for part in msg.walk():
# each part is a either non-multipart, or another multipart message
# that contains further parts... Message is organized like a tree
if part.get_content_type() == 'text/plain':
plain_text = part.get_payload()
print plain_text # prints the raw text
if any(word in plain_text for word in word):
print '****'
print 'found link in email body'
print '****'
else:
print '****'
print 'no link in email body'
print '****'
所以基本上你可以看到我有一个名为'Word'的变量,其中包含要在纯文本电子邮件中搜索的关键字数组。
当我发送带有“http://”或“https://”格式的嵌入式链接的测试电子邮件时,电子邮件会打印出电子邮件正文,其中包含文本中的链接,如下所示 -
---------------------------------------------------------
Are there links in the email?
---------------------------------------------------------
Test Link <http://www.google.com/>
****
found link in email body
****
我得到了我的打印消息,说“在电子邮件正文中找到了链接” - 这是我在测试阶段寻找的结果,但这将导致在最终程序中发生的其他事情。
然而,如果我在电子邮件中添加一个没有http://的嵌入式链接,例如google.com,那么即使我有嵌入式链接,链接也不会打印出来并且我没有得到结果。
是否有一个原因?我也怀疑也许我的if if()循环并不是最好的。我最初添加它时并没有真正理解它,但它适用于http://链接。然后我尝试了一个.com并得到了我的问题,我找不到解决方案。
要检查是否有电子邮件的附件,您可以在标题中搜索Content-Type,看看它是否显示为"multipart/*"
。具有多部分内容类型的电子邮件可能包含附件。
要检查链接,图像等文本,您可以尝试使用Regular Expressions。事实上,在我看来,这可能是你最好的选择。使用正则表达式(或正则表达式),您可以找到与给定模式匹配的字符串。例如,模式"<a[^>]+href=\"(.*?)\"[^>]*>(.*)?</a>"
应匹配电子邮件中的所有链接,无论它们是单个单词还是完整URL。我希望有所帮助!以下是如何在Python中实现此功能的示例:
import re
text = "This is your e-mail body. It contains a link to <a
href='http//www.google.com'>Google</a>."
link_pattern = re.compile('<a[^>]+href=\'(.*?)\'[^>]*>(.*)?</a>')
search = link_pattern.search(text)
if search is not None:
print("Link found! -> " + search.group(0))
else:
print("No links were found.")
对于“最终用户”,链接将显示为“Google”,没有www和更少的http ... s ...但是,源代码将包含html,因此通过检查消息的原始主体你可以找到所有链接。
我的代码并不完美,但我希望它能为您提供一个大方向...您可以在电子邮件正文中查找多个模式,图像出现,视频等。要学习正则表达式,您需要进行研究一点点,这是另一个link, to Wikipedia