首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 發送傳真實現:基於 FAXCOMLib 的完整方案

     編輯:關於C語言

技術方案概覽

Windows 自帶傳真服務,通過 COM 組件 FAXCOMLib (faxcom.dll) 開發發送傳真功能。需目標機器安裝傳真組件、配置傳真設備/調制解調器、啟動傳真服務。

環境準備

  1. Windows 功能 → 「打印和文檔服務」 → 「傳真服務」啟用
  2. 控制面板 → 「電話和調制解調器」配置傳真調制解調器
  3. 服務 (services.msc) 確保 Fax 服務運行
  4. VS 專案 → 添加引用 → COM → Microsoft Fax Service Extended COM Component 1.0 Type Library (生成 Interop.FAXCOMLib.dll)

核心發送代碼


using System;
using System.IO;
using FAXCOMLib; // Interop 命名空間

public class FaxSender
{
    public bool SendFax(string filePath, string faxNumber, string serverName = "")
    {
        if (!File.Exists(filePath))
            throw new FileNotFoundException("傳真文件不存在", filePath);

        FaxServerClass server = null;
        FaxDocClass doc = null;
        
        try
        {
            // 1. 連接傳真服務器 (本機傳空字符串或 ".")
            server = new FaxServerClass();
            server.Connect(serverName); // 遠程服務器需權限
            
            // 2. 創建傳真文檔 (支持 TIFF, PDF 等傳真服務支持的格式)
            doc = (FaxDocClass)server.CreateDocument(filePath);
            
            // 3. 設置收件人信息
            doc.RecipientName = "收件人姓名";
            doc.FaxNumber = faxNumber; // 格式: "010-12345678" 或 "@tapi\..." 
            doc.RecipientCompany = "公司名";
            // 可選: doc.RecipientAddress, .City, .State, .Zip, .Country, .Title, .Department, .OfficeLocation, .HomePhone, .OfficePhone
            
            // 4. 設置發件人信息 (顯示在傳真頁眉/封面)
            doc.SenderName = "發件人";
            doc.SenderCompany = "我方公司";
            doc.SenderFax = "010-87654321";
            doc.SenderAddress = "地址";
            // 可選: .Title, .Department, .OfficePhone, .HomePhone, .Email, .BillingCode
            
            // 5. 封面頁設置 (可選)
            // doc.CoverpageName = "Modern"; // 系統內置封面模板名
            // doc.CoverpageSubject = "主題";
            // doc.CoverpageNote = "備註";
            // doc.ServerCoverpage = true; // 使用服務器端封面
            
            // 6. 發送
            int jobId = doc.Send(); // 返回傳真作業 ID
            
            Console.WriteLine($"傳真提交成功,JobId: {jobId}");
            return true;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"發送失敗: {ex.Message}");
            // 記錄詳細錯誤: ex.ErrorCode (HRESULT), 內部異常
            return false;
        }
        finally
        {
            // 釋放 COM 對象
            if (doc != null) Marshal.ReleaseComObject(doc);
            if (server != null) 
            {
                server.Disconnect();
                Marshal.ReleaseComObject(server);
            }
        }
    }
}

關鍵參數說明

屬性/方法說明
FaxServer.Connect(serverName)本機用 "" 或 ".";遠程需機器名/IP,且當前用戶需有遠程傳真權限
CreateDocument(filePath)文件需為傳真服務支持格式 (TIFF Class F 最佳,PDF 需安裝相應過濾器)
FaxNumber標準格式:+86-10-12345678 或 TAPI 規范;若用調制解調器直撥,需包含區號、外線前綴(如 9)
Send()異步提交到傳真隊列,立即返回 JobId;實際發送由服務後台處理
CoverpageName預裝模板:Modern, Standard, Simple;自定義 .cov 文件放入 C:\Windows\Fax\Coverpages

狀態監控與錯誤處理


// 查詢作業狀態
FaxJobStatusEnum status = server.GetJobStatus(jobId);
// 枚舉: fjsQUEUED, fjsINPROGRESS, fjsCOMPLETED, fjsFAILED, fjsCANCELED, fjsBLOCKED

// 事件訂閱 (需實現 IFaxServerNotify 接口,較複雜)
// 簡單輪詢:
while (true)
{
    var status = server.GetJobStatus(jobId);
    if (status == FaxJobStatusEnum.fjsCOMPLETED) { /* 成功 */ break; }
    if (status == FaxJobStatusEnum.fjsFAILED) { /* 失敗,獲取 ExtendedStatus */ break; }
    Thread.Sleep(5000);
}

常見問題排查

現象原因與對策
Connect 失敗 (0x800706BA)RPC 服務不可用:傳真服務未啟動、防火牆阻攔、遠程機器名解析失敗
Send 返回 0 / 異常文件格式不支持、傳真號碼無效、無可用傳真端口、調制解調器未就緒
傳真發送中斷線路忙、對方無應答、調制解調器錯誤 (查看事件查看器 → 應用程序 → Fax 服務日誌)
權限拒絕當前用戶不在「傳真用戶」組,或遠程提交需「傳真管理員」權限
中文文件名亂碼確保文件路徑編碼正確,或先重命名為 ASCII 路徑再發送

現代替代方案

  1. 雲傳真 API:Twilio Fax, eFax API, InterFAX, SRFax — 無硬件、按量付費、REST API、高可用
  2. Email-to-Fax 网关:郵件發送到 number@faxprovider.com 自動轉傳真
  3. 虛擬調制解調器 + HylaFax (Linux):服務器端部署,應用通過 FTP/HTTP 提交 TIFF

總結

FAXCOMLib 是 Windows 平台原生發送傳真的標準方式,適合已有傳真硬件、內網環境、合規要求數據不出局域網的場景。代碼核心在於正確配置 FaxServer 連接、構建 FaxDoc 屬性、處理 COM 異常與資源釋放。新項目強烈建議評估雲傳真服務,降低維護成本並提高送達率。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved