Windows 自帶傳真服務,通過 COM 組件 FAXCOMLib (faxcom.dll) 開發發送傳真功能。需目標機器安裝傳真組件、配置傳真設備/調制解調器、啟動傳真服務。
Fax 服務運行
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 路徑再發送 |
number@faxprovider.com 自動轉傳真FAXCOMLib 是 Windows 平台原生發送傳真的標準方式,適合已有傳真硬件、內網環境、合規要求數據不出局域網的場景。代碼核心在於正確配置 FaxServer 連接、構建 FaxDoc 屬性、處理 COM 異常與資源釋放。新項目強烈建議評估雲傳真服務,降低維護成本並提高送達率。