如何将附件转换为Base64



我有点不知所措,需要帮助。我正在尝试构建一个邮件集成工具,该工具将检查POP3和IMAP4邮箱中的电子邮件,并将它们导入另一个系统。我想导入电子邮件的系统只能将附件处理为Base64字符串。

我正在使用带有模块Mailozaurr的PowerShell 7.1(https://github.com/EvotecIT/Mailozaurr),Mailozaurr在引擎盖下使用MailKit和MimeKit,以便连接到POP3和IMAP4服务器并收集/下载/收集任何电子邮件。然后,我将把电子邮件的不同属性转换为XML对象,并将其发送到系统web api。当将电子邮件转换为XML对象时,需要将电子邮件中的任何附件添加到XML对象中,例如:

<Attachment name="filename">base64string</sch:Attachment>

我的代码现在看起来像这样,用于收集电子邮件并枚举其属性。

$pop3BasicConnParams = @{
Server = "$($configuration.host)"
Password = "$($configuration.password)"
UserName = "$($configuration.login)"
Port = $port
}
$Client = Connect-POP @pop3BasicConnParams -Options Auto
$emailItems = Get-POPMessage -Client $Client -Index 0 -Count 1
foreach ($email in $emailItems) {
$emailProperties = @{}
$emailProperties.Add("to","$($email.to.Address)")
$emailProperties.Add("from","$($email.from.Address)")
$emailProperties.Add("subject","$($email.subject)")
$emailProperties.Add("body_plain","$($email.TextBody)")
foreach ($attachment in $email.Attachments) {
if ($attachment.IsAttachment -eq 'True') {
# code to convert attachment to base64 string
$attachmentStream = $attachment.Content.Stream
$bytes = [System.IO.StreamReader]::new($attachmentStream)
$B64String = [System.Convert]::ToBase64String($bytes)
$filename = "$($attachment.Content.Filename)"
$emailProperties.Add("$filename","$base64string")
$attachment.Content.Stream.Flush()
$attachment.Content.Stream.Dispose()
}
}
}
Disconnect-POP3 -Client $Client

由于我对MailKit、MimeKit或.Net没有任何知识或经验,我不知道如何将附件转换为base64字符串(用什么替换"将附件转换成base64字符串的#代码"(。能帮我一下吗?

事先谢谢,安德斯。

--更新--

这:$filename="$($attachment.Content.Filename(">

应该是:$filename="$($attachment.Filename(";

您可能会这样做(请记住,我不擅长Powershell脚本,因此语法可能会被禁用(:

# code to convert attachment to base64 string:
# Step 1: decode the content into a memory stream (so we can get the raw bytes)
$contentStream = [System.IO.MemoryStream]::new()
$attachment.Content.DecodeTo($contentStream)
# Step 2: Get the raw content in byte array form
$bytes = $contentStream.ToArray()
# Step 3: dispose the memory stream because we don't need it anymore
$contentStream.Dispose()
# Step 4: convert the raw attachment content into a base64 string
$b64String = [System.Convert]::ToBase64String($bytes)
$filename = "$($attachment.Filename)"
$emailProperties.Add("$filename","$b64string")

还值得一提的是,您不需要周围的if ($attachment.IsAttachment -eq 'True') {,因为$email.Attachments列表已经仅限于IsAttachment为true的项目。

有一些方法可以进一步优化这一点,因为内容可能已经被base64编码(尽管它会有需要删除的换行符(,但这是一个脚本,可能不值得让它变得过于复杂。

使用.NET的Convert.ToBase64String(Byte[])方法可以很容易地将文件转换为Base64。

该方法需要一个字节数组作为输入,可以通过File.ReadAllBytes()获得。请注意,此方法需要一个绝对路径才能工作。如果您在PowerShell中使用相对路径,请首先使用Convert-Path将它们转换为绝对路径。

通用方法:

$absolutePath = Convert-Path "attachment filename"
$bytes = [System.IO.File]::ReadAllBytes($absolutePath)
$base64 = [Convert]::ToBase64String($bytes)
Write-Host $base64

相关内容

  • 没有找到相关文章

最新更新