• Support
  • SMTP - Application password for Office365

Hello everyone, I would like to configure my Office365 account on ITFLOW, but I can’t seem to do it. I’ve tried enabling SMTP and using an application password, but I don’t get any error messages, just emails pending. Same for IMAP when I test. No error messages either. Where can I view the logs? Thank you for your help.

    AlexSela Microsoft doesn't support SMTP/IMAP authentication anymore only "modern" OAuth 2 , and itflow doesn't support OAuth 2 - yet

    Scroll thru the forum here, there was a lot of chatting on this topic

    Thank you all for your help. In Exchange, you can set up connectors to allow sending emails without authentication by verifying the sender’s IP address. I’m currently doing this with Tactical RMM, and it works. However, I’ll be setting up a proxy to manage OAuth. Thanks again for your help.

      johnny Great, thanks! But in the case of receiving requests via email, IMAP doesn’t work by default on Office365. Would you recommend using another solution?

        Chatgpt on implementing OAuth2 - I'm just curious to see what @johnny and @wrongecho have to say about it - check out the details

        Given that you use **PHPMailer** and **PHP Mime Mail Parser**, you can definitely integrate them with OAuth2 for your Microsoft 365 account. Here's how to approach the task using these libraries:

        ### 1. **Sending Emails with PHPMailer and OAuth2**

        Since Microsoft 365 requires OAuth2 for authentication, you need to configure **PHPMailer** to authenticate with OAuth2.

        #### Install PHPMailer and Required Dependencies

        You probably already have PHPMailer, but if not, install it along with the OAuth2 client:

        ```bash

        composer require phpmailer/phpmailer league/oauth2-client

        ```

        #### OAuth2 Configuration for Sending Emails

        Here’s an updated example using **PHPMailer** to send emails using OAuth2:

        ```php

        use PHPMailer\PHPMailer\PHPMailer;

        use PHPMailer\PHPMailer\Exception;

        use League\OAuth2\Client\Provider\GenericProvider;

        require 'vendor/autoload.php';

        $oauthProvider = new GenericProvider([

        'clientId'                => 'YOUR_CLIENT_ID',
        
        'clientSecret'            => 'YOUR_CLIENT_SECRET',
        
        'redirectUri'             => 'https://yourdomain.com/redirect',
        
        'urlAuthorize'            => 'https://login.microsoftonline.com/YOUR_TENANT_ID/oauth2/v2.0/authorize',
        
        'urlAccessToken'          => 'https://login.microsoftonline.com/YOUR_TENANT_ID/oauth2/v2.0/token',
        
        'urlResourceOwnerDetails' => '',
        
        'scopes'                  => 'https://graph.microsoft.com/.default offline_access'

        ]);

        // Obtain the access token (if already obtained, retrieve from session or storage)

        $accessToken = $_SESSION['access_token'] ?? null;

        // Initialize PHPMailer

        $mail = new PHPMailer(true);

        try {

        $mail->isSMTP();
        
        $mail->Host = 'smtp.office365.com';
        
        $mail->SMTPAuth = true;
        
        $mail->AuthType = 'XOAUTH2';
        
        $mail->Port = 587;
        
        $mail->SMTPSecure = 'tls';
        
        // Set OAuth details
        
        $mail->setOAuth(new \\PHPMailer\\PHPMailer\\OAuth([
        
            'provider'       => $oauthProvider,
        
            'clientId'       => 'YOUR_CLIENT_ID',
        
            'clientSecret'   => 'YOUR_CLIENT_SECRET',
        
            'refreshToken'   => 'YOUR_REFRESH_TOKEN',
        
            'userName'       => 'youremail@yourdomain.com',  // Email associated with your MS365 account
        
            'accessToken'    => $accessToken
        
        ]));
        
        // Recipients
        
        $mail->setFrom('you@example.com', 'Your Name');
        
        $mail->addAddress('recipient@example.com');
        
        // Content
        
        $mail->isHTML(true);
        
        $mail->Subject = 'Subject';
        
        $mail->Body = 'Body of the email';
        
        $mail->send();
        
        echo 'Message has been sent';

        } catch (Exception $e) {

        echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";

        }

        ```

        This setup uses **OAuth2** to authenticate with the Microsoft 365 SMTP server. The access token is retrieved using the OAuth2 client (like `league/oauth2-client`), and PHPMailer uses the token to send the email.

        ### 2. **Receiving Emails with Microsoft Graph API and PHP Mime Mail Parser**

        **Microsoft Graph API** will be used to fetch emails, and **PHP Mime Mail Parser** will parse the email content. Here's how you can fetch and parse emails:

        #### Fetching Emails with Microsoft Graph API

        First, you need to authenticate using OAuth2 (similar to the setup above for sending emails) and use the Graph API to retrieve messages:

        ```php

        $accessToken = $_SESSION['access_token'];

        // Fetch messages using Graph API

        $ch = curl_init('https://graph.microsoft.com/v1.0/me/messages');

        curl_setopt($ch, CURLOPT_HTTPHEADER, [

        'Authorization: Bearer ' . $accessToken,
        
        'Content-Type: application/json'

        ]);

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

        $result = curl_exec($ch);

        curl_close($ch);

        $emails = json_decode($result, true);

        ```

        #### Parsing Emails with PHP Mime Mail Parser

        Once you have the raw email content, you can pass it to PHP Mime Mail Parser for parsing:

        ```php

        use PhpMimeMailParser\Parser;

        $parser = new Parser();

        // Assuming $emails['value'][0]['body']['content'] contains the raw email content

        $parser->setText($emails['value'][0]['body']['content']);

        // Get the subject, body, and attachments

        $subject = $parser->getHeader('subject');

        $body = $parser->getMessageBody('text'); // You can also use 'html' for HTML emails

        $attachments = $parser->getAttachments();

        // Display or process the email content

        echo "Subject: " . $subject . "\n";

        echo "Body: " . $body . "\n";

        // Handle attachments

        foreach ($attachments as $attachment) {

        $attachment->save('/path/to/save/' . $attachment->getFilename());

        }

        ```

        ### Summary

        - **PHPMailer** can send emails with Microsoft 365 via OAuth2, using the setup mentioned above.

        - **PHP Mime Mail Parser** will work with the email content fetched from Microsoft Graph API. You can use the Graph API to retrieve emails and then parse them with PHP Mime Mail Parser.

        This approach will allow you to integrate both sending and receiving emails into your PHP web app using modern authentication with OAuth2 for Microsoft 365.

        Looks realistic to me, isn't it?

          wrongecho Quick Correction we do still use php mime mail parser for the attachments but we no longer use WEBKLEX/PHP-IMAP instead we use the php-imap and php-mailparse plugins