#powershell #email #formatting #ascii #sendmail
Вопрос:
Я обновляю старое приложение ms office для уведомлений по электронной почте (vba, вызывающее скрипт powershell), чтобы использовать ГРАФИК для проверки подлинности/функции электронной почты. Все работает правильно, за исключением того, что тело письма возвращается неверно в двух сценариях. Как «HTML», текст обрезается в середине тега, и печатается полная часть тега. И «ТЕКСТ»… Символы Char(32) сворачиваются в один пробел, что приводит к форматированию. Попробовал заменить на символ(160), и символ печатается в пробелах(160).
Пожалуйста, посоветуйте. ТЕКСТ — Символ(32):
Скрипт
$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]
все равно не раскрывает, что на самом деле находится внутри этой переменной..