Błąd autoryzacji ze skrzynką Outlook

0

Muszę skonfigurować PHPMailer'a tak aby do wysyłki używał konta outlook.

Poniżej kod:

$mail = new PHPMailer();
$mail->IsSMTP();

$mail->Host = "smtp.office365.com";
$mail->Port = 587;
$mail->SMTPSecure = 'tls';
$mail->SMTPDebug = 4;
$mail->AuthType = 'LOGIN';
$mail->SMTPAuth = true;

$mail->Username = "xxx@xxx.pl";
$mail->Password = 'pass';

$mail->From = 'xxx@xxx.pl';
$mail->FromName = 'XXX';
$mail->AddAddress('yyy@yyy.pl', 'Test');

$mail->CharSet = 'UTF-8';
$mail->IsHTML(true);

$mail->Subject = 'Test subject';
$mail->Body    = 'Body <br>Test <strong>HTML tag</strong>';
$mail->AltBody = 'xyz';

if(!$mail->Send()){
  echo 'Mailer Error: ' . $mail->ErrorInfo;
}

Niestety całość kończy się niepowodzeniem:

2023-07-03 15:51:50 Auth method requested: LOGIN
2023-07-03 15:51:50 Auth methods available on the server: LOGIN,XOAUTH2
2023-07-03 15:51:50 CLIENT -> SERVER: AUTH LOGIN
2023-07-03 15:51:50 SMTP INBOUND: "334 eVXNlcXm5hbWUT6"
2023-07-03 15:51:50 SERVER -> CLIENT: 334 eVXNlcXm5hbWUT6
2023-07-03 15:51:50 CLIENT -> SERVER: bccxcnR5QGdsb2JhbHN5c3RlbS5jb20ucGw=
2023-07-03 15:51:50 SMTP INBOUND: "334 UGFdd311cqQ6"
2023-07-03 15:51:50 SERVER -> CLIENT: 334 UGFdd311cqQ6
2023-07-03 15:51:50 CLIENT -> SERVER: Qe3VzxxE5MDQs=
2023-07-03 15:51:59 SMTP INBOUND: "535 5.7.139 Authentication unsuccessful, the request did not meet the criteria to be authenticated successfully. Contact your administrator. [FR3P281CA0015.DEUP281.PROD.OUTLOOK.COM 2023-07-03T15:51:59.281Z 018DB7A9266F6B2134B]"
2023-07-03 15:51:59 SERVER -> CLIENT: 535 5.7.139 Authentication unsuccessful, the request did not meet the criteria to be authenticated successfully. Contact your administrator. [FR3P281CA0015.DEUP281.PROD.OUTLOOK.COM 2023-07-03T15:51:59.281Z 018DB7A9266F6B2134B]
2023-07-03 15:51:59 SMTP ERROR: Password command failed: 535 5.7.139 Authentication unsuccessful, the request did not meet the criteria to be authenticated successfully. Contact your administrator. [FR3P281CA0015.DEUP281.PROD.OUTLOOK.COM 2023-07-03T15:51:59.281Z 018DB7A9266F6B2134B]
SMTP Error: Could not authenticate.
2023-07-03 15:51:59 CLIENT -> SERVER: QUIT
2023-07-03 15:51:59 SMTP INBOUND: "221 2.0.0 Service closing transmission channel"
2023-07-03 15:51:59 SERVER -> CLIENT: 221 2.0.0 Service closing transmission channel
2023-07-03 15:51:59 Connection: closed

Czy da się to zrobić nie korzystając z XOAUTH2?

2

Masz info z prośbą o kontakt do administratora poczty, sądzę że nie masz czegoś włączonego od strony konta MS. To jest konto domenowe? Jeśli tak, to w ustawieniach na użytkowniku było do odklikania coś związanego z dodaniem możliwości wysyłki maila z aplikacji.

2

@NewUser2k13: Zmień host na smtp-mail.outlook.com. Ten co ty masz jest dla business, chyba, że to jest takie konto?
Albo nie masz SMTP authentication włączonego, https://learn.microsoft.com/en-us/exchange/clients-and-mobile-in-exchange-online/authenticated-client-smtp-submission tutaj instrukcja.

1

hej

od jakiegoś czasu jest już tls 1.2

0

@jurek1980
Tutaj jest mocno skomplikowana sytuacja.
u siebie mam subdomene, chcę wysłać tak jakby z maila pod główną domeną ale MX skierowany jest na outlook :P

