示例#1
0
 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)
示例#2
0
    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)
示例#3
0
    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]
示例#4
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()
示例#5
0
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()