gpt4 book ai didi

.net - 是否可以像 Outlook RTF/TNEF 那样在 html 电子邮件中嵌入非图像附件?

转载 作者:行者123 更新时间:2023-12-04 15:32:17 24 4
gpt4 key购买 nike

当您使用 Outlook 发送电子邮件时,您可以选择 RTF 格式而不是 HTML,从而允许您在电子邮件正文中嵌入 PDF 等附件。当您附加多个文件并希望在正文中引用它们时,这会非常方便。如果您在 Outlook 中选择 HTML 格式,这将不再可能,并且附加图像会出现在电子邮件正文之外(如“正常”)。

我正在以编程方式发送电子邮件,想知道是否可以以某种方式在电子邮件正文中嵌入附件。 You can do this with images ,使用像 <img src="cid:image_id@somethingorother" /> 这样的标签引用多部分电子邮件中的嵌入图像。有没有办法用其他类型的附件来做到这一点?

我主要对使用 Outlook 作为邮件客户端向所有位于同一 MS Exchange 电子邮件服务器上的收件人发送电子邮件的场景感兴趣。有时他们会使用不同的电子邮件客户端,或从外部发送,如果电子邮件在这种情况下降级为“正常”附件,那也没关系。

我也可以使用 RTF/TNEF格式,但是:

  • 这似乎很难,而且
  • 我的电子邮件的内容是 html,所以我首先必须将 RTF 转换为 HTML。
  • 最佳答案

    我决定不那么懒惰,自己尝试一下......

    答案是肯定的,您可以使用 <a href='cid:...'> . </a> 引用 html 电子邮件中的非图像附件。标签,Outlook 将打开它们。我使用 Outlook 2013 作为我的电子邮件客户端和 Office365 作为我的服务器;里程因不同的客户端和服务器而异。但是,如果您不使用 Outlook,则效果不佳...

    Gmail

    我也测试过发送到 gmail。内嵌图像工作正常,但附件不行。 <a>链接显示但不起作用,如果您使用 cid:... 引用附件即使使用 disposition:attachment :( gmail iPhone 应用程序上的相同行为:内嵌图像看起来不错,内嵌附件不显示或从 <a> 链接打开。

    iPhone 邮箱

    iPhone 的邮件应用程序(连接到 Office 365)呈现 <a>标签作为链接,但它们不起作用。如果您将附件处置设置为“附件”(即不是“内联”),那么附件将显示在电子邮件的底部,这与 gmail 在这种情况下隐藏它们不同。如果您将附件处置设置为“内联”,则它会隐藏附件。

    因此,如果您有 gmail 收件人/电子邮件客户端,您需要做一些不同的事情,甚至可能附加文件两次:一次作为处置:内联(链接到正文内),一次作为处置:附件。遗憾的是,Gmail 不显示具有 disposition:attachment 并使用 cid 引用的附件,因为这至少意味着有一种方法可以访问它们。如果有人有任何建议,请告诉我!

    示例代码

    这是我用于测试的 powershell,使用 EWS。它会发送一封 html 电子邮件,其中包含

  • 嵌入的图像(永远不会显示为“附件”)
  • .pdf 链接到 <a>标记,标记为内联。在 Outlook 中,这不会显示为附件,但可以从链接访问。在 Gmail 和 iOS 邮件中,这不会显示为附件,也无法从链接访问。
  • <a> 链接的 .docx 文件标记并标记为附件。在 Outlook 中,这显示为附件,也可以从链接访问。在 gmail 中,这不会显示,并且无法从链接中使用。在 iOS 邮件中,这显示为附件,但无法从链接访问。
  • 相同的 .docx 文件再次标记为附件且未与 <a> 链接标签。这在 Outlook、gmail、iOS 邮件中作为附件可见。

  • 电源 shell :
    $to1 = 'your-email@gmail.com'
    $to2 = 'your-email@your-domaincom'
    $subject = 'Test email with embedded attachments'
    $body = '
    This email shows embedded attachments. Yay. <br/><br/>
    Here is an image: <img src="cid:img1@your-domain.com" /><br/>
    More amazingly, <a href="cid:att1@your-domain.com">here</a> is a pdf.<br/>
    And <a href="cid:att2@your-domain.com">here</a> is a word doc!<br/><br/>
    '
    # fyi - the '@your-domain.com' in the id is optional but somewhere I read
    # that email clients might like it more if it's included. Doesn't need to
    # be a real domain.

    # change these paths to something that exists
    $image1Path = "C:\temp\an_image.jpg"
    $attachment1Path = "C:\temp\some_file.pdf"
    $attachment2Path = "C:\temp\some_doc.docx"

    #prompt for Office365 creds
    $Credential = Get-Credential

    #Load the EWS Managed API Assembly - you need it installed first!!
    Add-Type -Path 'C:\Program Files (x86)\Microsoft\Exchange\Web Services\2.1\Microsoft.Exchange.WebServices.dll'

    #Instantiate the EWS service object
    $service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService

    #Set the credentials for Exchange Online
    $service.Credentials = New-Object Microsoft.Exchange.WebServices.Data.WebCredentials -ArgumentList $Credential.UserName, $Credential.GetNetworkCredential().Password

    #Autodiscover doesn't seem to work for my office365; set it manually
    $service.Url = 'https://outlook.office365.com/EWS/Exchange.asmx'
    #This might work for you instead:
    # $service.AutodiscoverUrl($Credential.UserName, {$true})

    #Create the email message and set the Subject and Body
    $message = New-Object Microsoft.Exchange.WebServices.Data.EmailMessage -ArgumentList $service
    $message.Subject = $subject
    $message.Body = $body
    $null = $message.ToRecipients.Add($to1)
    $null = $message.ToRecipients.Add($to2)
    $att = $message.Attachments.AddFileAttachment($image1Path)
    $att.ContentId = 'img1@your-domain.com'
    $att.IsInline=$true
    $att = $message.Attachments.AddFileAttachment($attachment1Path)
    $att.ContentId = 'att1@your-domain.com'
    $att.IsInline=$true
    $att = $message.Attachments.AddFileAttachment($attachment2Path)
    $att.ContentId = 'att2@your-domain.com'
    $att.IsInline=$false

    # add the same attachment again with a different name to see if it's
    # rendered differently.
    $att = $message.Attachments.AddFileAttachment('no_cid.docx', $attachment2Path)
    $att.IsInline=$false

    #Send the message and save a copy in the Sent Items folder
    $message.SendAndSaveCopy()

    还有一些方便的文章:
  • Send Email from Exchange Online by Using PowerShell
  • Adding inline attachments by using the EWS Managed API 2.0
  • 关于.net - 是否可以像 Outlook RTF/TNEF 那样在 html 电子邮件中嵌入非图像附件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30133928/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com