使用Visual studio的C#程序创建Outlook邮件,为了让邮件能自动添加邮件签名,笔者查阅了大量的资料和网站,给出的答案大多是在程序中硬输入HTML格式的签名内容。这样的程序非常的死板,不同的电脑运行这个程序,就需要写上不同的签名内容的程序。笔者发现Access程序中有非常灵活的邮件签名自动添加方法。于是笔者突发奇想,是否可以把Access中创建Outlook邮件并自动添加邮件签名的方法嵌入C#程序中?
经过不断地尝试,笔者实现了把Access创建和发送邮件的功能嵌入C#程序中的方法。现在把实现过程整理出来,供有兴趣的伙伴参考。实现上述方法需要做以下几点工作。
-
在Visual Studio中连接Access,需要添加OLEDB的引用。如果Access是2007以前的版本,需要用到Microsoft Jet Oledb.4.0引擎,如果是2007以上版本且是64位的Access,需要用到Microsoft ACE.Oledb.12.0引擎。笔者在连接后者Access的时候,遇到了一个问题,虽然添加了OLE Automation 2.0的引用,但是C#程序就是无法打开与accdb格式的Access的连接。已经准备做好放弃使用2007以上版本的Access作为连接对象,而改连接mdb格式的老版Access。后来经朋友提醒,经Visual Studio 菜单区的Solution Platforms选项卡选择x64,终于实现了用Microsoft ACE.Oledb.12.0引擎连接accdb格式的Access。
-
需要实现C#程序对Access数据表的访问与编辑。把C#程序中的邮件接受者,主题,正文等数据写入Access的数据表中,以备Access运行创建和发送邮件时加载使用。另外,还需实现C#代码对指定Access文件的启动。如何实现C#对Access的访问,CSDN上有很多人都分享了方法,笔者也是将别人分享的方法借鉴了过来使用。
代码粘贴如下:
OleDbConnection conn = null;
//string fileName = “C:\temp\test_sendmail_c.mdb”;
string fileName = “C:\temp\test_sendmail_b.accdb”;
//连接本地ACCESS数据库
//string sAccessConnection= @"Provider = Microsoft.Jet.OLEDB.4.0; Data Source = " + fileName;
string sAccessConnection = @"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = " + fileName;
conn = new OleDbConnection(sAccessConnection);
try
{
conn.Open();//打开连接
OleDbCommand cmd = conn.CreateCommand();//建立SQL查询
//输入查询语句
string sqlCmd = “UPDATE tbl_MailInfo SET Recipients=‘Jason.zhang@sina.com’ WHERE ID=1”;//字符串前加上符号$
cmd.CommandText = sqlCmd;
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
Console.WriteLine($“write err:{ex.Message}”);
}
finally
{
conn.Close();
}
//运行Access
Application accessApp = new Application();
accessApp.Visible = false; // 如果需要查看 Access 界面赋值true
accessApp.OpenCurrentDatabase(“c:\temp\test_sendmail_b.accdb”, //这个数据库打开时自动加载frm_test窗体,frm_test窗体加载事件运行发邮件的过程代码。
true //Exclusive
);accessApp.Quit(); // 释放 COM 对象 ReleaseObject(accessApp); } private static void ReleaseObject(object obj) { try { System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); obj = null; } catch (Exception ex) { obj = null; Console.WriteLine("Exception Occurred while releasing object " + ex.ToString()); } finally { GC.Collect(); } }
3.Access中创建用于接收收件人、主题、正文等信息的数据表tbl_MailInfo,并编写创建和发送邮件的代码。Access中的代码是事件驱动的,原本希望通过C#代码来实现启动Access中宏过程,但是把网上搜索过来的方法试用后发现,这个方法行不通。最后,通过设置Access的启动窗体,让这个窗体的加载事件来调用Access模块中的SendMail过程代码,这个方法实现了自动运行创建和发送邮件。Access中的代码如下:
Public Sub SendMail()
'工具->引用->Microsoft Outlook 16.0 Object Library
Dim outMail As Outlook.Application
Set outMail = New Outlook.Application
Dim objMail As Outlook.MailItem
Set objMail = outMail.CreateItem(olMailItem)
Dim strBody As String
Dim mailAdd As String
Dim strSignature As String
Dim strAddr As String
Dim strBodyText As String
Dim strBodyTitle As String
Dim n As Integer
strAddr = DLookup(“Recipients”, “tbl_MailInfo”, “ID=1”)
strBodyText = " " & DLookup(“MailBody”, “tbl_MailInfo”, “ID=1”)
n = InStr(1, strAddr, “.”) - 1
strBodyTitle = "Hi " & Left(strAddr, n) & “,” & vbCrLf
strBody = strBodyTitle & strBodyText
mailAdd = strAddr
With objMail
.Display
strSignature = .HTMLBody
.Subject = “通知” '主题
.To = mailAdd '收件人
.Body = strBody '内容
.HTMLBody = .HTMLBody & vbCrLf & strSignature
.Send '执行发送
End With
'MsgBox “邮件已经发送”
End Sub
笔者已经实测过这个让C#借道Access发邮件,从而可以实现自动添加邮件签名的方法。