Импорт электронной почты из почтового ящика AD - PullRequest
9 голосов
/ 02 апреля 2012

У нас есть старый устаревший сервер SQL 2000 (последний в ферме). Нам не удалось избавиться от этого сервера, так как он использует xp_findnextmsg, xp_readmail и т. Д. Для мониторинга почтового ящика (через mapi) и импортировать всю электронную почту на этот адрес в базу данных. База данных содержит простые таблицы, в которых хранятся «от», «до», «тема», «тело», «дата отправки» и т. Д.

Как вы, возможно, знаете, вышеупомянутые процедуры больше не используются в SQL 2005 +

Эта таблица считывается из десятков внутренних систем, например, электронные письма на этот почтовый ящик могут автоматически приниматься нашими системами поддержки и создавать звонки и т. Д.

У меня такой вопрос: какой самый простой / современный способ сделать это в SQL 2008+? Это будет случай написания двоичного файла / сервиса .net, который будет использовать smtp или что-то еще для подключения к почтовому ящику и вставки данных в SQL, или есть более простой способ сделать это? (SSIS / сторонние инструменты / существующий код / ​​проекты?)

Просто подумал, что я спрошу, прежде чем начать что-то писать - нет смысла заново изобретать колесо, как оно было.

PS: рассматриваемый почтовый ящик является почтовым ящиком Exchange 2010.

Редактировать: Эта функция была подсказана для повторного введения в 2008 г. & dbmail: http://connect.microsoft.com/SQLServer/feedback/details/126167/xp-readmail-replacement-for-sql-2005, но похоже, что она не осуществилась!

Редактировать 2 : Я только что нашел приличный пример кода, который использует новые веб-сервисы в Exchange 2007+: http://social.msdn.microsoft.com/forums/en-US/sqltools/thread/dd2b465b-b1d2-4c0d-82ec-c36c6c482d5d - экспериментирование продолжается (кто-нибудь когда-либо работал с SQL а веб-сервисы Exchange?)

Редактировать 3 : Все готово! Я запустил службу .net, которая находится на нашем сервере Exchange и контролирует почтовый ящик, и помещает любую новую почту в SQL. В случае, если у других есть аналогичный вопрос, и для начала нужен некоторый пример кода - вот примерный код (вырезанный из моей службы - замененный параметризованный SQL базовым динамическим SQL для легкого чтения): (Примечание: вам понадобится EWS API 1.1 длл)

Imports Microsoft.Exchange.WebServices.Data

Dim ExchangeUrl As String = "https://DOMAIN.co.uk/ews/exchange.asmx"
Dim service As New ExchangeService(ExchangeVersion.Exchange2010_SP1)
service.Url = New Uri(ExchangeUrl)
service.Credentials = New WebCredentials("USER@DOMAIN.CO.UK", "PASSWORD")
Dim findResults As FindItemsResults(Of Item) = service.FindItems(WellKnownFolderName.Inbox, New ItemView(1000))
If findResults.Count > 0 Then
    service.LoadPropertiesForItems(findResults.Items, New PropertySet(BasePropertySet.FirstClassProperties))
End If

For Each item As Item In findResults.Items
    Dim CurrentEmail As EmailMessage = item

    '#### Grab Email Information
    E_ID = CurrentEmail.InternetMessageId.ToString()
    If CurrentEmail.Sender.Address.ToString() <> "" Then
        E_From = Replace(CurrentEmail.Sender.Address, "'", "''")
    Else
        E_From = Replace(CurrentEmail.Sender.Name, "'", "''")
    End If
    E_From = Replace(CurrentEmail.Sender.Address, "'", "''")
    E_To = Replace(CurrentEmail.DisplayTo, "'", "''")
    E_CC = Replace(CurrentEmail.DisplayCc, "'", "''")
    E_Subject = Replace(CurrentEmail.Subject, "'", "''")
    E_Body = Replace(CurrentEmail.Body.Text, "'", "''")
    E_Received = CurrentEmail.DateTimeReceived.ToString("dd/MM/yyyy HH:mm:ss")
    E_Sent = CurrentEmail.DateTimeSent.ToString("dd/MM/yyyy HH:mm:ss")

    '#### Save the email into SQL
    If SqlQuery("INSERT INTO tbl_Emails ([MessageID], [From], [To], [CC], [Subject], [Body], [Received], [Sent]) VALUES ('" & E_ID & "', '" & E_From & "', '" & E_To & "', '" & E_CC & "', '" & E_Subject & "', '" & E_Body & "', CONVERT(DATETIME, '" & E_Received & "', 103), CONVERT(DATETIME, '" & E_Sent & "', 103))") = True Then
        item.Delete(DeleteMode.HardDelete)
    End If
Next

1 Ответ

3 голосов
/ 02 апреля 2012

Первое, что приходит мне в голову, это SQL CLR. MAPI специально не поддерживается в .net (по крайней мере, насколько мне известно), хотя есть обходные пути . К счастью, чтение из почтового ящика обмена поддерживается в хосте из ситуаций .

Кстати, я обнаружил, что работа с электронной почтой в .net относительно безболезненна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...