Получить адрес электронной почты пользователя? - PullRequest
12 голосов
/ 28 января 2009

Есть ли способ получить адрес электронной почты пользователя из Windows через Win32 или .NET? Есть ли раздел реестра или API, содержащий эту информацию?

РЕДАКТИРОВАТЬ: у меня есть приложение, которое отправляет электронное письмо моей компании в случае сбоя нашего приложения, и я хотел получить обратный адрес электронной почты, чтобы мы могли ответить тому человеку, который столкнулся с аварией. В настоящее время я получаю имя пользователя, но оно может не совпадать с именем электронной почты. Очевидно, я могу заставить пользователя ввести свой адрес электронной почты, но интерфейс будет немного дружелюбнее, если я хотя бы попытаюсь получить адрес электронной почты и попросить пользователя проверить, верен ли адрес электронной почты для возврата.

Ответы [ 8 ]

5 голосов
/ 29 января 2009

Я могу думать, что это имеет смысл только в среде Windows Active Directory. В этом случае вы можете запросить AD и посмотреть, есть ли адрес электронной почты, связанный с учетной записью пользователя. Это определенно будет работать с MS Exchange, а также может работать с другими системами электронной почты предприятия. Для .Net вы можете использовать классы в пространстве имен System.DirectoryServices . Для Win32 вы можете использовать API ADSI . Вам нужно будет прочитать об AD и создать подходящий запрос, соответствующий вашим требованиям.

3 голосов
/ 28 января 2009

Позвольте мне ответить вам, спросив вас: Вы когда-нибудь вводили свой адрес электронной почты при установке windows?

3 голосов
/ 28 января 2009

Вы сохранили свой адрес электронной почты где-нибудь в системе? Там нет стандартного места для поиска. Я всегда зависит от приложений, которые использует пользователь (Outlook, Outlook Express, TuhunderBird).

Лучший способ получить адрес электронной почты пользователя - спросить его.

2 голосов
/ 28 августа 2011

Вы можете попробовать использовать константу NameUserPrincipal из перечисления EXTENDED_NAME_FORMAT с функцией GetUserNameEx.

NameUserPrincipal Имя пользователя (например, somebody@example.com).

Но я бы рекомендовал использовать его только в качестве предварительно заполненного адреса в приглашении для пользователя.

Более чем вероятно, что он потерпит неудачу с GetLastError из ERROR_NONE_MAPPED, хотя, если информация недоступна.

1 голос
/ 28 января 2009

Я думаю, что простой ответ - нет ... но, конечно, адрес электронной почты будет храниться в их почтовой программе, такой как Outlook.

Чего вы пытаетесь достичь?

0 голосов
/ 19 августа 2018

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 1009 *. Вы также можете определить значение по умолчанию, посмотрев:

HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail\Default.

См. Также: статья и инструмент / исходный код для загрузки

0 голосов
/ 28 января 2009

Возможно, в Windows хранится НЕКОТОРЫЙ адрес электронной почты, но для того, чтобы получить действительный адрес электронной почты пользователя, вам нужно, чтобы он набрал его, и, чтобы убедиться в этом, вам нужно рукопожатие, отправив им электронное письмо с активацией, прежде чем вы используйте это.

0 голосов
/ 28 января 2009

Адреса электронной почты могут быть для веб-клиентов, таких как gmail, или могут быть адресами электронной почты домена. В любом случае реализация должна основываться на специфике настройки электронной почты пользователя. Таким образом, краткий ответ «нет», по крайней мере, не существует метода «один размер подходит всем».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...