In this tutorial i will show how to read outlook office 365 emails using oauth in PHP, Outlook.com is a web-based email and calendar etc services from Microsoft. One of the world’s first webmail services.
A running demo and code for download available below.
I will guide you step by step through pictures and code.
Step 1:- Go to https://apps.dev.microsoft.com/ and Click on “Add an app”

Step 2:- Input your application name and create.

Step 3:- You will get application id now create application secret, click Generate New Password button.

Step 4:- Copy that password and store it you will not see it again.


Step 5:- Now add Platform and select platform.

Select Web platform.

Step 6:- Add your application redirect url “https://phplift.net/demos/outlook-office365/redirect.php” (Your url would be different) you can add multiple redirect urls.

Click on save button that’s it your app is configured now coding time.
Coding:
config.php Contain Application id, sec etc.
<?php
session_start();
// define your api credentils and redirect url
define("client_id", "YOUR-APPLICATION-ID");
define("client_secret", "YOUR-APPLICATION-SECRET");
define("redirect_uri", "YOUR-APPLICATION-REDIRECT-URI");
// Static urls
define("scopes", array("offline_access", "openid","https://outlook.office.com/mail.read"));
define("accessUrl", "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=".client_id."&redirect_uri=".redirect_uri."&response_type=code&scope=".implode(" ", scopes));
define("token_url", "https://login.microsoftonline.com/common/oauth2/v2.0/token");
define("api_url", "https://outlook.office.com/api/v2.0");
?>
You have to change client_id, client_secret and redirect_uri with your application data.
index.php contain all functions view profile, all emails and view email.
<?php
include("config.php");
if(isset($_SESSION["access_token"])) {
echo "<a href='index.php''>Home</a>";
echo " || <a href='index.php?list_email=true'>List Email</a>";
echo " || <a href='index.php?profile=true'>Profile</a>";
echo " || <a href='logout.php'>Logout</a><br/><br/>";
if(isset($_GET["profile"])) {
view_profile();
}
else if(isset($_GET["list_email"])) {
list_email();
}
else if(isset($_GET["view_email"])) {
view_email();
}
}
else{
$accessUrl = accessUrl;
echo "<a href='$accessUrl'>Login with Office 365</a>";
}
function view_profile() {
$headers = array(
"User-Agent: phplift.net/1.0",
"Authorization: Bearer ".$_SESSION["access_token"],
"Accept: application/json"
);
$outlookApiUrl = api_url."/Me";
$response = runCurl($outlookApiUrl, null, $headers);
$response = explode("\n", trim($response));
$response = $response[count($response) - 1];
$response = json_decode($response);
echo "User ID: ".$response->Id."<br><br>";
echo "User Email: ".$response->EmailAddress;
}
function list_email() {
$headers = array(
"User-Agent: phplift.net/1.0",
"Authorization: Bearer ".$_SESSION["access_token"],
"Accept: application/json",
"X-AnchorMailbox: ". $_SESSION["user_email"]
);
$top = 10;
$skip = isset($_GET["skip"]) ? intval($_GET["skip"]) : 0;
$search = array (
// Only return selected fields
"\$select" => "Subject,ReceivedDateTime,Sender,From,ToRecipients,HasAttachments,BodyPreview",
// Sort by ReceivedDateTime, newest first
"\$orderby" => "ReceivedDateTime DESC",
// Return at most n results
"\$top" => $top, "\$skip" => $skip
);
$outlookApiUrl = api_url . "/Me/MailFolders/Inbox/Messages?" . http_build_query($search);
$response = runCurl($outlookApiUrl, null, $headers);
$response = explode("\n", trim($response));
$response = $response[count($response) - 1];
$response = json_decode($response, true);
//echo "<pre>"; print_r($response); echo "</pre>";
if(isset($response["value"]) && count($response["value"]) > 0) {
echo "<style type='text/css'>td{border: 2px solid #cccccc;padding: 30px;text-align: center;vertical-align: top;}</style>";
echo "<table style='width: 100%;'><tr><th>From</th><th>Subject</th><th>Preview</th></tr>";
foreach ($response["value"] as $mail) {
$BodyPreview = str_replace("\n", "<br/>", $mail["BodyPreview"]);
echo "<tr>";
echo "<td>".$mail["From"]["EmailAddress"]["Address"].
"<br/><a target='_blank' href='?view_email=".$mail["Id"]."'>View Email</a>";
if($mail["HasAttachments"] == 1) {
echo "<br/><a target='_blank' href='?view_attachments=".$mail["Id"]."'>View Attachments</a>";
}
echo "</td><td>".$mail["Subject"]."</td>";
echo "<td>".$BodyPreview."</td>";
echo "</tr>";
}
echo "</table>";
}
else {
echo "<div><h3><i>No email found</i></h3></div>";
}
$prevLink = "";
if($skip > 0) {
$prev = $skip - $top;
$prevLink = "<a href='?list_email=true&skip=".$prev."'>Previous Page</a>";
}
if(isset($response["@odata.nextLink"])) {
if($prevLink != "") {
$prevLink .= " ||| ";
}
echo "<br/>".$prevLink."<a href='?list_email=true&skip=".($skip + $top)."'>Next Page</a>";
}
else {
echo "<br/>" . $prevLink;
}
}
function view_email() {
$mailID = $_GET["view_email"];
$headers = array(
"User-Agent: phplift.net/1.0",
"Authorization: Bearer ".$_SESSION["access_token"],
"Accept: application/json",
"X-AnchorMailbox: ".$_SESSION["user_email"]
);
$outlookApiUrl = api_url . "/me/Messages('$mailID')";
$response = runCurl($outlookApiUrl, null, $headers);
$response = explode("\n", trim($response));
$response = $response[count($response) - 1];
$response = json_decode($response, true);
echo "From: ".$response['Sender']['EmailAddress']['Name']." (".$response['Sender']['EmailAddress']['Address'].")<br>";
echo "To: ";
foreach($response['ToRecipients'] as $to)
{
echo $to['EmailAddress']['Name']." (".$to['EmailAddress']['Name'].") ";
}
echo "<br>";
$ReceivedDateTime = date("Y-m-d H:i:s",mktime($response['ReceivedDateTime']));
echo "Received on: ".$ReceivedDateTime."<br>";
echo "Subject: ".$response['Subject']."<br><br><hr />";
echo $response['Body']['Content'];
}
?>
view_profile() Show authorized users profile and email address.
list_email() Show all emails in your inbox.
view_email() Show a particular email
redirect.php file contain code to extract access token from code and store access token and user email in session.
<?php
include("config.php");
if(isset($_GET["code"])){
// Get access token
$token_request_data = array (
"grant_type" => "authorization_code",
"code" => $_GET["code"],
"redirect_uri" => redirect_uri,
"scope" => implode(" ", scopes),
"client_id" => client_id,
"client_secret" => client_secret
);
$body = http_build_query($token_request_data);
$response = runCurl(token_url, $body);
$response = json_decode($response);
$_SESSION["access_token"] = $response->access_token;
// Get user email
$headers = array(
"User-Agent: phplift.net/1.0",
"Authorization: Bearer ".$_SESSION["access_token"],
"Accept: application/json"
);
$outlookApiUrl = api_url."/Me";
$response = runCurl($outlookApiUrl, null, $headers);
$response = explode("\n", trim($response));
$response = $response[count($response) - 1];
$response = json_decode($response);
$_SESSION["user_email"] = $response->EmailAddress;
header("Location: index.php");
}
?>
Code finished now you have to run index.php file it will show you a link to login with office 365.
I hope you liked this tutorial feel free to comment below if you face any issue I love to solve your issues.
5 Comments
Anuj
April 20, 2021 at 12:03 pmWhen i was run this script i got this error
Uncaught Error: Call to undefined function runCurl()
please help
tommie
April 9, 2022 at 11:12 amI got the same error, did you manage to debug it?
Indhu
August 9, 2022 at 12:19 pmPlease do post runCurl() funtion code.
Priya
August 9, 2022 at 12:22 pmPlease do post runCurl() funtion code.
Samay
September 21, 2022 at 4:58 amWhen i was run this script i got this error
Uncaught Error: Call to undefined function runCurl()
But I made a Custom function
function runCurl($token_url, $token_request_data){
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $token_url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false, // “”,
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_POST => 1,
// CURLOPT_CUSTOMREQUEST => “POST”, // 1″ instead.
CURLOPT_POSTFIELDS => $token_request_data, // array(
“application/x-www-form-urlencoded” //EmailAddress;
I did not got the user_email
I have no response from api URL
Pls help