有没有办法通过Win32或.NET从Windows中获取用户的电子邮件地址?是否有包含此信息的注册表项或API?
编辑:我有一个应用程序,如果我们的应用程序失败,我的公司通过电子邮件发送电子邮件,我想获得一个返回电子邮件地址,以便我们可以回复遇到崩溃的个人。我目前正在获取用户名,但这可能与电子邮件名称不符。显然我可以让用户输入他的电子邮件地址,但如果我至少可以尝试获取电子邮件地址并让用户验证返回的电子邮件地址是否正确,那么界面会更友好一些。
有没有办法通过Win32或.NET从Windows中获取用户的电子邮件地址?是否有包含此信息的注册表项或API?
编辑:我有一个应用程序,如果我们的应用程序失败,我的公司通过电子邮件发送电子邮件,我想获得一个返回电子邮件地址,以便我们可以回复遇到崩溃的个人。我目前正在获取用户名,但这可能与电子邮件名称不符。显然我可以让用户输入他的电子邮件地址,但如果我至少可以尝试获取电子邮件地址并让用户验证返回的电子邮件地址是否正确,那么界面会更友好一些。
我认为这是有意义的唯一方法是在Windows Active Directory环境中。在这种情况下,您可以查询AD并查看是否有与该用户帐户关联的电子邮件地址。这肯定适用于MS Exchange,也可以与其他企业电子邮件系统一起使用。对于.Net,您可以使用.Net中的类 的System.DirectoryServices 命名空间。对于Win32,您可以使用 ADSI API。您必须阅读AD并创建符合您要求的合适查询。
您是否在系统中的某处保存了电子邮件地址?没有标准的地方可供选择。我总是依赖于用户使用的应用程序(Outlook,Outlook Express,TuhunderBird)。
获取用户电子邮件地址的最佳方法是问他。
让我回答你的问题:安装Windows时你输入过你的电子邮件地址吗?
你可以尝试使用 NameUserPrincipal
不变的 EXTENDED_NAME_FORMAT
枚举与 GetUserNameEx
功能。
NameUserPrincipal 用户主体名称(例如someone@example.com)。
但我只建议在提示给用户时将其用作预先填写的地址。
失败的可能性很大 GetLastError
的 ERROR_NONE_MAPPED
但如果信息不可用。
我认为简单的答案是否定的......当然,电子邮件地址将存储在他们的电子邮件程序中,例如Outlook。
你想要达到的目标是什么?
电子邮件地址可以用于基于Web的客户端,例如Gmail,也可以是域电子邮件地址。无论哪种方式,实现都必须基于用户电子邮件设置的细节。所以简短的回答是“不”,至少没有“一刀切”的方法。
Windows中可能存在一些电子邮件地址,但是为了获得用户的实际电子邮件地址,您必须让它们输入,并且为了确保它,您必须在使用之前向他们发送激活电子邮件进行握手。
Windows将使用的电子邮件帐户存储在“UserExtendedProperties
“关键
HKEY_CURRENT_USER\Software\Microsoft\IdentityCRL
因此,您可以使用以下代码获取电子邮件帐户:
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#define MAX_KEY_LENGTH 255
#define MAX_VALUE_NAME 16383
void GetDefaultEmailAddress()
{
HKEY key;
TCHAR achKey[MAX_KEY_LENGTH]; // buffer for subkey name
DWORD cbName; // size of name string
TCHAR achClass[MAX_PATH] = TEXT(""); // buffer for class name
DWORD cchClassName = MAX_PATH; // size of class string
DWORD cSubKeys = 0; // number of subkeys
DWORD cbMaxSubKey; // longest subkey size
DWORD cchMaxClass; // longest class string
DWORD cValues; // number of values for key
DWORD cchMaxValue; // longest value name
DWORD cbMaxValueData; // longest value data
DWORD cbSecurityDescriptor; // size of security descriptor
FILETIME ftLastWriteTime; // last write time
DWORD i, retCode;
TCHAR achValue[MAX_VALUE_NAME];
DWORD cchValue = MAX_VALUE_NAME;
if (RegOpenKeyEx(HKEY_CURRENT_USER, L"Software\\Microsoft\\IdentityCRL\\UserExtendedProperties", NULL, KEY_READ, &key) == ERROR_SUCCESS)
{
// Get the class name and the value count.
retCode = RegQueryInfoKey(
key, // key handle
achClass, // buffer for class name
&cchClassName, // size of class string
NULL, // reserved
&cSubKeys, // number of subkeys
&cbMaxSubKey, // longest subkey size
&cchMaxClass, // longest class string
&cValues, // number of values for this key
&cchMaxValue, // longest value name
&cbMaxValueData, // longest value data
&cbSecurityDescriptor, // security descriptor
&ftLastWriteTime); // last write time
// Enumerate the email accounts subkeys, until RegEnumKeyEx fails.
if (cSubKeys)
{
wprintf(TEXT("\nNumber of email accounts used: %d\n"), cSubKeys);
for (i = 0; i < cSubKeys; i++)
{
cbName = MAX_KEY_LENGTH;
retCode = RegEnumKeyEx(key, i,
achKey,
&cbName,
NULL,
NULL,
NULL,
&ftLastWriteTime);
if (retCode == ERROR_SUCCESS)
{
wprintf(TEXT("(%d) %s\n"), i + 1, achKey);
}
}
}
}
}
当涉及用于电子邮件的桌面应用程序(即MAPI客户端)时,为了枚举这些客户端而要查看的位置是 Software\Clients\Mail
键入 HKEY_LOCAL_MACHINE.
You will find there all installed [MAPI clients][1].
。
您还可以通过查看以下内容来确定默认值:
HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail\Default.
也可以看看: 文章和工具/源代码下载