您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

63 行
3.7KB

  1. param(
  2. [Parameter(Mandatory = $true)][string]$RequestPath,
  3. [string]$ConfigPath = (Join-Path (Split-Path -Parent $PSScriptRoot) 'config.ini')
  4. )
  5. $ErrorActionPreference = 'Stop'
  6. . (Join-Path $PSScriptRoot 'campaign-common.ps1')
  7. $context = Get-MailContext -ConfigPath $ConfigPath
  8. $request = Read-CampaignRequest $RequestPath
  9. if (-not $request.TestReceived) { throw 'Confirm that the campaign test was received before approval' }
  10. $db = Open-MailDatabase $context
  11. $transaction = $null
  12. try {
  13. $transaction = $db.BeginTransaction()
  14. $review = Get-CampaignReview $context $request $db $transaction
  15. Assert-ReviewToken $request $review
  16. $check = New-DbCommand $db "SELECT COUNT(*) FROM [AuditEvent] WHERE [Action]='campaign_test_accepted' AND [EntityId]=?" $transaction
  17. Add-TextParameter $check 'token' 100 $review.Token
  18. if ([int]$check.ExecuteScalar() -lt 1) { throw 'Send the reviewed campaign to the internal test inbox first' }
  19. $check = New-DbCommand $db "SELECT COUNT(*) FROM [AuditEvent] WHERE [Action]='campaign_approved' AND [EntityId]=?" $transaction
  20. Add-TextParameter $check 'token' 100 $review.Token
  21. if ([int]$check.ExecuteScalar() -gt 0) { throw 'This exact campaign review was already approved' }
  22. $command = New-DbCommand $db 'INSERT INTO [Campaign] ([Name],[SenderKey],[FromSnapshot],[ReplyToSnapshot],[PostalAddressSnapshot],[Subject],[TemplateVersionId],[Status],[StartAtUtc],[ApprovedAtUtc]) VALUES (?,?,?,?,?,?,?,?,?,?)' $transaction
  23. Add-TextParameter $command 'name' 200 $review.Name
  24. Add-TextParameter $command 'sender' 254 $context.Settings['SMTP_USER'].ToLowerInvariant()
  25. Add-TextParameter $command 'from' 254 $review.Identity.From
  26. Add-TextParameter $command 'reply' 254 $review.Identity.ReplyTo
  27. $null = $command.Parameters.Add('postal', [System.Data.OleDb.OleDbType]::LongVarWChar)
  28. $command.Parameters[4].Value = $review.Identity.Postal
  29. Add-TextParameter $command 'subject' 255 $review.Subject
  30. $null = $command.Parameters.Add('template', [System.Data.OleDb.OleDbType]::Integer)
  31. $command.Parameters[6].Value = $review.TemplateId
  32. Add-TextParameter $command 'status' 30 'approved_paused'
  33. $null = $command.Parameters.Add('start', [System.Data.OleDb.OleDbType]::Date)
  34. $command.Parameters[8].Value = [DateTime]::UtcNow
  35. $null = $command.Parameters.Add('approved', [System.Data.OleDb.OleDbType]::Date)
  36. $command.Parameters[9].Value = [DateTime]::UtcNow
  37. $null = $command.ExecuteNonQuery()
  38. $identity = New-DbCommand $db 'SELECT @@IDENTITY' $transaction
  39. $campaignId = [int]$identity.ExecuteScalar()
  40. foreach ($contact in $review.Contacts) {
  41. $delivery = New-DbCommand $db 'INSERT INTO [Delivery] ([CampaignId],[ContactId],[EmailKey],[Status],[AttemptCount]) VALUES (?,?,?,?,?)' $transaction
  42. $null = $delivery.Parameters.Add('campaign', [System.Data.OleDb.OleDbType]::Integer)
  43. $delivery.Parameters[0].Value = $campaignId
  44. $null = $delivery.Parameters.Add('contact', [System.Data.OleDb.OleDbType]::Integer)
  45. $delivery.Parameters[1].Value = $contact.Id
  46. Add-TextParameter $delivery 'email' 254 $contact.Key
  47. Add-TextParameter $delivery 'status' 30 'pending'
  48. $null = $delivery.Parameters.Add('attempts', [System.Data.OleDb.OleDbType]::Integer)
  49. $delivery.Parameters[4].Value = 0
  50. $null = $delivery.ExecuteNonQuery()
  51. }
  52. Write-CampaignAudit $db 'campaign_approved' $review.Token ("Campaign $campaignId, $($review.Contacts.Count) recipients") $transaction
  53. $transaction.Commit()
  54. $transaction = $null
  55. Write-Output "Approved campaign $campaignId with $($review.Contacts.Count) queued recipients. It remains paused."
  56. }
  57. catch {
  58. if ($transaction) { $transaction.Rollback() }
  59. throw
  60. }
  61. finally { $db.Dispose() }

Powered by TurnKey Linux.