L'envoi d'e-mail à partir d'un Personnalisé SQL Server Reporting Services de Livraison de l'Extension

StackOverflow https://stackoverflow.com/questions/31930

  •  09-06-2019
  •  | 
  •  

Question

J'ai développé ma propre extension de livraison pour Reporting Services 2005, de l'intégrer à notre mode SaaS solution de marketing.

Il prend l'abonnement, et prend un instantané de la rapport avec un ensemble de paramètres.Il rend alors le rapport, envoie un e-mail avec un lien et le rapport joint en XLS.

Tout fonctionne bien, jusqu'à la livraison du courrier...

Voici mon code pour l'envoi d'e-mail:

 public static List<string> SendMail(SubscriptionData data, Stream reportStream, string reportName, string smptServerHostname, int smtpServerPort)
{
  List<string> failedRecipients = new List<string>();

  MailMessage emailMessage = new MailMessage(data.ReplyTo, data.To);
  emailMessage.Priority = data.Priority;
  emailMessage.Subject = data.Subject;
  emailMessage.IsBodyHtml = false;
  emailMessage.Body = data.Comment;

  if (reportStream != null)
  {
    Attachment reportAttachment = new Attachment(reportStream, reportName);
    emailMessage.Attachments.Add(reportAttachment);
    reportStream.Dispose();
  }

  try
  {
    SmtpClient smtp = new SmtpClient(smptServerHostname, smtpServerPort);

    // Send the MailMessage
    smtp.Send(emailMessage);
  }
  catch (SmtpFailedRecipientsException ex)
  {
    // Delivery failed for the recipient. Add the e-mail address to the failedRecipients List
    failedRecipients.Add(ex.FailedRecipient);
  }
  catch (SmtpFailedRecipientException ex)
  {
    // Delivery failed for the recipient. Add the e-mail address to the failedRecipients List
    failedRecipients.Add(ex.FailedRecipient);
  }
  catch (SmtpException ex)
  {
    throw ex;
  }
  catch (Exception ex)
  {
    throw ex;
  }

  // Return the List of failed recipient e-mail addresses, so the client can maintain its list.
  return failedRecipients;
}

Les valeurs pour SmtpServerHostname est localhost et le port est 25.

Je veryfied que j'arrive à envoyer des messages, à l'aide de Telnet.Et il fonctionne.

Voici le message d'erreur que je reçois de SSRS:

ReportingServicesService!notification!4!08/28/2008-11:26:17::Notification 6ab32b8d-296e-47a2-8d96-09e81222985c terminé.Succès:Faux, Statut:Message De L'Exception:Échec de l'envoi du mail.Stacktrace:au MyDeliveryExtension.MailDelivery.SendMail(SubscriptionData de données, Flux de reportStream, Chaîne reportName, Chaîne smptServerHostname, Int32 smtpServerPort) dans C:\inetpub\wwwroot\CustomReporting\MyDeliveryExtension\MailDelivery.cs:line 48 au MyDeliveryExtension.MyDelivery.Livrer(Notification notification) dans C:\inetpub\wwwroot\CustomReporting\MyDeliveryExtension\MyDelivery.cs:line 153, DeliveryExtension:Ma Livraison, Rapport:Clique Sur Le Développement, La Tentative De 1 ReportingServicesService!dbpolling!4!08/28/2008-11:26:17::NotificationPolling terminé le traitement d'élément 6ab32b8d-296e-47a2-8d96-09e81222985c

Cela pourrait-il avoir quelque chose à voir avec la Confiance/Sécurité d'Accès du Code?

Mon extension de remise est accordée de plein de confiance dans rssrvpolicy.config:

   <CodeGroup 
    class="UnionCodeGroup"
    version="1"
    PermissionSetName="FullTrust"
    Name="MyDelivery_CodeGroup"
    Description="Code group for MyDelivery extension">
    <IMembershipCondition class="UrlMembershipCondition" version="1" Url="C:\Program Files\Microsoft SQL Server\MSSQL.2\Reporting Services\ReportServer\bin\MyDeliveryExtension.dll" />
   </CodeGroup> 

La confiance des être un problème ici?

