分类: C/C++
2008-08-07 17:36:37
虽然JMail用得最多的是ASP下的应用,但它在其它语言中都能够很好地工作,本文将针对w3 JMail 4.3在VC中的使用展开讨论。
一、准备篇
1.1 组件的安装
因为JMail4.3与以前的版本相比接口有了变动,所以推荐您使用4.3版本,您可以到以下网址下载JMail 4.3
DIMAC公司
VC知识库
1.2 快速邮件发送程序MINI版
我们从这个小例子大致了解一下JMail组件的工作过程
#import "jmail.dll" // 导入jmail.dll, 假如jmail.dll不在工程目录下,您需要写上完整路径 void main() { CoInitialize(NULL); // COM的初始化 { // 创建SpeedMailer实例 jmail::ISpeedMailerPtr pSpeedMailer("JMail.SpeedMailer"); // 发送邮件 pSpeedMailer->SendMail("yourmail@163.com", // 发件人邮箱 "webmaster@163.com", // 收件人邮箱 "主题:你好!", // 主题 "正文:大家好才是真的好!", // 正文 "smtp.163.com"); // SMTP服务器 } CoUninitialize(); }看了上述代码您肯定会说真的很容易,这个例子是利用了ISpeedMailer接口来发送简单的邮件,我想大家一看就清楚。
try { ... ... 发送代码 ... } catch( _com_error & e) { cerr << "错误号: 0x" << hex << e.Error() << endl; cerr << "错误信息: " << e.ErrorMessage() << endl; cerr << "错误描述: " << e.Description() << endl; }
二、邮件发送篇
下图是本文附带的邮件发送程序运行效果图:jmail::IMessagePtr pMessage("JMail.Message"); // 发件人邮箱 pMessage->From = "mymail@mydomain.com"; // 发件人姓名 pMessage->FromName = "我的名字"; // 添加收件人1, 无收件人姓名与PGP KEY pMessage->AddRecipient("yourmail1@yourdomain.com","",""); // 添加收件人2, 无PGP KEY pMessage->AddRecipient("yourmail2@yourdomain.com","收件人名字",""); // 添加收件人3,这里的PGP KEY只是作为示例,实际中需要用PGP软件生成 pMessage->AddRecipient("yourmail3@yourdomain.com","收件人名字","R9Rb7decrQWINuce3uFc0xDG"); // 优先级设置,1-5逐次降低, 3为中级 pMessage->Priority = 3; // 编码方式设置, 默认是iso-8859-1 pMessage->Charset = "GB2312"; // 主题 pMessage->Subject = "邮件主题"; // 正文 pMessage->Body = "邮件正文\r\n"; // 如有必要,可以再添加一些正文 pMessage->AppendText("VC知识库欢迎您! 祝您身体健康!"); // 添加附件 pMessage->AddAttachment("C:\\CONFIG.SYS", VARIANT_FALSE, "application/octet-stream"); pMessage->AddAttachment("C:\\test.gif", VARIANT_TRUE, "image/gif"); // 开始发送 pMessage->Send("mailserver.com", VARIANT_FALSE);2.2 发送HTML格式的邮件
...... // 这里添加Body是为了使邮件浏览者在没有切换到HTML时给予提醒 pMessage->Body = "邮件采用HTML格式,请切换到HTML模式。\r\n"; // 添加附件 _bstr_t bstrCID = pMessage->AddAttachment("D:\\logo.gif", VARIANT_TRUE, "image/gif"); // 返回content id // 根据content id 生成IMG HTML标记 char pImgHTML[200]; strcpy(pImgHTML, ""); // 添加HTML正文内容 pMessage->HTMLBody = "关于content id更详细的内容请阅读MIME协议VC知识库
"; pMessage->AppendHTML("
"); pMessage->AppendHTML(pImgHTML); // 开始发送 pMessage->Send("", VARIANT_FALSE);
// 标准邮件头 pMessage->AddNativeHeader("Message-ID", "VCKBASE:ABCDEFG1234567"); pMessage->AddNativeHeader("Date", "1800-1-1"); // 自定义邮件头 pMessage->AddHeader("Originating-IP", "123.345.567.789"); // 给它个假冒伪劣IP pMessage->AddHeader("Mailer", "MyMailBox 1.0"); // 邮件发送器名称 pMessage->AddHeader("Company", "MyCompany"); // 随便加点定制信息有时收到邮件的时候会提示:发件人请求一个收条以表示你已经阅读过这封邮件,您愿意发送一个收条吗?
pMessage->AddNativeHeader("Disposition-Notification-To", "sender@domain.com");sender@domain.com是回复收条的邮箱。
pMessage->Send("username:password@mailserver.com")
pMessage->Send("", VARIANT_FALSE);这样,组件会通过DNS查询目标域(例如:163.com)中的MX记录,直接将信件提交到MX记录中所指定的邮件服务器中。
...... pMessage->AddRecipient("yourmail@yourdomain.com","",""); pMessage->Send("192.16.10.11", VARIANT_FALSE);2.7 关于邮件的加密传输与集群发送
JMail的免费版本并没有提供加密传输与集群发送功能,要想使用这些功能,您需要安装无限制的JMail标准版或专业版。
对于加密传输,您还需要安装PGP软件,例如:PGPFreeware
集群发送功能在拥有成千上万个客户时是非常有用的,定制好模板后,数据库中的记录自动填入模板生成信件发送。
由于笔者只有免费版本的JMail,所以这一功能未能尝试。
虽然免费版未提供集群发送功能,但我们可以只使用IMessage接口结合数据库来实现集群发送功能.
2.8 邮件发送时的常见错误
当所设置的SMTP服务器不存在,错误信息:
The message was undeliverable. All servers failed to receive the message
如果没有设置SMTP服务器时,试图发送一封错误邮件地址的信,
例如:webmaster@sohusohu.com 将返回如下错误信息:
WSAGetLastError() returned 11001, Host not found
许多SMTP服务器不支持转发,或支持转发但不转发MAIL FROM不是本地帐号的信,错误信息:
The message was undeliverable. All servers failed to receive the message
许多SMTP服务器不接收外部的邮件,例如smtp.sohu.com,所以想要向SOHU发信你可以不设邮件服务器, 而是通过
DNS查询邮件交换服务器,或者直接将邮件服务器设置为sohumx.sohu.com。
像SOHU信箱会对一些发件人信箱进行过滤,例如您将发件人信箱设为test@163.com,或者发件人信箱与收件人信箱一致,
发信时将返回:554
(未完待续...)