@Dregorio po zmianie hosta na wskazany nadal ten sam problem.

@sight w jakim sensie? SMTPSecure ma przyjąć jakąś inną wartość?

Niestety ja nie jestem adminem. Raczej zakładam, że jest to bussiness.
Dostępów na pewno nie dostanę żeby samemu tam poszperać. Niestety jak to zwykle bywa jest umywanie rączek i każdy szuka błędów u innych, a nie u siebie ;P

0

Na razie wyślij cokolwiek wewnątrz sieci (znaczy na maile w tej samej domenie). Potem kombinuj z wysłaniem na zewnątrz.

0

@NewUser2k13: Da się to zrobić. Ostatnio robiłem jedną taką integrację i na pewno jest kilka ustawień po stronie samego Outlooka (w sensie konta Office 365), przynajmniej u mnie tak było. Generalnie do tego użyłem https://www.php-imap.com/api/client-manager.

Później już prosto:

$this->clientManager = new ClientManager();
$this->client = $this->clientManager->make([
  'host' => 'outlook.office365.com',
  'port' => 993,
  'encryption' => 'tls',
  'validate_cert' => false,
  'username' => $this->email,
  'password' => $this->accessToken,
  'protocol' => 'imap',
  'authentication' => 'oauth'
]);
$this->client->connect();

Email masz, accessToken generujesz przez CURL:
URL: https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS,
  http_build_query([
    'client_id' => $this->clientId,
    'client_secret' => $this->clientSecret,
    'scope' => $this->scope,
    'grant_type' => 'client_credentials'
  ])
);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$curlResult = curl_exec($ch);

clientSecret oraz scope są wartościami pobranymi z administratora office 365

Tenant znajdziesz tutaj: https://learn.microsoft.com/pl-pl/sharepoint/find-your-office-365-tenant-id (dla Azure w moim przypadku) oraz tutaj masz inne wartości:
https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow#redirect-uris-for-single-page-apps-spas jakie będą Cię interesowały:
The {tenant} value in the path of the request can be used to control who can sign into the application. Valid values are common, organizations, consumers, and tenant identifiers. For guest scenarios where you sign a user from one tenant into another tenant, you must provide the tenant identifier to sign them into the resource tenant. For more information, see Endpoints.

0

Temat niestety nadal nie rozwiązany.
Jeśli ktoś chce, to na forum w "Ogłoszenia drobne" małe zlecenie na taki skrypcik :)

0

Jak dla mnie nie wina PHPMailera. Na koncie możesz ustawić zwykłą autoryzację SMTP, zwykłe wysyłanie przez SMTP. Myślę, że uprawnień administratora na Outlook nie dasz postronnej osobie, a bez ustawień tam, nie ruszysz.

0

@jurek1980 sprawa skomplikowana. Tworzyłem apkę dla pewnej firmy. Oni bez naszej wiedzy przenieśli usługi pocztowe do Outlooka i teraz chcą aby im skonfigurować skrzynkę pod o365. Pieczę nad administracją ma jeszcze inna firma i oni ani nam ani nikomu dostępów nie dadzą. Uparli się, że musi być 0Auth i nic innego w grę nie wchodzi. Skrzynka służy TYLKO do wysyłania (nie ma tam pobierania maili i innych tego typu operacji).

0

Rozumiem, ale nawet przy OAuth trzeba było odklikać kilka opcji w ustawieniach konta. W tym linku co wrzuciłem jest podlinkowana reszta np. https://learn.microsoft.com/en-us/exchange/client-developer/legacy-protocols/how-to-authenticate-an-imap-pop-smtp-application-by-using-oauth#register-your-application
Jak się dogadacie co do ustawień to pewnie i kod od @leonpro778 zadziała.
Jak nie będą współpracować to nic nie zrobisz.

0

Ostatnio musiałem wysyłać maile via office 365, nie znalazłem sposobu by skonfigurować połączenie bez oauth, więc albo admin usługi da ci dane do takiego logowania, albo poinformuj go że bez tego się nie da.
To zmiana od MS w celu zwiększenia bezpieczeństwa.
Skoro się uparli na oauth to muszą dać Ci dane, aby to umożliwić.

Ja wykorzystałem chilkat i tu jest to dobrze opisane: https://cknotes.com/office365-modern-authentication-for-imap-pop3-and-smtp/

