MS PowerShell или Graph API сворачивают Chr(32) (ТЕКСТ) и отключают html-адрес электронной почты (HTML)

#powershell #email #formatting #ascii #sendmail

Вопрос:

Я обновляю старое приложение ms office для уведомлений по электронной почте (vba, вызывающее скрипт powershell), чтобы использовать ГРАФИК для проверки подлинности/функции электронной почты. Все работает правильно, за исключением того, что тело письма возвращается неверно в двух сценариях. Как «HTML», текст обрезается в середине тега, и печатается полная часть тега. И «ТЕКСТ»… Символы Char(32) сворачиваются в один пробел, что приводит к форматированию. Попробовал заменить на символ(160), и символ печатается в пробелах(160).

Пожалуйста, посоветуйте. ТЕКСТ — Символ(32):
ТЕКСТ - Символ(32)

ТЕКСТ — Символ(160):
ТЕКСТ - Символ(160)

Пример HTML:
Пример HTML

Скрипт

 $mailuser = $args[0]
$emailTo = $args[1]
$emailCC = $args[2]
$emailSubject = $args[3]
$emailBody = $args[4]

$ClientID       = "XXX"        # Should be a ~36 hex character string; insert your info here
$ClientSecret   = "XXX"    # Should be a ~44 character string; insert your info here
$tenantdomain   = "xxx"    # For example, contoso.onmicrosoft.com

$loginURL       = "https://login.microsoft.com"
$resource       = "https://graph.microsoft.com"

$body       = @{grant_type="client_credentials";resource=$resource;client_id=$ClientID;client_secret=$ClientSecret}
$oauth      = Invoke-RestMethod -Method Post -Uri $loginURL/$tenantdomain/oauth2/token?api-version=1.0 -Body $body 

$getheaderParams = @{'Authorization'="$($oauth.token_type) $($oauth.access_token)"} 
$postheaderParams = @{'Authorization'="$($oauth.token_type) $($oauth.access_token)"; 'Content-Type' = 'application/json'} 
$userurl = "https://graph.microsoft.com/v1.0/users/$UID" 

$mailurl = "https://graph.microsoft.com/v1.0/users/$mailuser/sendMail"

$mailjson = @"
{
"message": {
"subject": "$emailSubject",
"body": {
      "contentType": "HTML",
      "content": "$emailBody"
    },
    "toRecipients": [
      {
        "emailAddress": {
          "address": "$emailTo"
        }
      }
    ],
    "ccRecipients": [
      {
        "emailAddress": {
          "address": "$emailCC"
        }
      }
    ]
  },
  "saveToSentItems": "false"
}
"@ 

Invoke-WebRequest -UseBasicParsing -Headers $postheaderParams -Uri $mailurl -method POST -body $mailjson

    email_from_name = Me.sender_name_txt.Value
email_from_email = Me.sender_email_txt.Value
email_subject = Me.subject_txt
email_body_top = Me.email_body_1_txt
email_body_bot = Me.email_body_2_txt
email_to_email = ""

Set b_email = CurrentDb.OpenRecordset("Bank_Email_List")
b_email.MoveFirst

If Me.Test_Emails_chk = True Then
    email_to_email = email_from_email
    email_cc_email = Me.cc_email_txt.Value
Else
    Do Until b_email.EOF
        email_to_email = email_to_email amp; b_email("Email").Value amp; "; "
        b_email.MoveNext
    Loop
    email_cc_email = Me.cc_email_txt.Value
End If

Set rstdiscrepancies = CurrentDb.OpenRecordset("Bank_Aging_Schedule")
rstdiscrepancies.MoveFirst
 

VBA — построение электронной почты

 email_as_total = 0
email_as_LT30 = 0
email_as_GT30 = 0
email_as_GT60 = 0
email_as_GT90 = 0
email_as_GT120 = 0
email_as_GT180 = 0

'Table header
email_body_as = "<html><b>Aging Schedule:</b><br />"
email_body_as = email_body_as amp; "<table style='width:75%'><tr><th align = 'right' >Total Outstanding</th><th align = 'right' >amp;lt= 30 Days</th><th align = 'right'>amp;gt 30 Days</th><th align = 'right'>amp;gt 60 Days</th><th align = 'right'>amp;gt 90 Days</th><th align = 'right'>amp;gt 120 Days</th><th align = 'right'>amp;gt 180 Days</th></tr>"

email_body_stmt = "<b>Location Summary:</b><br/><table style='width:75%'><tr><th align = 'Left' >Location</th><th align = 'right' >Total</th><th align = 'right' >amp;lt= 30 Days</th><th align = 'right'>amp;gt 30 Days</th><th align = 'right'>amp;gt 60 Days</th><th align = 'right'>amp;gt 90 Days</th><th align = 'right'>amp;gt 120 Days</th><th align = 'right'>amp;gt 180 Days</th></tr>"
    
