def test_extract_meta_single(self): for email in self.reader.mbox: self.assertIsInstance(email["Subject"], (bytes, str)) emailmsg = extract_meta(email) self.assertIsInstance(emailmsg, EmailMeta) self.assertIsInstance(emailmsg.origin_domain, str) self.assertIsInstance(emailmsg.subject, str)
def test_email_address(self): firstemail = next(self.emails) self.assertIsInstance(firstemail.sender, EmailAddress) self.assertIsInstance(firstemail.sender.name, str) self.assertIsInstance(firstemail.sender.email, str) mail = extract_meta(self.emailAdress) self.assertIsInstance(mail.recipients[0].name, str) self.assertIsInstance(mail.recipients[0].email, str)
def get_user_email(self): from emailnetwork.extract import extract_meta email_addresses = {} for i in range(10): email = self.reader.mbox[i] emailmsg = extract_meta(email) for recipient in emailmsg.recipients: email_addresses[recipient.email] = email_addresses.get( recipient.email, 0) + 1 email_addresses[emailmsg.sender.email] = email_addresses.get( emailmsg.sender.email, 0) + 1 return sorted(email_addresses.items(), key=lambda k: k[1], reverse=True)[0][0]
def plot_single_undirected(reader: MBoxReader, id: int = False, showtitle: bool = False) -> None: """ Plot an undirected social network graph from a single email, as determined by `id`. If `showtitle` is `True`, render the plot with a email subject and date as title. Usage: reader = MboxReader('path-to-mbox.mbox') plot_single_undirected(reader, 300) plots the 300th email from the mbox Args: reader (MBoxReader): A `MBoxReader` object id (int, optional): `id` of the email in the `MBoxReader`. Defaults to False. showtitle (bool, optional): If `True`, render the plot with a email subject and date as title. Defaults to False. """ len_reader = len(reader) if not id: email = reader.mbox[len_reader - 1] else: email = reader.mbox[id] emailmsg = extract_meta(email) subject = textwrap.fill(emailmsg.subject, 40) ng = PeopleCombination(emailmsg) G = nx.Graph(name='Single Email Social Network') counter = Counter() for combo in ng.combo: counter[combo] += 1 total_combos = sum(counter.values()) by_freq = {k: v / total_combos for k, v in counter.most_common()} for rel in counter.keys(): G.add_edge(*rel, weight=by_freq[rel], count=counter[rel]) k = 1 / math.sqrt(G.order()) * 2 pos = nx.spring_layout(G, k=k) deg = [v for _, v in G.degree()] # nx.draw_networkx_nodes(G, pos, node_size=deg, linewidths=1.0, alpha=0.90, label=G._node.keys()) nx.draw_networkx_nodes(G, pos, node_size=deg, linewidths=1.0, alpha=0.90) nx.draw_networkx_edges(G, pos, edge_color="steelblue", width=1.0, style='dashed', alpha=0.75) nx.draw_networkx_labels(G, pos, {n: n for n in G.nodes}, font_size=8, verticalalignment="bottom") # nx.draw_networkx_labels(G, pos, {n: n for n in G.nodes if n.split('@')[-1] == 'supertype.ai'}, font_size=8) if showtitle: font = { "fontname": "Helvetica", "color": "k", "fontweight": "bold", "fontsize": 8 } plt.title(subject + '\n Delivery date: ' + emailmsg.date.strftime("%m/%d/%Y"), fontdict=font) plt.tight_layout(pad=0.5) plt.axis('off') plt.show()
def plot_single_directed(reader: MBoxReader, id: int = False, showtitle: bool = False) -> None: """ Plot a directed graph from a single email, as determined by `id`. If `showtitle` is `True`, render the plot with a email subject and date as title. Usage: reader = MboxReader('path-to-mbox.mbox') plot_single_directed(reader, 300) plots the 300th email from the mbox Args: reader (MBoxReader): A `MBoxReader` object id (int, optional): `id` of the email in the `MBoxReader`. Defaults to False. showtitle (bool, optional): If `True`, render the plot with a email subject and date as title. Defaults to False. """ len_reader = len(reader) if not id: email = reader.mbox[len_reader - 1] else: email = reader.mbox[id] emailmsg = extract_meta(email) subject = textwrap.fill(emailmsg.subject, 40) sender = emailmsg.sender.name if len( emailmsg.sender.name) != 0 else emailmsg.sender.email.split('@')[0] plt.figure(figsize=(9, 6)) G = nx.DiGraph(name='Single Email Flow') for recipient in emailmsg.recipients: rec = recipient.name G.add_edge(sender, rec if len(rec) != 0 else recipient.email, message=subject, color='darkorchid', weight=3) for cc in emailmsg.cc: ccc = cc.name G.add_edge(sender, ccc if len(ccc) != 0 else cc.email, message='cc', color='lightsteelblue', weight=2) colors = nx.get_edge_attributes(G, 'color').values() weights = nx.get_edge_attributes(G, 'weight').values() edge_labels = nx.get_edge_attributes(G, 'message') pos = nx.planar_layout(G) # nx.draw_spectral(G,node_size=0, alpha=0.8, edge_color=colors, width=list(weights), font_size=8, with_labels=True) nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_size=6, label_pos=0.5) nx.draw_planar(G, node_size=0, alpha=1, edge_color=colors, width=list(weights), font_size=8, font_weight='bold', with_labels=True, verticalalignment='bottom') if showtitle: font = { "fontname": "Helvetica", "color": "k", "fontweight": "bold", "fontsize": 8 } plt.title(subject + '\n Delivery date: ' + emailmsg.date.strftime("%m/%d/%Y"), fontdict=font) plt.tight_layout(pad=0.5) plt.axis('off') plt.show()