0

http://infinityhost.ct8.pl/records/outlook.mp4

Kod błędu PHPMailera

2023-07-03 15:51:59 SERVER -> CLIENT: 535 5.7.139 Authentication unsuccessful, the request did not meet the criteria to be authenticated successfully. Contact your administrator. [FR3P281CA0015.DEUP281.PROD.OUTLOOK.COM 2023-07-03T15:51:59.281Z 018DB7A9266F6B2134B]

Kody błędu OAuth2.0 (jaki to był tytuł tego filmu "lost in translation"?)

 Error Response

   The authorization server responds with an HTTP 400 (Bad Request)
   status code (unless specified otherwise) and includes the following
   parameters with the response:

   error
         REQUIRED.  A single ASCII [USASCII] error code from the
         following:

         invalid_request
               The request is missing a required parameter, includes an
               unsupported parameter value (other than grant type),
               repeats a parameter, includes multiple credentials,
               utilizes more than one mechanism for authenticating the
               client, or is otherwise malformed.

         invalid_client
               Client authentication failed (e.g., unknown client, no
               client authentication included, or unsupported
               authentication method).  The authorization server MAY
               return an HTTP 401 (Unauthorized) status code to indicate
               which HTTP authentication schemes are supported.  If the
               client attempted to authenticate via the "Authorization"
               request header field, the authorization server MUST
               respond with an HTTP 401 (Unauthorized) status code and
               include the "WWW-Authenticate" response header field
               matching the authentication scheme used by the client.

         invalid_grant
               The provided authorization grant (e.g., authorization
               code, resource owner credentials) or refresh token is
               invalid, expired, revoked, does not match the redirection
               URI used in the authorization request, or was issued to
               another client.

         unauthorized_client
               The authenticated client is not authorized to use this
               authorization grant type.

         unsupported_grant_type
               The authorization grant type is not supported by the
               authorization server.

         invalid_scope
               The requested scope is invalid, unknown, malformed, or
               exceeds the scope granted by the resource owner.

         Values for the "error" parameter MUST NOT include characters
         outside the set %x20-21 / %x23-5B / %x5D-7E.

   error_description
         OPTIONAL.  Human-readable ASCII [USASCII] text providing
         additional information, used to assist the client developer in
         understanding the error that occurred.
         Values for the "error_description" parameter MUST NOT include
         characters outside the set %x20-21 / %x23-5B / %x5D-7E.

   error_uri
         OPTIONAL.  A URI identifying a human-readable web page with
         information about the error, used to provide the client
         developer with additional information about the error.
         Values for the "error_uri" parameter MUST conform to the
         URI-reference syntax and thus MUST NOT include characters
         outside the set %x21 / %x23-5B / %x5D-7E.

I coś o samym OAuth2.0 z wikipedii

W teorii OAuth 2.0 okazuje się rozwiązaniem mniej skomplikowanym, udoskonalonym, jednak liczne 
niedomówienia w oficjalnej dokumentacji OAuth 2.0 sprawiają, że aspekt bezpieczeństwa w tym 
protokole jest dosyć naciągany. Z owego powodu główny autor specyfikacji projektu – Eran Hammer-
Lahav zrezygnował z pełnionej funkcji, wycofał się z grupy roboczej IETF oraz usunął swoje 
personalia z koncepcji OAuth 2.0. Redaktor podkreślił, że różnica pomiędzy wersjami 2.0 a 1.0 jest 
bardzo widoczna, ale w negatywnym aspekcie. Według niego OAuth 2.0 stał się „bardziej złożony, 
mniej interoperacyjny, mniej przydatny, bardziej niekompletny, a co najważniejsze, mniej 
bezpieczny”[13]. Następnie, z niewyjaśnionych przyczyn z szeregów grupy wycofał się także David 
Recordon[w innych językach], a rolę głównego redaktora – tuż przed oficjalnym opublikowaniem OAuth 
2.0 w październiku 2012 r. objął Dick Hardt[w innych językach].

Nie twierdzę, że to jest złe, chłopaki dali z siebie pewnie wszystko, a ci co zostali zapewne są teraz konsultantami od spraw bezpieczeństwa he he

Patrzę na te wszystkie biblioteki phpmailera i tam w prawie każdym pliku adres mailowy. W kodzie do wysyłania maili. Obłęd.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.