iT邦幫忙

1

利用C# 快速建立 outlook 聯絡人群組、聯絡人,指令碼卡關求解

  • 分享至 

  • xImage

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Net.Mime.MediaTypeNames;
using Microsoft.Office.Interop.Outlook;
using Microsoft.Office.Interop.Excel;
using System.Diagnostics;
using Outlook = Microsoft.Office.Interop.Outlook;

namespace Outlook_建立聯絡人
{
internal class Program
{
static void Main(string[] args)
{

        var groupName = "TEST3";
        var outlookApp = new Microsoft.Office.Interop.Outlook.Application();
        var processes = System.Diagnostics.Process.GetProcessesByName("OUTLOOK");
        if (processes.Length > 0)
        {
            // Outlook 已經在運行
            // 獲取 Outlook 物件
            outlookApp = (Microsoft.Office.Interop.Outlook.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Outlook.Application");
        }
        else
        {
            // Outlook 沒有在運行
            // 創建 Outlook 物件
            outlookApp = new Microsoft.Office.Interop.Outlook.Application();
        }

        // 獲取通訊錄
        var addressBook = outlookApp.Session.GetDefaultFolder(OlDefaultFolders.olFolderContacts);


        // 創建聯繫人群組
        var group = outlookApp.CreateItem(OlItemType.olDistributionListItem);
        group.Subject = groupName;






        // // 添加聯繫人
        group.AddMember("john.smith2@example.com");
        //group.AddMember("john.smith3@example.com");
        //// //group.AddMember(member3);

        // 保存群組
        group.Save();
        System.Runtime.InteropServices.Marshal.ReleaseComObject(group);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(outlookApp);
      


    }
}

}

這串代碼目前一直卡在 "添加聯繫人"那段,它一直跳出以下例外狀況
System.ArgumentException: '無法將呼叫的引數 0 轉換成 AddMember。'
這MAIL是範例,我有嘗試使用真正存在的MAIL也是失敗,把MAIL先建立在我的聯絡人裡也是失敗,不知道問題到底是卡在哪?

PS 我的OFFICE是 2010

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

2
re.Zero
iT邦研究生 5 級 ‧ 2022-12-26 02:41:15
  • Create a distribution list 內,
    有提到 "You must pass a resolved Recipient object as a parameter to the AddMember(Recipient) method of the DistListItem object. To resolve a Recipient object, use the Resolve() method."。
  • 加上,在 Display a shared calendar of a recipient 內,
    關於 "... create a Recipient object by using the CreateRecipient method ..." 指出的資訊。

綜合上述兩點,感覺你應該這樣用:

// 添加聯繫人:
Outlook.Recipient recip = Application.Session.CreateRecipient("john.smith2@example.com");
recip.Resolve(); //Resolve the Recipient before calling AddMember
group.AddMember(recip);
7
japhenchen
iT邦超人 1 級 ‧ 2022-12-26 09:20:51

請先加到服務參考

using Outlook = Microsoft.Office.Interop.Outlook;
private static void 新增連絡人(string 工號, string 部門, string 姓名, string 郵箱)
{
    Outlook.Application outlookApp = new Outlook.Application();
    Outlook.NameSpace outlookNS = outlookApp.GetNamespace("MAPI");
    try
    {
        Outlook.ContactItem newContact = (Outlook.ContactItem)
                outlookApp.CreateItem(Outlook.OlItemType.olContactItem);
        newContact.LastName = $"{姓名}";
        newContact.FirstName = $"{工號}";
        newContact.Email1Address = $"{姓名}{工號} ({郵箱})";
        newContact.Email1DisplayName = $"{姓名}{工號} {郵箱}";
        newContact.CompanyName = "XX公司";
        newContact.Department = 部門;
        newContact.FileAs = $"{姓名}{工號}@XX公司";
        newContact.Account = $"{姓名}{工號}@XX公司";
        newContact.Save();
    }
    catch
    {
        Console.WriteLine("錯誤: 這個連絡人[{0}]無法新增(可能存在)", 姓名);
    }
}

看更多先前的回應...收起先前的回應...

我把上段程式跟資料庫(用API下載資料所以沒1433的問題)綁在一起,寫成CONSOLE,安裝後自動掛在所有人Windows上的工作排程裡,每天中午自動執行(沒人閒到午休關機)

用好幾年也沒在凸槌

怎麼API?簡單到爆...

系統排程();
WebClient wc = new WebClient();
string emailstr = Uri.UnescapeDataString((wc.DownloadString(new Uri("http://api.yourcompany.com.tw/allcontacts.aspx"))));
if (emailstr != "")
{
    JArray emp = JArray.Parse(emailstr); // Newtonsoft json
    foreach(var e in emp){
        新增連絡人(e["uid"],e["dept"],e["name"],e["mail"]);
    }
}

就醬

s82910g iT邦新手 5 級 ‧ 2022-12-30 23:00:55 檢舉

我嘗試用我的方法創建群組,
增加聯絡人用你的方法,但聯絡人卻加不進去群組,
變成分別建立了群組、聯絡人

是哪一段錯誤了嗎?再麻煩指教了,謝謝。

static void Main(string[] args)
{

新增聯絡人("", "", "TEST", "TEST@gmail.com.tw");
}

private static void 新增聯絡人(string 工號, string 部門, string 姓名, string 郵箱)
{
Outlook.Application outlookApp = new Outlook.Application();

var groupName = "TEST3";
outlookApp = new Microsoft.Office.Interop.Outlook.Application();

var processes = System.Diagnostics.Process.GetProcessesByName("OUTLOOK");

if (processes.Length > 0)
{
// Outlook 已經在運行
// 獲取 Outlook 物件
outlookApp = (Microsoft.Office.Interop.Outlook.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Outlook.Application");
}
else
{
// Outlook 沒有在運行
// 創建 Outlook 物件
outlookApp = new Microsoft.Office.Interop.Outlook.Application();
}

// 獲取通訊錄
var addressBook = outlookApp.Session.GetDefaultFolder(OlDefaultFolders.olFolderContacts);

// 創建聯繫人群組
var group = outlookApp.CreateItem(OlItemType.olDistributionListItem);
group.Subject = groupName;

        group.Save();


        

try
{
Outlook.ContactItem newContact = (Outlook.ContactItem)
outlookApp.CreateItem(Outlook.OlItemType.olContactItem);
newContact.LastName = $"{姓名}";
newContact.FirstName = $"{工號}";
newContact.Email1Address = $"{姓名}{工號} ({郵箱})";
newContact.Email1DisplayName = $"{姓名}{工號} {郵箱}";
newContact.CompanyName = "XX公司";
newContact.Department = 部門;
newContact.FileAs = $"{姓名}{工號}@XX公司";
newContact.Account = $"{姓名}{工號}@XX公司";
newContact.Save();

group.AddMember(newContact);
group.Save();
}
catch
{
Console.WriteLine("錯誤: 這個連絡人[{0}]無法新增(可能存在)", 姓名);
}
}

catch一下是出現了什麼錯誤,如果沒猜錯的話,應該是在參考裡沒有加入.interop

s82910g iT邦新手 5 級 ‧ 2023-01-02 21:43:52 檢舉

可是他沒有報錯誤,確實完成執行,就是變成聯絡人、群組都各別成功創立了,但聯絡人卻不會存入群組裡

以下是我問 CHATGPT 如何使用python讀寫outlook通訊錄的方法

喵的,超無腦,我要用python改寫了


可以使用 Python 的 win32com 模組來操作 Outlook 通訊錄。

首先,確保你已經安裝了 win32com 模組。然後,可以使用以下程式碼來新增 Outlook 通訊錄:

import win32com.client

# 建立 Outlook 應用程式物件
outlook = win32com.client.Dispatch("Outlook.Application")

# 建立新的通訊錄
contact = outlook.CreateItem(10)

# 設定通訊錄的資訊
contact.FullName = "John Smith"
contact.Email1Address = "john@example.com"
contact.HomeTelephoneNumber = "123-456-7890"

# 儲存通訊錄
contact.Save()

# 關閉 Outlook 應用程式
outlook.Quit()

在上面的程式碼中,我們使用 win32com.client.Dispatch 函數建立 Outlook 應用程式物件,然後使用 CreateItem 函數建立新的通訊錄。接著,我們可以使用通訊錄物件的屬性(例如 FullName、Email1Address 和 HomeTelephoneNumber)來設定通訊錄的資訊。最後,使用 Save 函數儲存通訊錄,然後使用 Quit 函數關閉 Outlook 應用程式。

希望這些資訊能幫到你!如果你有任何疑問,歡迎再詢問。

s82910g iT邦新手 5 級 ‧ 2023-01-07 15:08:19 檢舉

單純聯絡人可以,但是聯絡人群組裡面放入聯絡人就會失敗

可以對GROUP操作耶~這也是AI的答覆

import win32com.client

# 建立 Outlook 應用程式物件
outlook = win32com.client.Dispatch("Outlook.Application")

# 建立新的通訊錄群組
group = outlook.CreateItem(10)

# 設定通訊錄群組的資訊
group.FullName = "My Group"

# 建立新的通訊錄
contact1 = outlook.CreateItem(10)

# 設定通訊錄的資訊
contact1.FullName = "John Smith"
contact1.Email1Address = "john@example.com"
contact1.HomeTelephoneNumber = "123-456-7890"

# 將通訊錄加入群組
group.AddMembers(contact1)

# 建立另一個通訊錄
contact2 = outlook.CreateItem(10)

# 設定通訊錄的資訊
contact2.FullName = "Jane Doe"
contact2.Email1Address = "jane@example.com"
contact2.HomeTelephoneNumber = "098-765-4321"

# 將通訊錄加入群組
group.AddMembers(contact2)

# 儲存群組
group.Save()

# 關閉 Outlook 應用程式
outlook.Quit()

s82910g iT邦新手 5 級 ‧ 2023-01-07 18:50:01 檢舉

Traceback (most recent call last):
File "D:\Python\TEST_2.py", line 7, in
group = outlook.CreateItem(10)
^^^^^^^^^^^^^^^^^^^^^^
File "", line 2, in CreateItem
pywintypes.com_error: (-2147024809, '參數錯誤。', None, None)

會出現這個錯誤

我要發表回答

立即登入回答