Отправить содержимое CSV по электронной почте в таблицу - PullRequest
0 голосов
/ 03 декабря 2018

Я нахожусь в процессе разработки сценария powershell, который берет данные из CSV из пяти столбцов, разделенных запятыми, и загружает их в таблицу HTML с пятью столбцами для отправки по электронной почте.В настоящее время код выводит только одну строку вместо 15 строк в файле CSV.Можете ли вы помочь мне распечатать 15 строк из таблицы CSV в таблицу?

$current_date = Get-Date
$current_date.ToUniversalTime()

$server_name = $env:COMPUTERNAME

$file = Get-Content .\data_file.csv 
Write-Output "file length: " $file.Length
for ($i = 1; $i -lt $file.Length; $i++) {
    $firstname = ([string]$file[$i]).Split(',')[0];
    $lastname = ([string]$file[$i]).Split(',')[1]; 
    $gender = ([string]$file[$i]).Split(',')[2]; 
    $age = ([string]$file[$i]).Split(',')[3];
    $dob = ([string]$file[$i]).Split(',')[4];
}

$mailsender = @{
    Body = "<p style='font-family: Calibri;'>Audit Report as of: $current_date</p>
<table style='border-collapse: collapse; font-family: Calibri;'>
    <tr style='border: 1px solid #dddddd;text-align: left;padding: 8px;background-color:#f7f7f7;'>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>First Name</th>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>Last Name</th>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>Gender</th>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>Age</th>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>DoB</th>
    </tr>
    <tr style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>$firstname</td>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>$lastname</td>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>$gender</td>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>$age</td>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>$dob</td>
    </tr>
</table>"
    From = 'john.doe@email.com'
    To = 'john.doe@email.com'
    SmtpServer = 'mailhost.net'
    BodyAsHtml = $true
    Subject = "[$env:COMPUTERNAME] Audit Report"
}

Send-MailMessage @mailsender

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Используйте Import-Csv для чтения ваших данных и ConvertTo-Html для преобразования их в HTML.Добавьте CSS в качестве заголовка.

$style = @'
<style>
table {font-family: Calibri;}
th {border: 1px solid #dddddd;text-align: left;padding: 8px;background-color:#f7f7f7;}
tr {border: 1px solid #dddddd;text-align: left;padding: 8px;}
</style>
'@

$mailsender = @{
    'Body' = Import-Csv .\data_file.csv | ConvertTo-Html -Header $style
    ...
}

Если вам нужно поместить дополнительный контент в тело HTML, а не только в таблицу, преобразуйте свою дату во фрагмент HTML и используйте этот фрагмент при создании окончательного HTML:

$data = Import-Csv .\data_file.csv | ConvertTo-Html -Fragment
$html = @"
<html>
<head>
<style>
table {font-family: Calibri;}
th {border: 1px solid #dddddd;text-align: left;padding: 8px;background-color:#f7f7f7;}
tr {border: 1px solid #dddddd;text-align: left;padding: 8px;}
</style>
</head>

<body>
<p>Some text.</p>
${data}
</body>
</html>
"@

$mailsender = @{
    'Body' = $html
    ...
}
0 голосов
/ 03 декабря 2018

Командлет Import-Csv будет служить вам лучше, чем разделение строк.Попробуйте импортировать CSV и создать строки в цикле следующим образом:

$current_date = Get-Date
$current_date.ToUniversalTime()

$server_name = $env:COMPUTERNAME

$csv = Import-Csv ".\my_file.csv"
$html = ""
foreach ($row in $csv) {
    $html += "<tr style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>"
    $html += "<th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>$($row.firstname)</td>"
    $html += "<th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>$($row.lastname)</td>"
    $html += "<th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>$($row.gender)</td>"
    $html += "<th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>$($row.age)</td>"
    $html += "<th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>$($row.dob)</td>"
    $html += "</tr>"
}

$mailsender = @{
    Body       = "<p style='font-family: Calibri;'>Audit Report as of: $current_date</p>
<table style='border-collapse: collapse; font-family: Calibri;'>
    <tr style='border: 1px solid #dddddd;text-align: left;padding: 8px;background-color:#f7f7f7;'>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>First Name</th>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>Last Name</th>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>Gender</th>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>Age</th>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>DoB</th>
    </tr>
    $html    
</table>"
    From       = 'john.doe@email.com'
    To         = 'john.doe@email.com'
    SmtpServer = 'mailhost.net'
    BodyAsHtml = $true
    Subject    = "[$env:COMPUTERNAME] Audit Report"
}
0 голосов
/ 03 декабря 2018

Вам нужно определить переменную в цикле for и добавить в нее каждый набор строк таблицы, а затем вызвать переменную в объявлении Body:

$current_date = Get-Date
$current_date.ToUniversalTime()

$server_name = $env:COMPUTERNAME

$file = Get-Content .\data_file.csv 
Write-Output "file length: " $file.Length
for ($i = 1; $i -lt $file.Length; $i++)
{ 
$firstname = ([string]$file[$i]).Split(',')[0] ;
$lastname = ([string]$file[$i]).Split(',')[1] ; 
$gender = ([string]$file[$i]).Split(',')[2] ; 
$age = ([string]$file[$i]).Split(',')[3] ; 
$dob = ([string]$file[$i]).Split(',')[4] ;

$data += "<tr style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>$firstname</td>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>$lastname</td>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>$gender</td>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>$age</td>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>$dob</td>
    </tr>"
}

$mailsender=@{
Body="<p style='font-family: Calibri;'>Audit Report as of: $current_date</p>
<table style='border-collapse: collapse; font-family: Calibri;'>
    <tr style='border: 1px solid #dddddd;text-align: left;padding: 8px;background-color:#f7f7f7;'>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>First Name</th>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>Last Name</th>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>Gender</th>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>Age</th>
        <th style='border: 1px solid #dddddd;text-align: left;padding: 8px;'>DoB</th>
    </tr>
    $data
</table>"
From='john.doe@email.com'
To='john.doe@email.com'
   SmtpServer='mailhost.net'
    BodyAsHtml=$true
    Subject="[$env:COMPUTERNAME] Audit Report"
}

Send-MailMessage @mailsender
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...