VC++ 使用ShellExecute函数调用邮箱客户端发送邮件(可以带附件)
之前写过一篇博文,通过MAPI实现调用邮箱客户端发送邮件带附件,当时对ShellExecute研究不深,以为ShellExecute不能带附件,因为项目需求原因(MAPI只能调用Foxmail和Outlook邮箱客户端,无法调用网易邮箱大师),不得不回头再次研究ShellExecute函数,最后发现ShellExecute可以完美调用Foxmail、网易邮箱大师、Outlook(单次发送只能添加一个附件)。因为我们安装完Foxmail、网易大师后,系统右键里发送到里有他们的快捷方式,所以就是在这里入手的,它们的快捷方式存放在系统路径下 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\SendTo (这是我的电脑上的位置,具体根据当前系统登录用户目录下找)

Foxmail:
int SharedByFoxmail()
{
TCHAR szPath[MAX_PATH] = { };
SHGetSpecialFolderPath(NULL, szPath, CSIDL_SENDTO, FALSE);
CString strClient;
strClient.Format(L"%ls", szPath);
strClient += L"\\Foxmail.lnk";//拿到快捷方式的绝对路径 CString strRecv = “example@.com”;//收件人
CString FilePath = "\"C:\\Users\\Administrator\\Desktop\\123.txt\" \"C:\\Users\\Administrator\\Desktop\\image.png\"";//多个附件发送时 路径要用双引号括起来,路径之间用空格隔开 ShellExecute(NULL, L"open", strClient,FilePath, L"", SW_SHOW); //填写收件人
HWND hWnd = NULL;
int n = ;
do
{
Sleep();
hWnd = ::FindWindow(L"TFoxComposeForm.UnicodeClass", NULL);
n--;
} while (n && (hWnd == NULL || !::IsWindowVisible(hWnd))); if (hWnd == NULL)
{
return -;
} HWND hChildWnd1 = NULL;
HWND hChildWnd2 = NULL;
HWND hChildWnd31 = NULL;
HWND hChildWnd32 = NULL;
HWND hChildWnd33 = NULL;
if (hWnd != NULL)
{
::SetForegroundWindow(hWnd); hChildWnd1 = ::FindWindowEx(hWnd, , L"TFoxComposeFrame.UnicodeClass", NULL);
hChildWnd2 = ::FindWindowEx(hChildWnd1, , L"TLayoutManager", NULL);
hChildWnd31 = ::FindWindowEx(hChildWnd2, , L"TFMZRichEdit.UnicodeClass", NULL);
//抄送
hChildWnd32 = ::FindWindowEx(hChildWnd2, hChildWnd31, L"TFMZRichEdit.UnicodeClass", NULL);
if (hChildWnd32 != NULL)
{
DWORD SelfThreadId = GetCurrentThreadId();//获取本身的线程ID
DWORD ForeThreadId = GetWindowThreadProcessId(hChildWnd32, NULL);//根据窗口句柄获取线程ID
AttachThreadInput(ForeThreadId, SelfThreadId, true);//附加线程 // WCHAR* szTest = L"comor_86sssss163.com";
//::SendMessage(hChildWnd32, WM_SETTEXT, 0, (LPARAM)strCC.GetBuffer(0));
//strCC.ReleaseBuffer();
} //收件人
hChildWnd33 = ::FindWindowEx(hChildWnd2, hChildWnd32, L"TFMZRichEdit.UnicodeClass", NULL);
if (hChildWnd33 != NULL)
{
DWORD SelfThreadId = GetCurrentThreadId();//获取本身的线程ID
DWORD ForeThreadId = GetWindowThreadProcessId(hChildWnd33, NULL);//根据窗口句柄获取线程ID
AttachThreadInput(ForeThreadId, SelfThreadId, true);//附加线程 // WCHAR* szTest = L"comor_86@163.com";
::SendMessage(hChildWnd33, WM_SETTEXT, , (LPARAM)strRecv.GetBuffer());
strRecv.ReleaseBuffer();
}
}
return 0;
}
网易邮箱大师:
int SharedByNetease()
{
TCHAR szPath[MAX_PATH] = { };
SHGetSpecialFolderPath(NULL, szPath, CSIDL_SENDTO, FALSE);
CString strClient;
strClient.Format(L"%ls", szPath);
strClient += L"\\Foxmail.lnk";//拿到快捷方式的绝对路径 CString strRecv = “example@.com”;//收件人
CString FilePath = "\"C:\\Users\\Administrator\\Desktop\\123.txt\" \"C:\\Users\\Administrator\\Desktop\\image.png\"";//多个附件发送时 路径要用双引号括起来,路径之间用空格隔开 ShellExecute(NULL, L"open", strClient,FilePath, L"", SW_SHOW); //填写收件人
HWND hWnd = NULL;
int n = ;
do
{
Sleep();
hWnd = ::FindWindow(L"MailWriteWindow", NULL);
n--;
} while (n && (hWnd == NULL || !::IsWindowVisible(hWnd))); if (hWnd == NULL)
{
return -;
} ::SetForegroundWindow(hWnd); hWnd = NULL;
n = ;
do
{
Sleep();
hWnd = ::FindWindow(L"MailWriteWindow", NULL);
n--;
} while (hWnd == NULL && n); if (hWnd == NULL)
{
return -;
} ::SendMessage(hWnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELONG(, ));//模拟鼠标左键按下 Sleep(); SendKeys(strRecv);
return 0;
}
....................... ///////////////////////////////////////////////// void SendKeys(CString msg)
{
USES_CONVERSION;
wchar_t* data = T2W(msg.GetBuffer());
int len = wcslen(data); for (int i = ; i<len; i++)
{
SendUnicode(data[i]);
}
}
OutLook:
int SharedByOutlook()
{
CString strFile= "\"C:\\Users\\Administrator\\Desktop\\123.txt\""
CString strRecv= “example@.com”;//收件人 CString strPara;
strPara = "/a \"";
strPara += strFile;
strPara +="\"";//附件路径用双引号括起来,方式文件名中有空格造成调用失败 //获取outlook安装路径
CString strPath = ReadOutlookPath();
if (!strPath.IsEmpty())
{
//添加判断文件是否存在
if (PathFileExists(strPath + "outlook.exe"))
{
ShellExecute(NULL,L"open",L"outlook.exe",strPara,strPath,SW_SHOW);
}
} HWND hWnd = NULL;
int n = ;
do
{
Sleep();
hWnd = ::FindWindow(L"rctrl_renwnd32", NULL);
n--;
} while (n && (hWnd == NULL || !::IsWindowVisible(hWnd))); if (hWnd == NULL)
{
return -;
} ::SetForegroundWindow(hWnd); TCHAR* szBuffer = strRecv.GetBuffer();
EnumChildWindows(hWnd, EnumChildWindowsProc, (LPARAM)szBuffer);
strRecv.ReleaseBuffer(); return ;
} ///////////////////////////////////////
CString CSharedHelper::ReadOutlookPath()
{
HKEY hKEY;
HKEY hKeyRoot = HKEY_LOCAL_MACHINE;
long ret = ::RegOpenKeyEx(hKeyRoot,
L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\OUTLOOK.EXE",
,
KEY_READ,
&hKEY);
if (ret != ERROR_SUCCESS)//如果无法打开hKEY,则中止程序的执行
{
// AfxMessageBox(L"错误:无法打开有关的hKEY");
return L"";
} TCHAR Vals[MAX_PATH] = { };
DWORD keyType;
DWORD lenIt = MAX_PATH*sizeof(TCHAR);
if (::RegQueryValueEx(hKEY, L"Path", , &keyType, (BYTE*)Vals, &lenIt) != ERROR_SUCCESS)
{
// AfxMessageBox(L"错误:RegQueryValueExA错误");
return L"";
} CString str;
str.Format(L"%ls", Vals);
return str;
} BOOL CALLBACK CSharedHelper::EnumChildWindowsProc(HWND hWnd, LPARAM lParam)
{
HWND EditNumHwnd = ::FindWindowEx(hWnd, NULL, _T("RichEdit20WPT"), NULL);
if (EditNumHwnd != NULL)
{
if (::GetWindowLong(EditNumHwnd, GWL_STYLE)&WS_VISIBLE)
{
TCHAR* str = (TCHAR*)lParam;
//::SendMessage(EditNumHwnd, WM_CHAR, WPARAM('a'), 0);//发送一个字消息
::SendMessage(EditNumHwnd, WM_SETTEXT, , (LPARAM)str); return ;
}
} return ;
}
VC++ 使用ShellExecute函数调用邮箱客户端发送邮件(可以带附件)的更多相关文章
- 利用Python+163邮箱授权码发送带附件的邮件
背景 前段时间写了个自动爬虫的脚本,定时在阿里云服务器上执行,会从某个网站上爬取链接保存到txt文本中,但是脚本不够完善,我需要爬虫完毕之后通过邮件把附件给我发送过来,之前写过一个<利用Pyth ...
- JavaMail发送邮件、带附件邮件(完整版)
工程目录如下: 1.准备javaMail需要的两个Jar包:mail.jar.activation.jar,然后add to build path 2.QQ邮箱开启SMTP服务,开启后,它会给你一串授 ...
- python发送邮件(带附件)
python通过stmp发送qq邮件,带附件 import smtplib from email.mime.multipart import MIMEMultipart from email.mime ...
- CI框架发送邮件(带附件)
最近写了一个发送带附件的邮件,发邮件挺简单的,在我这里最重要的是遇到问题,哈哈哈哈 1.主要方法看代码 public function send_mail(){ $this->load-> ...
- python webdriver firefox 登录126邮箱,先添加联系人,然后进入首页发送邮件,带附件。
代码:#encoding=utf-8from selenium import webdriverfrom selenium.webdriver.common.keys import Keysfrom ...
- Jmail发送邮件与带附件乱码解决办法
Jamil发送邮件的具体用法: 首先,我们要从网上下载Jamil.dll的组件,这个网上很多,然后添加引用using jmail,然后再本机或者服务器上注册一下 将jmail.dll拷贝到服务器的sy ...
- Qt + CURL + mimetic 发送邮件(带附件)
使用了大名鼎鼎的CURL 开源库,以及mimetic开源库. CURL支持N多协议.功能超强,但是不能直接发邮件附件,需要自己拼mime.太麻烦,于是乎~~ mimetic主要用于构造邮件mimeti ...
- nodejs——发送邮件(带附件)
用到的包是 nodemailer,简单,有效. 1.auth 中的 pass,是指“邮箱第三方登录授权码”,如何获取授权码,以QQ邮箱为例,请点击:http://jingyan.baidu.com/a ...
- Go smtp发送邮件,带附件
package main import ( "net/smtp" "bytes" "time" "io/ioutil" ...
随机推荐
- 关于第一次java课的感想
首先必须承认,这次的题目还是很简单的,因为这道题完全就是换了个包装的小学期题目,也就是说,如果让我用C++来编写,我可以保证3个小时内编写完毕,也许在一些小的方面,比如输入数字的合法性上存在问题,但毕 ...
- MyBatis基础入门《三》Select查询集合
MyBatis基础入门<三>Select查询集合 描述: 代码新增了一个MybatisUtil工具类,查询数据库返回集合的时候,接收数据的三种方式.由于代码会渐渐增多,未涉及改动过的文件不 ...
- JavaScript-年月日转换12小时制
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Bukkit插件编程之检测玩家受到的伤害是来自投射类武器还是近身武器
package com.sklm.lhb.listener; import org.bukkit.entity.Arrow; import org.bukkit.entity.Player; impo ...
- [7] Windows内核情景分析---线程同步
基于同步对象的等待.唤醒机制: 一个线程可以等待一个对象或多个对象而进入等待状态(也叫睡眠状态),另一个线程可以触发那个等待对象,唤醒在那个对象上等待的所有线程. 一个线程可以等待一个对象或多个对象, ...
- STL之stack容器
1.stack容器 1) stack是堆栈容器,是一种“先进后出”的容器. 2)stack是简单地装饰deque容器而成为另外的一种容器. 3)头文件.#include <stack> 2 ...
- Lua用table模拟二维数组
local array = {}; , , , , } , , , , } local row3 = {"I", "love", "lua" ...
- 详解Linux下iptables中的DNAT与SNAT设置(转)
详解Linux下iptables中的DNAT与SNAT设置 这篇文章主要介绍了Linux下iptables中的DNAT与SNAT设置,是Linux网络配置中的基础知识,需要的朋友可以参考下 原文连 ...
- 调查显示数据分析已取代Web开发成为第一用例
一项关于Python的开发者调查显示,编程语言现在主要用于数据分析,取代了之前的第一个用例Web开发. 去年秋天,由Python软件基金会和开发人员工具供应商JetBrains进行,2018 Pyth ...
- flask框架----上下文管理
一.上下文管理相关知识点: a.类似于本地线程 创建Local类: { 线程或协程唯一标识: { 'stack':[request],'xxx':[session,] }, 线程或协程唯一标识: { ...