'Table body
Do While rstdiscrepancies.EOF = False
    email_body_stmt = email_body_stmt amp; "<tr><td>" amp; Format(rstdiscrepancies("Store").Value, "000") amp; "</td> "
    email_body_stmt = email_body_stmt amp; "<td align = 'right'>" amp; Format(rstdiscrepancies("SumOfAmount").Value, "Standard") amp; "</td>"
    email_body_stmt = email_body_stmt amp; "<td align = 'right'>" amp; Format(rstdiscrepancies("LT30").Value, "Standard") amp; "</td>"
    email_body_stmt = email_body_stmt amp; "<td align = 'right'>" amp; Format(rstdiscrepancies("GT30").Value, "Standard") amp; "</td>"
    email_body_stmt = email_body_stmt amp; "<td align = 'right'>" amp; Format(rstdiscrepancies("GT60").Value, "Standard") amp; "</td>"
    email_body_stmt = email_body_stmt amp; "<td align = 'right'>" amp; Format(rstdiscrepancies("GT90").Value, "Standard") amp; "</td>"
    email_body_stmt = email_body_stmt amp; "<td align = 'right'>" amp; Format(rstdiscrepancies("GT120").Value, "Standard") amp; "</td>"
    email_body_stmt = email_body_stmt amp; "<td align = 'right'>" amp; Format(rstdiscrepancies("GT180").Value, "Standard") amp; "</td></tr>"
    email_as_total = email_as_total   rstdiscrepancies("SumOfAmount").Value
    email_as_LT30 = email_as_LT30   rstdiscrepancies("LT30").Value
    email_as_GT30 = email_as_GT30   rstdiscrepancies("GT30").Value
    email_as_GT60 = email_as_GT60   rstdiscrepancies("GT60").Value
    email_as_GT90 = email_as_GT90   rstdiscrepancies("GT90").Value
    email_as_GT120 = email_as_GT120   rstdiscrepancies("GT120").Value
    email_as_GT180 = email_as_GT180   rstdiscrepancies("GT180").Value
    rstdiscrepancies.MoveNext
    
    If rstdiscrepancies.EOF = True Then
        email_body_as = email_body_as amp; "<td align = 'right'><b>" amp; Format(email_as_total, "Currency") amp; "</b></td> "
        email_body_as = email_body_as amp; "<td align = 'right'>" amp; Format(email_as_LT30, "Standard") amp; "</td> "
        email_body_as = email_body_as amp; "<td align = 'right'>" amp; Format(email_as_GT30, "Standard") amp; "</td> "
        email_body_as = email_body_as amp; "<td align = 'right'>" amp; Format(email_as_GT60, "Standard") amp; "</td> "
        email_body_as = email_body_as amp; "<td align = 'right'>" amp; Format(email_as_GT90, "Standard") amp; "</td> "
        email_body_as = email_body_as amp; "<td align = 'right'>" amp; Format(email_as_GT120, "Standard") amp; "</td> "
        email_body_as = email_body_as amp; "<td align = 'right'>" amp; Format(email_as_GT180, "Standard") amp; "</td></tr> "
        email_as_total = 0
        email_as_LT30 = 0
        email_as_GT30 = 0
        email_as_GT60 = 0
        email_as_GT90 = 0
        email_as_GT120 = 0
        email_as_GT180 = 0
    End If
Loop

email_body_stmt = email_body_stmt amp; "<tr><td>" amp; "" amp; "</td> "
email_body_stmt = email_body_stmt amp; "<td>" amp; "" amp; "</td> "
email_body_stmt = email_body_stmt amp; "<td>" amp; "" amp; "</td> "
email_body_stmt = email_body_stmt amp; "<td>" amp; "" amp; "</td> "
email_body_stmt = email_body_stmt amp; "<td>" amp; "" amp; "</td> "

email_body = email_body_top amp; "<br><br>"
email_body = email_body amp; email_body_as amp; "</table><br> "
email_body = email_body amp; email_body_stmt amp; "</table><br> "
email_body = email_body amp; email_body_bot amp; "<br></html> "

Test = Send_MS_GRAPH_Email(email_from_email, email_to_email, email_cc_email, email_subject, email_body)
 

Конец, Если

Me.Test_Emails_chk = Верно

Конец Под ‘Отправляет функцию электронной почты Send_MS_GRAPH_Email(по электронной почте, по электронной почте, по электронной почте, Тема, Тело)

PID = Оболочка(«POWERSHELL.exe -ноэксит C:ExcelAddinemail_script.ps1 ‘» amp; Отправлено по электронной почте amp; «‘ ‘» amp; Отправлено по электронной почте amp; «‘ ‘» amp; Отправлено по электронной почте amp; «‘ ‘» amp; Тема amp; «‘ ‘» amp; Тело amp; «‘», vbHide)

Конечная Функция

Комментарии:

1. Пожалуйста, опубликуйте сценарий PowerShell

2. В html вы не должны пытаться выровнять текст с помощью пробелов, потому что пробелы нормализуются, если вы не помещаете этот текст в <pre>..</pre> теги. Почему бы не создать красивую таблицу?

3. Спасибо, Тео. Все форматирование выполняется с использованием тегов в версии HTML. Это две отдельные проблемы. Перекрыты дороги в обоих направлениях.

4. Добавлен сценарий PowerShell. Использование для обеих ситуаций изменения «Типа содержимого»: «HTML» на «Тип содержимого»: «ТЕКСТ» для сценария.

5. ..но $emailBody = $args[4] все равно не раскрывает, что на самом деле находится внутри этой переменной..