Załącznik do wiadomości na email

0

Witam wszystkich. Czy byłby ktoś wstanie pomóc dołączyć zrobione zdjęcie do wysłanej wiadomości na email? (attachments)

imports System.IO
imports System.Net.Mail
imports System.Net
imports System.Drawing.Imaging

Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        Try
            Dim MyMailMessage As New MailMessage()
            MyMailMessage.From = New MailAddress("@gmail.com")
            MyMailMessage.To.Add("@gmail.com")
            MyMailMessage.Subject = ("Nowa wiadomość")
            MyMailMessage.Body = RichTextBox1.Text
            Dim SMTPServer As New SmtpClient("smtp.gmail.com")
            SMTPServer.Port = 587
            SMTPServer.Credentials = New System.Net.NetworkCredential("@gmail.com", "password")
            SMTPServer.EnableSsl = True
            SMTPServer.Send(MyMailMessage)
            RichTextBox1.Text = ("")
        Catch 
        End Try
    End Sub

Private Sub Timer3_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick
        Dim screenshot As Bitmap = New Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb)
        Dim screenshotGraphics As Graphics = Graphics.FromImage(screenshot)
        screenshotGraphics.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy)
        screenshot.Save("C:\...\...\img.png", System.Drawing.Imaging.ImageFormat.Png)
    End Sub

Timer2 jest ustawiony na 2h

Timer3 na 10 min

Jest więc opcja aby zdjęcia robione co 10 min były wysłane do jednej wiadomości co 2h?

1

hej

Ten timer3 musiał by zapisywać zdjęcia do jednego folderu np temp... następnie Timer2 najpierw sprawdza ile ma plików Png do wysłania i za pomocą foreach dodaj je jako attachments do wiadomości.. pytanie czy jeden mail to jedno zdjęcie czy generalnie ile jest to wysyła. Oczywiście do sprawdzenia sa jeszcze limity gmail.com bo nie pamiętam jak duży może byc załącznik

0

hej

tylko jeszcze jedno.. musisz sie też przygotować na konflikty pomiędzy timer3 a Timer2.. takie konflikty mogą sie pojawiać w momencie zapisu pliku png oraz w tym samym momencie Timer2 będzie chciał wysłać plik mailem.. zatem możesz wdrożyć dwie metody

  1. timer3 robi sobie przerwę w działaniu o określonych godzinach bo juz wiadomo ze Timer2 nie napotka konfliktu z odczytem pliku.
  2. sprawdzasz czy plik jest wolny i dopiero go bierzesz pod uwage do wysłania
0

Wystarczyłoby w sumie zrobić licznik i co 12 uruchomienie timer2 wysyłac maila.

0

w sumie tak ale trzeba jeszcze sprawdzić ile zajmuje czasu zapisywanie png i wysłanie tych maili

0
sight napisał(a):

hej

tylko jeszcze jedno.. musisz sie też przygotować na konflikty pomiędzy timer3 a Timer2.. takie konflikty mogą sie pojawiać w momencie zapisu pliku png oraz w tym samym momencie Timer2 będzie chciał wysłać plik mailem.. zatem możesz wdrożyć dwie metody

zależy od rodzaju timera, przykładowo System.Windows.Forms.Timer czy DispatcherTimer pracują w tym samym głównym wątku więc to się nigdy nie wydarzy - jeden poczeka w kolejce na zakończenie drugiego

0

hej

jak patrzę na kod to raczej jest to System.Windows.Forms.Timer zatem mogę sobie przeszkadzać

0

@sight: A da się to zrobić w podobny sposób bez timera? Do Twojego pytania "pytanie czy jeden mail to jedno zdjęcie czy generalnie ile jest to wysyła" W jednym mailu przychodzi wiadomość co 2h i do tej wiadomości miałyby być dołączone wszystkie zdjęcia robione co 10 min do tej wiadomości, sprawdziłem, jedno zdjęcie .png waży 189kb więc myślę, że spokojnie kilkanaście zdjęć się tam wyśle, jeśli nie to najwyżej zwiększy się timer np. co 15 min.

0

@ Edit

Zrobiłem coś takiego:

 Private screenshot As Bitmap = New Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb)
 Dim Zdjecie = "screenshot.png"

 Private Sub Timer3_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick
        Dim screenshotGraphics As Graphics = Graphics.FromImage(screenshot)
        screenshotGraphics.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy)
        If System.IO.File.Exists(Zdjecie) Then
            System.IO.File.Delete(Zdjecie)
        End If
        screenshot.Save(Zdjecie, System.Drawing.Imaging.ImageFormat.Png)
    End Sub

    Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
        Try
            Dim MyMailMessage As New MailMessage()
            MyMailMessage.From = New MailAddress("@gmail.com")
            MyMailMessage.To.Add("@gmail.com")
            MyMailMessage.Subject = ("Nowa wiadomość")
            MyMailMessage.Body = RichTextBox1.Text
            MyMailMessage.Attachments.Add(New System.Net.Mail.Attachment(Zdjecie))
            Dim SMTPServer As New SmtpClient("smtp.gmail.com")
            SMTPServer.Port = 587
            SMTPServer.Credentials = New System.Net.NetworkCredential("@gmail.com", "pass")
            SMTPServer.EnableSsl = True
            SMTPServer.Send(MyMailMessage)
            RichTextBox1.Text = ("")
        Catch
        End Try
    End Sub

