none
The operation timed out sending email with zip file RRS feed

  • Question

  • I'm developing an application to apply web cameras for forest and forest monitoring. This application saves photo frames and then we can make a video of these photo frames but I will explain: The application when we load the green button it starts to take photo frames, after having executed them and load in the red box to stop the software to take photo frames, then it does a zip file of those photo frames and I need to send them by email and then delete all of the respective folder. Well my problem is not in the software itself everything is working fine, but the problem starts when the software before deleting everything I want to send the zip file to the email but of course these files are wider than allowed. So give me an exception 'The operation has exceeded the time limit' I tried in several ways, but with no success. I wanted to know if there is any way to overcome this problem.

    i will maybe consider to split all foto frames (jpg) in to a few zip files :

    with 2 mb . is the any way to split all the jpg files in a folder

    and zip each of them.

    This is my code in question:

    Imports System.IO
    Imports System.Net.Mail
    
    Imports System.IO.Compression
    Imports System.Xml
    
    Public Class Form2
    Dim mydataandtimeforsave As String = DateTime.Now.ToString("yyyyMMddHHmmss")
    Dim frame As Long 'individual frames
    Dim tempdir As String = "C:\dirorg/" ' images temp directory
    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        If TextBox1.Text = "" Then
            TextBox1.Text = 1
        End If
    
    End Sub
    
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
        capturex()
        'save()
    End Sub
    Public Sub capturex()
        Try
    
            Dim area As Rectangle
            Dim graph As Graphics
            Dim captured As Bitmap
            area = Screen.PrimaryScreen.Bounds
            captured = New System.Drawing.Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
            graph = Graphics.FromImage(captured)
    
            graph.CopyFromScreen(area.X, area.Y, 0, 0, area.Size, CopyPixelOperation.SourceCopy)
            ' you will need IF statement if you have checkbox
            If CheckBox1.Checked = True Then
                Cursor.Draw(graph, New Rectangle(New Point(Cursor.Position.X - Cursor.HotSpot.X, Cursor.Position.Y - Cursor.HotSpot.Y), Cursor.Size))
    
            End If
            Dim strings As String
    
            strings = frame
            captured.Save(tempdir & "\" & strings & ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
            frame += 1
            Label2.Text = "TIME: " & frame
        Catch ex As Exception
    
        End Try
    End Sub
    
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Timer1.Start()
    End Sub
    
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    
        Me.Timer1.Interval = TimeSpan.FromSeconds(TextBox1.Text).TotalMilliseconds
        capturex()
    
    End Sub
    
    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        renameFilesInFolder()
    
    
        '-framerate 3 -i "Imgp%%04d.jpg" -s 720x480 test.avi)
    End Sub
    Private Sub renameFilesInFolder()
        Dim sourcePath As String = "C:\dirorg/"
        Dim searchPattern As String = "*.jpg"
        Dim i As Integer = 0
        For Each fileName As String In Directory.GetFiles(sourcePath, searchPattern, SearchOption.AllDirectories)
            File.Move(Path.Combine(sourcePath, fileName), Path.Combine(sourcePath, "Imgp" & i & "d.jpg"))
            i += 1
        Next
    End Sub
    
    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        With SaveFileDialog1
            .DefaultExt = ".avi"
            .FilterIndex = 1
            .Filter = "Avi Files (*.avi)|*.avi|All files (*.*)|*.*"
        End With
        SaveFileDialog1.ShowDialog()
    End Sub
    
    Private Sub SaveFileDialog1_FileOk(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles SaveFileDialog1.FileOk
    
        Dim args As String 'declare args
        args = "-r 1/.1 -i " & "C:\dirorg" & "\%01d.jpg -c:v libx264 -r 80 -pix_fmt yuv420p " & Chr(34) & SaveFileDialog1.FileName & Chr(34) 'set ffmpeg arguments
        Dim proc As New Process
        Dim proci As New ProcessStartInfo
        proci.FileName = "C:\dirorg\ffmpeg.exe"
        proci.Arguments = args
        proci.WindowStyle = ProcessWindowStyle.Hidden
        proci.CreateNoWindow = True
        proci.UseShellExecute = False
        proc.StartInfo = proci
        proc.Start()
        Do Until proc.HasExited = True
            Me.Text = "Saving"
        Loop
        Me.Text = "your video done"
    
        MsgBox("Done")
        compimages()
        BackgroundWorker1.RunWorkerAsync()
        MsgBox("All Done")
        Dim directoryName As String = tempdir
    
        For Each deleteFile In Directory.GetFiles(directoryName, "*.jpg", SearchOption.TopDirectoryOnly)
            File.Delete(deleteFile)
        Next
    End Sub
    
    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
        Timer1.Stop()
    End Sub
    
    Public Sub compimages()
        'To zip a directory
        Dim mydataandtimeforsave = DateTime.Now.ToString("yyyyMMddHHmmss")
        Dim Compressed = ZipDirectory("C:\dirorg")
        File.WriteAllBytes("C:\dirorg\images.zip", Compressed)
    End Sub
    Public Sub uncompimages()
        'To unzip a zipped file
        Dim Compressed = File.ReadAllBytes("C:\dirorg\images" & mydataandtimeforsave & ".zip")
        UnzipDirectory(Compressed, "C:\dirorg")
    End Sub
    Public Function ZipDirectory(DirPath As String) As Byte()
        If Not Directory.Exists(DirPath) Then Return Nothing
    
        Dim Directories = Directory.GetDirectories(DirPath, "*", SearchOption.AllDirectories)
        Dim Files = Directory.GetFiles(DirPath, "*", SearchOption.AllDirectories)
    
        Dim X As New XmlDocument
        Dim RootNode = X.CreateElement("Content")
        Dim DirsNode = X.CreateElement("Directories")
        Dim FilesNode = X.CreateElement("Directories")
    
        X.AppendChild(RootNode)
        RootNode.AppendChild(DirsNode)
        RootNode.AppendChild(FilesNode)
    
        For Each d In Directories
            Dim DirNode = X.CreateElement("Directory")
            Dim PathAttrib = X.CreateAttribute("Path")
            PathAttrib.Value = d.Replace(DirPath & "\", "") 'Create relative paths
            DirNode.Attributes.Append(PathAttrib)
            DirsNode.AppendChild(DirNode)
        Next
    
        For Each f In Files
            Dim FileNode = X.CreateElement("File")
            Dim PathAttrib = X.CreateAttribute("Path")
            PathAttrib.Value = f.Replace(DirPath & "\", "") 'Create relative paths
            FileNode.Attributes.Append(PathAttrib)
            FileNode.InnerText = Convert.ToBase64String(File.ReadAllBytes(f))
            FilesNode.AppendChild(FileNode)
        Next
    
        Using Mem As New MemoryStream()
            X.Save(Mem)
            Dim AllContentsAsByteArray = Mem.ToArray()
            Dim CompressedContent = CompressArray(AllContentsAsByteArray)
            Return CompressedContent
        End Using
    End Function
    
    Public Sub UnzipDirectory(compressed() As Byte, outputPath As String)
        If Not Directory.Exists(outputPath) Then Directory.CreateDirectory(outputPath)
    
        Dim Uncompressed = DecompressArray(compressed)
    
        Dim X As New XmlDocument
    
        Using Mem As New MemoryStream(Uncompressed)
            X.Load(Mem)
    
            Dim RootNode = X.FirstChild
            Dim DirsNode = RootNode.FirstChild
            Dim FilesNode = RootNode.FirstChild.NextSibling
    
            For Each ChildDir In DirsNode.ChildNodes
                Directory.CreateDirectory(Path.Combine(outputPath, DirectCast(ChildDir, XmlNode).Attributes.Item(0).Value))
            Next
    
            For Each ChildFile In FilesNode.ChildNodes
                Dim FilePath = Path.Combine(outputPath, DirectCast(ChildFile, XmlNode).Attributes.Item(0).Value)
                Dim Content = Convert.FromBase64String(DirectCast(ChildFile, XmlNode).InnerText)
                File.WriteAllBytes(FilePath, Content)
            Next
        End Using
    End Sub
    
    Private Function CompressArray(ByVal content() As Byte) As Byte()
        Using outFile As New MemoryStream()
            Using Compress As New GZipStream(outFile, CompressionMode.Compress)
                Compress.Write(content, 0, content.Length)
            End Using
    
            Return outFile.ToArray()
        End Using
    End Function
    
    Private Function DecompressArray(ByVal content() As Byte) As Byte()
        Using outFile As New MemoryStream()
            Using inFile As New MemoryStream(content)
                Using Compress As New GZipStream(inFile, CompressionMode.Decompress)
                    Dim buffer(1023) As Byte
                    Dim nRead As Integer
                    Do
                        nRead = Compress.Read(buffer, 0, buffer.Length)
                        outFile.Write(buffer, 0, nRead)
                    Loop While nRead > 0
                End Using
            End Using
    
            Return outFile.ToArray()
        End Using
    End Function
    Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Using mail As New MailMessage
            mail.From = New MailAddress("helderventura227@gmail.com")
            mail.To.Add(My.Settings.destinationx$)
            mail.Body = My.Settings.bodyx$
    
            Dim attach As New Attachment("C:\dirorg\images.zip")
            mail.Attachments.Add(attach)
    
            mail.Subject = My.Settings.subjectx$
            mail.Priority = MailPriority.High
            Using SMTP As New SmtpClient
    
                SMTP.EnableSsl = True
                SMTP.Port = "587"
                SMTP.Host = "smtp.gmail.com"
                SMTP.Credentials = New Net.NetworkCredential("helderventura227@gmail.com", "u>#4TBOw")
                SMTP.Send(mail)
            End Using
        End Using
    
    End Sub
    
    Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
        MsgBox("Email has been sent successfully!", MsgBoxStyle.Information)
    End Sub
    End Class




    Friday, August 17, 2018 7:16 PM

All replies

  • Hi,

    Solution1:

    Try to set the timeout time:

    SMTP.Timeout = 60000

    Solution2:

    Try changing the port to 465.

    Best Regards,

    Alex


    MSDN Community Support Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.



    Monday, August 20, 2018 5:19 AM