使用MAPI实现邮件发送,在线急等

tanmeining 2010-02-08 10:32:30
程序已经完成,但有以下几个遗留问题:
1、自动发送时的警告问题,如何去掉?
2、默认Outlook Express为系统邮件客户端,可以立即发送,如果是Outlook,是先放到Outlook的发送队列了,这时如果Outlook未运行,就一直不会发送。怎样可以保证无论邮件客户软件是否在运行,我的程序都可以立即将邮件发送出去呢?
3、如何一对多发送邮件?
PS:我使用的是outlook2007,请问如何能在不使用Outlook及Outlook Express的情况下,利用Exchange Server实现邮件收发呢?
欢迎大家踊跃讨论,分不够我再加。
...全文
474 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
tanmeining 2010-02-09
  • 打赏
  • 举报
回复
已经搞定,非常感谢gamezealot。
最终使用方法:outlook2007用的Extended MAPI,outlook Express用的Simple MAPI+修改注册表的键值。
tanmeining 2010-02-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lsvine 的回复:]
引用 3 楼 tanmeining 的回复:
Socket?你的意思是用POP3+SMTP的方式?这种方式不能用于Exchange Server收发邮件的。


为什么不能?
[/Quote]
因为公司的邮件服务器没有用SMTP协议,根本没法配置SMTP服务器和POP3服务器。
lsvine 2010-02-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 tanmeining 的回复:]
Socket?你的意思是用POP3+SMTP的方式?这种方式不能用于Exchange Server收发邮件的。
[/Quote]

为什么不能?
tanmeining 2010-02-08
  • 打赏
  • 举报
回复
tanmeining 2010-02-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 songsu 的回复:]
没弄过。一般直接自已建SOCKET发。
[/Quote]
Socket?你的意思是用POP3+SMTP的方式?这种方式不能用于Exchange Server收发邮件的。
songsu 2010-02-08
  • 打赏
  • 举报
回复
没弄过。一般直接自已建SOCKET发。
bsr2009 2010-02-08
  • 打赏
  • 举报
回复
没搞过,帮顶。
gamezealot 2010-02-08
  • 打赏
  • 举报
回复
关于outlook安全提示的几乎所有问题,可以看这个地址,很权威的。
http://www.outlookcode.com/article.aspx?id=52
gamezealot 2010-02-08
  • 打赏
  • 举报
回复
你使用的是Simple MAPI,使用OOM(outlook对象模型),CDO(合作数据对象,不知道官方如何翻译的)还有Simple MAPI的时候,都会产生这个提示的。
"a program is trying to access your Address book or Contacts" or "a program is trying to access e-mail addresses you have stored in Outlook..."
据我目前所知,要不出现这个提示,有三种方法:
1. 使用Extended MAPI。
2. 使用COM开发插件,添加IDTExtensibility2接口支持,可以获得Outlook.Application.这个对象是被outlook所信任的对象,而插件里得到的是这个对象的引用,所以不会有提示。
3. 使用VSTO,就是VS for Office插件开发,这个道理也2一样。都是被信任的对象。
tanmeining 2010-02-08
  • 打赏
  • 举报
回复
以下是我的发送邮件的代码部分,没有用到outlook的对象模型啊:

#include "stdafx.h"
#include <mapi.h>

////////////////////加上这几行///////////////////////////////
#include <stdlib.h>
/* 定义返回值*/
#define SENDEMAIL_SUCCESS 0 //邮件成功发送
#define SENDEMAIL_MAPI_NOT_INSTALLED 1 //没有安装MAPI Server
#define SENDEMAIL_MAPILOAD_FAILED 2 //加载 MAPI32.DLL 失败
#define SENDEMAIL_LOGON_FAILED 3 //无法登陆到 MAPI Server 或者 用户取消了登陆框
#define SENDEMAIL_SEND_FAILED 4 //消息发送失败

int CMciDlg::SendEmail(const char * Address,
const char* Subject,
const char* Text)
{
int iResult;
HINSTANCE hMAPIInst;
LPMAPILOGON pMAPILogon;
LPMAPILOGOFF pMAPILogoff;
LPMAPISENDMAIL pMAPISendMail;
LPMAPIRESOLVENAME pMAPIResolveName;
LHANDLE lhSession;

iResult = SENDEMAIL_SUCCESS;
hMAPIInst = ::LoadLibrary("MAPI32.DLL");
if(!hMAPIInst)
{
FreeLibrary(hMAPIInst);
return SENDEMAIL_MAPILOAD_FAILED;
}

pMAPILogon = (LPMAPILOGON) GetProcAddress(hMAPIInst, "MAPILogon");
pMAPILogoff = (LPMAPILOGOFF) GetProcAddress(hMAPIInst, "MAPILogoff");
pMAPISendMail = (LPMAPISENDMAIL) GetProcAddress(hMAPIInst, "MAPISendMail");
pMAPIResolveName = (LPMAPIRESOLVENAME) GetProcAddress(hMAPIInst,"MAPIResolveName");

//登录
if(pMAPILogon(0, NULL, NULL, MAPI_NEW_SESSION, 0, &lhSession) != SUCCESS_SUCCESS)
{
iResult = SENDEMAIL_LOGON_FAILED;
}
else
{
ULONG Result;

//收件人结构信息
MapiRecipDesc recip;
memset(&recip,0,sizeof(MapiRecipDesc));
recip.lpszAddress = (char*)Address;
recip.ulRecipClass = MAPI_TO;

//邮件结构信息
MapiMessage Msg;
memset(&Msg, 0, sizeof(Msg));
Msg.nFileCount = 0; //文件个数
Msg.lpFiles = 0; //文件信息
Msg.nRecipCount = 1; //收件人个数
Msg.lpRecips = &recip; //收件人
Msg.lpszSubject = (char*)Subject; //主题
Msg.lpszNoteText = (char*)Text; //正文内容

Result = pMAPIResolveName(lhSession, 0, Msg.lpRecips->lpszAddress,0, 0, &Msg.lpRecips);
Result = pMAPISendMail(lhSession, 0, &Msg, 0, 0);
if(Result != SUCCESS_SUCCESS)
{
iResult = SENDEMAIL_SEND_FAILED;
}
pMAPILogoff(lhSession, 0, 0, 0);
}

FreeLibrary(hMAPIInst);

return iResult;
}