I działa wysyła zdjęcie wraz z wiadomością, lecz nie mogę na razie sprawdzić czy wyśle ich więcej ponieważ pojawia się komunikat z błędem w linijce:

System.IO.File.Delete(Zdjecie)

"Proces nie może uzyskać dostępu do pliku C:.......png ponieważ jest on używany przez inny proces" ??

0

Bitmapę masz cały czas otwartą, więc nie możesz jej usunąć użyj metody Dispose na screenshot by zwolnić zasoby przez niego używane. Zresztą nie wiem w jakim celu masz to poza ciałem subs.

Ale nawet gdyby to nie sprawdzisz kilku załączników bo poprzedni usuniesz, więc zawsze będziesz miał ostatni...

Jak już robisz to nazwy twórz automatycznie np

Zdjecie= "scr" & datetime.now.tostring("yyyyMMddhhmm") & ".PNG"

0

hej

tak jak kolega wyżej pisze.. musisz puścić plik za pomocą Dispose no i gdy wysyłasz maila też zastosuje Dispose.

0

@Panczo: Dodałem ten "screenshot" do timera oraz dispose do screenshot i screenshotGraphics lecz nadal wyskakuje, ten komunikat

0

a na jakim etapie chcesz usuwać plik ? podeślij ten kawałek kodu

0
sight napisał(a):

a na jakim etapie chcesz usuwać plik ? podeślij ten kawałek kodu

Chciałbym aby zdjęcie było usuwane co kolejne zrobione, czyli pierwsze zdjęcie, wyśle je jako załącznik, następnie po 10 minutach tak jak timer3 robi następne zdjęcie i usunie te pierwsze zrobione, czy jest to w ogóle możliwe? Gdy dla testu usunę kod o usuwaniu zdjęcia to próbuje mi wysyłać załączniki z zdjęciami co 10 min, spróbuję to pokazać na zdjęciu jak miałoby to wyglądać:
https://ibb.co/7WWqBxD

0

Nie wiem co chcesz osiągnąc bo w pierwszej wersji chcesz wysyłać screeny po 2 godzinach czyli po 12 powtórzeniach.
Nie dbasz w kodzie o zwalnianie obiektów, więc trudno pomoc bo nie wiem gdzie to może byc trzymane.

Więc proponuje taki schemat:

1.ustawiam licznik na 0
2.Robię screenshota i zapisuje
3.Jeśli to 12 screenshot to wysyłam zrobione mailem załączniki i usuwam zebrane screeny do tej pory

I nie potrzebujesz 2 timerów

    Private counter As Integer
    Private Sub Timer3_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick
         counter += 1

        TakeScreenShotandSave("screen" & Now.ToString("yyyyMMddhhmmss") & ".png")
        If counter = 12 Then
            counter = 0
            SendMail
        End If
    End Sub
    Sub SendMail()
        'tylko kod dodawani załączników
        Dim fileEntries As String() = Directory.GetFiles(Application.StartupPath(), "*.png")
        Dim fileName As String
        Try
            Using MyMailMessage As New MailMessage()

                For Each fileName In fileEntries
                    MyMailMessage.Attachments.Add(New Attachment(fileName))
                Next
            End Using
        Finally
            'usun wysłane załączniki
            For Each fileName In fileEntries
                File.Delete(fileName)
            Next
        End Try

    End Sub
    Sub TakeScreenShotandSave(ByVal FileName As String)
        If File.Exists(FileName) Then File.Delete(FileName)
        Using screenshot As Bitmap = New Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb)
            Using screenshotGraphics As Graphics = Graphics.FromImage(screenshot)
                screenshotGraphics.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy)
                screenshot.Save(FileName, Imaging.ImageFormat.Png)
            End Using
        End Using
    End Sub

0

Rozumiem, że są 3 timery o różnych częstotliwościach, każdy robi coś innego i interwał timera 2 i 3 jest wielokrotnością interwału timera 1.

W takim przypadku moim zdaniem lepiej dać jeden timer i dwie zmienne int. Wtedy kod akcji timera wyglądałby mniej więcej następująco:

Dim T2 As Integer
Dim T3 As integer
T2 = 0
T3 = 0
Sub TimerEvent()
    ProceduraTimera1()
    T2 = T2 + 1
    T3 = T3 + 1
    If (T2 >= 100)
        ProceduraTimera2()
        T2 = 0
    End If
    If (T3 >= 500)
        ProceduraTimera3()
        T3 = 0
    End If
End Sub

A jeżeli interwał timera 3 jest wielokrotnością timera 2, to można tak:

Dim T2 As Integer
Dim T3 As integer
T2 = 0;
T3 = 0;
Sub TimerEvent()
    ProceduraTimera1()
    T2 = T2 + 1
    If (T2 >= 100)
        ProceduraTimera2()
        T2 = 0
        T3 = T3 + 1
        If (T3 >= 5)
            ProceduraTimera3()
            T3 = 0
        End If
    End If
End Sub

Wtedy odpada ewentualność konfliktu między timerami i wątkami, można wysterować kolejnością zdarzeń w czasie jednego cyklu.

0

@Matevsz: a jak zrobić tak, zeby np po wyjsciu z programu, screenshot sie usuwal z miejsca gdzie zostal utworzony? bo ja mam ten komunikat ze nie moge usunac zdjecia bo jest otwarty w innym programie

1 użytkowników online, w tym zalogowanych: 0, gości: 1