создать связанный ресурс для встраивания карты Google в почту - PullRequest
0 голосов
/ 06 сентября 2010

Я использовал статическую карту Google, создал связанный ресурс, встроил его в электронную почту и отправил письмо всем пользователям.Я отправляю запрос на сервер Google и преобразовываю ответ в виде потока, а затем создаю связанный ресурс, используя этот поток.

Проблема в том, что я использовал цикл и отправлял почту на все идентификаторы электронной почты, присутствующие в таблице базы данных. Я создал связанный ресурс, создаваемый внутри цикла for, поэтому каждый раз одно и то же изображение запрашивается с сервера Googleи отправлено по почте пользователю.Я хочу предотвратить это, только в первый раз запрос должен быть отправлен в Google, и я должен сохранить этот поток ответов и использовать его для создания связанного ресурса.

Как это сделать?Я попытался сохранить поток в локальной переменной потока и создал связанный ресурс, используя эту переменную потока, я также сохранил поток в viewstate и в сеансе, но ни один из методов не сработал!

for (iCnt = 0; iCnt < dsEmailIds.Tables[0].Rows.Count; iCnt++)
{
 //Linked resource to embed Google map in mail
 LinkedResource lnkResMain;
 if (imgPhotos.Src.Contains("maps.google.com"))
  lnkResMain = new LinkedResource(getStream(imgPhotos.Src));

 //send mail
 mail.SendMail(fromAddress,dsEmailIds.Tables[0].Rows[0]["toAddress"].ToString(),lnkResMain);       
}   
 //this converts string image url to stream since stream can be used to create linked resource
 public Stream getStream(string imgUrl)
 {
      System.Net.WebRequest req = System.Net.WebRequest.Create(imgUrl);
      System.Net.WebResponse response = req.GetResponse();
      Stream stream = response.GetResponseStream();
      return stream;
 }

Ответы [ 2 ]

1 голос
/ 07 сентября 2010

Код для этой функции:

    //Sends request to Google and gets the response as stream
    //imgUrl - image url for the Google static map
    public Stream getStream(string imgUrl)
    {
        Stream stream = null;

        try
        {
            System.Net.WebRequest req = System.Net.WebRequest.Create(imgUrl);
            System.Net.WebResponse response = req.GetResponse();
            stream = response.GetResponseStream();
            return stream;
        }
        catch (Exception ex)
        {
            throw ex;
        }            
    }

    //Converts stream to image and stores the image in temp files location
    //strm - Stream containing Google map 
    //imageName - image Name to be saved in temp file
    public void SaveStreamAsImage(Stream strm,string imageName)
    {
       System.Drawing.Image img = null;

        try
        {
            img = System.Drawing.Image.FromStream(strm);
            img.Save(System.IO.Path.GetTempPath() + imageName, System.Drawing.Imaging.ImageFormat.Jpeg);
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            strm.Dispose();
            strm.Close();

            img.Dispose();
        }            
    }

    //Deletes the temp image file after mailing to all users
    //filePath - file path of image which is to be deleted
    public void DeleteFile(string filePath)
    {
        if (File.Exists(filePath))
        {
            File.Delete(filePath);                
        }
    }


    public void SendEmail()
    {

    for (iCnt = 0; iCnt < dsEmailIds.Tables[0].Rows.Count; iCnt++)
    {
     //Linked resource to embed Google map in mail LinkedResource lnkResMain; 
     if (imgPhotos.Src.Contains("maps.google.com"))
     {
         Stream strm = getStream(imgPhotos.Src);
         SaveStreamAsImage(strm, "img1");
     }

     //send mail                              
     mail.SendMail(fromAddress,dsEmailIds.Tables[0].Rows[0]["toAddress"].ToString(),lnkResMain);

     }
     delDeleteFile(System.IO.Path.GetTempPath() + "img1");
    }
1 голос
/ 06 сентября 2010

Использование одного потока в нескольких электронных письмах не будет работать, поскольку для первого электронного письма поток будет считываться (и закрываться) и поэтому не будет доступен для последующих электронных писем.

Почему бы не сохранить поток ответов карты во временный файл, а затем создать связанный ресурс, используя имя файла (используйте конструкторы this или this - позже я предпочту указать тип контента а также).

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