адрес электронной почты не отображается правильно при импорте .pst в MySQL с использованием C # - PullRequest
0 голосов
/ 09 декабря 2018

Я использую приведенный ниже код для экспорта монтированного в Outlook PST-файла, называемого работающим, в локальную базу данных MySQL, по большей части код работает нормально, однако некоторые «Sender_Email» и «Received_Email» отображаются в их формате EX, напримерниже

/ o = ExchangeLabs / ou = Административная группа Exchange (FYDIBOPDLT) /cn=Recipients/cn=ed403ae50a4581-a.john

это сводит меня с ума! адрес электронной почты должен быть.john @ domain.com, а не этот неудобный формат, другие электронные письма выглядят нормально с @domain и т. д., только некоторые из них имеют этот неудобный формат - кто-нибудь знает, что мне нужно отредактировать, чтобы этот код работал правильно? Я включил весь кодниже, так как я новичок, и этот код написан не мной полностью, поэтому я буду очень признателен за любые советы, которые вы мне можете дать.

using Microsoft.Office.Interop.Outlook;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;
using System.Configuration;

namespace ConsoleApp3
{
class Program
{
    static void Main(string[] args)
    {
        try
        {
            var myconn = new MySqlConnection
            ("server = 0.0.0.0;" +
            "user = user;" +
            "database = sys;" +
            "port = 0000;" +
            "password = password;" +
            "Connect Timeout=1;");

            myconn.Open();

            List<MailItem> mailItems = readPst(@"C:\Users\john\Desktop\working.pst", "working");
            int counter = 0;
            int totalMailItemCount = mailItems.Count();
            for (int i = 0; i < mailItems.Count(); ++i)// MailItem mailItem in mailItems)
            {
                var dateTimeSentToInsert = mailItems[i].SentOn.ToString("yyyy-MM-dd H:mm:ss");
                var dateTimeReceivedToInsert = mailItems[i].ReceivedTime.ToString("yyyy-MM-dd H:mm:ss");
                var recipients = "";
                foreach (Recipient recipient in mailItems[i].Recipients)
                {
                    recipients += recipient.Address + "~";
                }

                MySqlCommand command = myconn.CreateCommand();
                command.CommandText = "INSERT INTO mail2 (Sender_Name, Sender_Email, Received_Name, Received_Email, Date_Sent, Date_Received, Subject, Body" +
                    ") VALUES (@sender_name, @sender_email, @received_name, @received_email, @date_sent, @date_received, @subject, @body)";
                command.Parameters.AddWithValue("@sender_name", mailItems[i].SenderName);
                command.Parameters.AddWithValue("@sender_email", mailItems[i].SenderEmailAddress);
                command.Parameters.AddWithValue("@received_name", mailItems[i].ReceivedByName);
                command.Parameters.AddWithValue("@received_email", recipients);
                command.Parameters.AddWithValue("@date_sent", dateTimeSentToInsert);
                command.Parameters.AddWithValue("@date_received", dateTimeReceivedToInsert);
                command.Parameters.AddWithValue("@subject", mailItems[i].Subject);
                command.Parameters.AddWithValue("@body", mailItems[i].Body);
                command.ExecuteNonQuery();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(mailItems[i]);

                Console.WriteLine(++counter + " completed out of " + totalMailItemCount);
            }

            myconn.Dispose();
        }
        catch (System.Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        Console.ReadLine();
    }

    private static List<MailItem> readPst(string pstFilePath, string pstName)
    {
        List<MailItem> mailItems = new List<MailItem>();
        Application app = new Application();
        NameSpace outlookNs = app.GetNamespace("MAPI");
        // Add PST file (Outlook Data File) to Default Profile
        MAPIFolder rootFolder = outlookNs.Stores[pstName].GetRootFolder();
        // Traverse through all folders in the PST file
        // TODO: This is not recursive, refactor
        Folders subFolders = rootFolder.Folders;
        foreach (Folder folder in subFolders)
        {
            Items items = folder.Items;
            foreach (object item in items)
            {
                if (item is MailItem)
                {
                    MailItem mailItem = item as MailItem;
                    mailItems.Add(mailItem);
                }
            }
        }
        // Remove PST file from Default Profile
        //outlookNs.RemoveStore(rootFolder);
        return mailItems;
    }
}

}

1 Ответ

0 голосов
/ 12 декабря 2018

Это совершенно правильный адрес типа EX (в отличие от SMTP).Вы можете проверить тип адреса электронной почты отправителя, используя свойство MailItem.SenderEmailType.Если это SMTP, просто используйте M ailItem.SenderEmailAddress.Если нет, используйте свойство MailItem.Sender.GetExchangeUser.PrimarySmtpAddress (будьте готовы обрабатывать ошибки и / или нули).GetExchangeUser будет работать только в том случае, если в текущем профиле Outlook присутствует исходный пользователь Exchange, на котором размещен данный пользователь GAL.Это не будет работать, если у вас есть только файл PST в профиле.Скорее всего, PidTagSenderSmtpAddress_W свойство MAPI (имя DASL http://schemas.microsoft.com/mapi/proptag/0x5D01001F) доступно для сообщения - вы можете получить к нему доступ с помощью MailItem.PropertyAccessor.GetProperty - взгляните на сообщение с помощью OutlookSpy (нажмите кнопку IMessage), чтобы проверитьесли свойство действительно есть

...