gamezealot,高手帮忙看看,有什么地方不对的?
gamezealot 2010-02-08
  • 打赏
  • 举报
回复
程序已经完成,但有以下几个遗留问题:
1、自动发送时的警告问题,如何去掉?
答:你说的是outlook的那个安全提示吧,如果你使用的是outlook对象模型编程的话,属于外部调用,这个提示肯定会出来的。(至于如何去掉,比较麻烦,忘了)如果使用的是MAPI相关的函数的话,这个对话框根本不会出来。
2、默认Outlook Express为系统邮件客户端,可以立即发送,如果是Outlook,是先放到Outlook的发送队列了,这时如果Outlook未运行,就一直不会发送。怎样可以保证无论邮件客户软件是否在运行,我的程序都可以立即将邮件发送出去呢?
答:如果你使用outlook对象模型,必须调用Outlook::_MailItem::Send()方法发送。如果是使用MAPI,则必须使用IMessage::SubmitMessage来发送邮件。
3、如何一对多发送邮件?
PS:我使用的是outlook2007,请问如何能在不使用Outlook及Outlook Express的情况下,利用Exchange Server实现邮件收发呢?
答:可以,你就使用MAPI,登录Exchange服务器,后面IMessage::SubmitMessage即可。
tanmeining 2010-02-08
  • 打赏
  • 举报
回复
1,好像可以通过注册表实现把警告提示去掉,但不知道用程序怎么做的?知道的大侠还请不吝赐教。
tanmeining 2010-02-08
  • 打赏
  • 举报
回复
自己顶起来!~~~~
内容概要:本文档介绍了一个基于MATLAB/Simulink平台的综合性科研资源共享项目,核心内容为四旋翼无人机俯仰姿态保持的模糊自整定PID控制系统设计与仿真,提供完整的Matlab代码和Simulink仿真实现资源。项目进一步拓展至无人机轨迹跟踪、多控制策略对比(如线性MPC、非线性NMPC、强化学习RL及混合MPC-RL)、储能优化、电力系统调度、路径规划、神经网络预测等多个前沿科研方向。文档强调科研不仅需要严谨思维与勤奋,更要善于“借力”,通过成熟案例启发创新思路,帮助研究者避免误区,利用高质量资源激发科研灵感,加速高水平成果的复现与产出。; 适合人群:具备一定MATLAB编程基础,从事自动化、控制工程、电力系统、机器人或人工智能等相关领域的科研人员、研究生及工程师,尤其适合希望快速复现高水平论文成果的研究者。; 使用场景及目标:① 实现模糊PID控制在无人机姿态控制中的应用与仿真;② 对比分析不同先进控制策略(如MPC、RL)在轨迹跟踪中的性能表现;③ 借助提供的代码与模型,完成科研项目中的仿真验证、论文复现或算法优化任务。; 阅读建议:建议读者按照资源目录顺序逐步学习,优先掌握核心控制方法(如模糊PID、MPC)的实现逻辑,结合代码与仿真模型进行调试与改进,从而深化对控制理论的理解并推动自身科研工作的创新。
内容概要:本文档围绕“2023年IEEE ICMA顶刊复现多欠驱动水面无人艇误差约束协同路径跟踪控制(Matlab代码实现)”展开,详细介绍了一项针对多欠驱动水面无人艇的协同路径跟踪控制技术的研究与实现。该研究通过引入误差约束机制,旨在提升无人艇在复杂海洋环境下的路径跟踪精度与系统稳定性。文档不仅提供了完整的Matlab代码实现,还涵盖了控制算法的设计原理、数学建模过程以及仿真实验结果分析。此外,文档还列举了多个相关科研方向,如智能优化算法、机器学习、路径规划、无人机控制、电力系统优化等,展示了其在多学科交叉领域的广泛应用前景,并倡导科研工作者善用工具资源,提升研究效率。; 适合人群:具备一定编程基础,尤其是熟练掌握Matlab/Simulink环境的科研人员、工程师,以及对无人艇控制、路径跟踪、协同控制、非线性系统控制等领域感兴趣的研究生和高校学者。; 使用场景及目标:① 开展多欠驱动水面无人艇的协同路径跟踪控制研究;② 设计与实现具有误差约束的先进控制算法;③ 利用Matlab进行控制系统建模、仿真与性能验证;④ 探索将智能优化算法与现代控制理论相结合,解决复杂工程系统中的实际控制问题。; 阅读建议:建议读者按照文档的逻辑顺序系统学习,重点理解控制算法的设计思路与数学推导过程,并结合所提供的Matlab代码进行动手实践与仿真调试,以深化对理论知识的掌握。同时,鼓励读者积极查阅相关领域的最新文献,紧跟学术前沿,不断拓展研究视野,激发创新灵感。

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