Une autre théorie:SQL Server et SSRS a été installé dans le contexte de sécurité d'un Système Local.Ai-je raison, ou est-ce compte de service restreint l'accès à une ressource réseau?Même son propre Serveur SMTP?

J'ai essayé de changer tous les Services SQL Server ouvertures de session Administrateur mais toujours sans succès.

J'ai aussi essayé de connexion sur le serveur SMTP dans mon code, par proviiding:NetworkCredential("l'Administrateur", "mot de passe") et aussi NetworkCredential("l'Administrateur", "mot de passe", "MyRepServer")

N'importe qui peut aider ici, s'il vous plaît?

Était-ce utile?

La solution

Ce qui est sur:

at MyDeliveryExtension.MailDelivery.SendMail(SubscriptionData data, Stream reportStream, String reportName, String smptServerHostname, Int32 smtpServerPort) 
  in C:\inetpub\wwwroot\CustomReporting\MyDeliveryExtension\MailDelivery.cs:line 48 

at MyDeliveryExtension.MyDelivery.Deliver(Notification notification) 
  in C:\inetpub\wwwroot\CustomReporting\MyDeliveryExtension\MyDelivery.cs:line 153

Aussi, vous semblez être de disposer du rapport des flux, mais qui devrait être fait par ce que l'ouverture de ce flux, pas votre méthode (il ne sera pas évident que la fixation d'un flux de l'envoie).

Vous êtes de perdre une partie de votre trace de la pile en raison de la façon dont vous re-lancer des exceptions.Ne pas jeter de l'ex variable, il suffit de lancer est assez.

Essayez cette tweak:

public static List<string> SendMail(SubscriptionData data, Stream reportStream, string reportName, string smptServerHostname, int smtpServerPort)
{
  List<string> failedRecipients = new List<string>();

  MailMessage emailMessage = new MailMessage(data.ReplyTo, data.To) {
      Priority = data.Priority,
      Subject = data.Subject,
      IsBodyHtml = false,
      Body = data.Comment
  };

  if (reportStream != null)
    emailMessage.Attachments.Add(new Attachment(reportStream, reportName));

  try
  {
      SmtpClient smtp = new SmtpClient(smptServerHostname, smtpServerPort);

      // Send the MailMessage
      smtp.Send(emailMessage);
  }
  catch (SmtpFailedRecipientsException ex)
  {
    // Delivery failed for the recipient. Add the e-mail address to the failedRecipients List
    failedRecipients.Add(ex.FailedRecipient);

    //are you missing a loop here? only one failed address will ever be returned
  }
  catch (SmtpFailedRecipientException ex)
  {
    // Delivery failed for the recipient. Add the e-mail address to the failedRecipients List
    failedRecipients.Add(ex.FailedRecipient);
  }

  // Return the List of failed recipient e-mail addresses, so the client can maintain its list.
  return failedRecipients;
}

Autres conseils

J'ai essayé d'enlever la reportStream pièce Jointe:

  //if (reportStream != null)    
     //emailMessage.Attachments.Add(new Attachment(reportStream, reportName));

Et maintenant, il fonctionne très bien.

C'est donc quelque chose à voir avec la reportStream.

Après amusent avec le tunctionallity qui obtient le reportStream, j'ai été en mesure de résoudre le problème d'envoi de mail.

L'erreur n'était pas dans la méthode SendMail, mais somewehere d'autre.L'exception a été levée dans le contexte, SendMail bien.Enculer!

C'est pourquoi vous devez éviter:

catch (Exception ex)
{
    throw ex;
}

Comme que, fondamentalement, les manteaux de vos exception dans une nouvelle.

Si vous utilisez:

catch (Exception ex)
{
    throw; //note: no ex
}

Il conserve l'original de l'exception et de la trace de la pile.

FileStream m_fileStream = null;

m_files = notification.Report.Render(format, null);
RenderedOutputFile m_renderedOutputFile = m_files[0];
m_fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write);
m_renderedOutputFile.Data.Seek((long)0, SeekOrigin.Begin);
byte[] arr = new byte[(int)m_renderedOutputFile.Data.Length + 1];

m_renderedOutputFile.Data.Read(arr, 0, (int)m_renderedOutputFile.Data.Length);

m_fileStream.Write(arr, 0, (int)m_renderedOutputFile.Data.Length);

m_fileStream.Close();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top