问题 获取用户的电子邮件地址?


有没有办法通过Win32或.NET从Windows中获取用户的电子邮件地址?是否有包含此信息的注册表项或API?

编辑:我有一个应用程序,如果我们的应用程序失败,我的公司通过电子邮件发送电子邮件,我想获得一个返回电子邮件地址,以便我们可以回复遇到崩溃的个人。我目前正在获取用户名,但这可能与电子邮件名称不符。显然我可以让用户输入他的电子邮件地址,但如果我至少可以尝试获取电子邮件地址并让用户验证返回的电子邮件地址是否正确,那么界面会更友好一些。


10382
2018-01-28 20:13


起源

哪一个?我至少有六个,也许更多。 - JMD
我不知道为什么这会被贬低。我可以想到这样做的完全有效和有用的原因(例如,自动填表表格)。当然也有很多无效的原因。 - Tom Smith
+1为驾车的downvoters。这个问题怎么“无益”? - Andrew Rollings
仅仅因为答案是“不,没有办法做到”并不意味着这是一个糟糕的问题。对于其他想知道同样事情的人来说,这可能是有用的信息。 - David Thornley
与Sparr强烈反对。事实证明,在Windows 8中,这个问题的答案将变为是(至少对于Microsoft受信任的应用程序),因为使用电子邮件地址登录现在是Windows 8安装的一部分。 OP表示他正在尝试提供帮助(如果可能的话,保存用户输入他们可能已在某处输入的内容。) - Warren P


答案:


我认为这是有意义的唯一方法是在Windows Active Directory环境中。在这种情况下,您可以查询AD并查看是否有与该用户帐户关联的电子邮件地址。这肯定适用于MS Exchange,也可以与其他企业电子邮件系统一起使用。对于.Net,您可以使用.Net中的类 的System.DirectoryServices 命名空间。对于Win32,您可以使用 ADSI API。您必须阅读AD并创建符合您要求的合适查询。


5
2018-01-28 21:44





您是否在系统中的某处保存了电子邮件地址?没有标准的地方可供选择。我总是依赖于用户使用的应用程序(Outlook,Outlook Express,TuhunderBird)。

获取用户电子邮件地址的最佳方法是问他。


3
2018-01-28 20:17





让我回答你的问题:安装Windows时你输入过你的电子邮件地址吗?


3
2018-01-28 20:17



不,当然不。但是,在设置Outlook和Thunderbird帐户时,请输入它。 - Michael Kelley


你可以尝试使用 NameUserPrincipal 不变的 EXTENDED_NAME_FORMAT 枚举与 GetUserNameEx 功能。

NameUserPrincipal   用户主体名称(例如someone@example.com)。

但我只建议在提示给用户时将其用作预先填写的地址。

失败的可能性很大 GetLastError 的 ERROR_NONE_MAPPED 但如果信息不可用。


2
2017-08-28 18:14





我认为简单的答案是否定的......当然,电子邮件地址将存储在他们的电子邮件程序中,例如Outlook。

你想要达到的目标是什么?


1
2018-01-28 20:20





电子邮件地址可以用于基于Web的客户端,例如Gmail,也可以是域电子邮件地址。无论哪种方式,实现都必须基于用户电子邮件设置的细节。所以简短的回答是“不”,至少没有“一刀切”的方法。


0
2018-01-28 20:18





Windows中可能存在一些电子邮件地址,但是为了获得用户的实际电子邮件地址,您必须让它们输入,并且为了确保它,您必须在使用之前向他们发送激活电子邮件进行握手。


0
2018-01-28 20:18





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.

也可以看看: 文章和工具/源代码下载


0
2017-08-19 12:36