|
При отправке мыла через System.Net.Mail когда я могу физически удалить attachment?
|
|||
---|---|---|---|
#18+
Ну т.е. грубо так Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Код выполняется в тике таймера типа так (схематично, к синтаксису не предираться), таймер на время выполнения кода блокируется, т.е. если есть несколько заданий на отправку мыла, то отправляется сразу циклом: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Результат отправки мне на самом деле не важен, я его нигде не логирую, эта хрень достаточно хорошо работает чтобы этим заниматься. attach -временный и его надо удалять сразу после отправки Если я делаю .Send(message) то я конечно точно могу удалить attach следующей строчкой Но .Send жестко клинит. Вопрос: что он клинит? только процедуру ЭТОГО таймера (если только этого то меня возможно устроит)? Или например другие таймеры на этой форме тоже? Вариант с .SendAsync мне конечно больше нравится. Типа отправил и забыл. Но могу ли я следующей строчкой удалить attach? И если нет, то как его удалять? В CallBack? Но туда надо как-то передать чего удалять. В письмо я всегда вкладываю файл %temp%\RandomFolder\FILE.ext %temp% -системная временная папка RandomFolder -уникально генерируемое имя сабфолдер в temp, вызывающая процедура знает RandomFolder FILE.ext -собственно attach По сути после отправки я должен сделать (и это здорово что в .Net есть штука позволяющая удалить непустую папку без танцев): Код: vbnet 1.
Ну т.е. какие советы? P.S. Хотя нет, соврал немного. Результат я таки логирую (по желанию). Т.е. мне надо дождаться результата отправки перед отправкой следующего мыла (параллельной отправки не надо). Но при этом каменного висяка тоже не надо (если только внутри этого таймера, не более). Сделать .SendAsync и менять флаг из callback, ожидая его циклом через Application.DoEvents() в тек. процедуре, потом удалить файл? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2015, 17:33 |
|
При отправке мыла через System.Net.Mail когда я могу физически удалить attachment?
|
|||
---|---|---|---|
#18+
Дмитрий77Вариант с .SendAsync мне конечно больше нравится. Типа отправил и забыл. Но могу ли я следующей строчкой удалить attach? нет. в обработчике SendCompleted удаляй файл, оттуда же и логгируй ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2015, 20:21 |
|
При отправке мыла через System.Net.Mail когда я могу физически удалить attachment?
|
|||
---|---|---|---|
#18+
Не все так просто как хотелось: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Он его "закусывает". Подозреваю что объект message продолжает жить какое-то время и не отдает файл пока мусорщик его не прибрал. Т.е. папку можно удалить ручками, не закрывая приложение, но только через какое-то время. Попробовать сделать ему Dispose() сразу после .SendAsync? Или обернуть в Using? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2015, 07:20 |
|
При отправке мыла через System.Net.Mail когда я могу физически удалить attachment?
|
|||
---|---|---|---|
#18+
Дмитрий77Подозреваю что объект message ... не отдает файл Попробовать сделать ему Dispose() сразу после .SendAsync? Или обернуть в Using? Не вариант. Файл удаляется, но мыло не отправляется (ну понятно, если я его заранее грохнул). Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
Замкнутый круг. Как мне грохнуть "message" из CallBack (чтоб суметь удалить attach)? Я ведь его создавал в вызывающей процедуре. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2015, 07:46 |
|
При отправке мыла через System.Net.Mail когда я могу физически удалить attachment?
|
|||
---|---|---|---|
#18+
Дмитрий77, Попробуй диспоузить мессаже в колбэке Диспоузить сразу после sendasync - дает вполне ожидаемый результат ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2015, 08:45 |
|
При отправке мыла через System.Net.Mail когда я могу физически удалить attachment?
|
|||
---|---|---|---|
#18+
Дмитрий77, попробуй передать методу SendAsync в качестве userState экземпляр класса со своим строковым токеном и экземпляром MailMessage. Тогда мы сможем вызвать Dispose() для MailMessage и это должно отпустить аттачмент. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2015, 08:53 |
|
При отправке мыла через System.Net.Mail когда я могу физически удалить attachment?
|
|||
---|---|---|---|
#18+
bazile,Изопропил Уже сделал, помогает. Хотя извращение еще то. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Но у меня такие же грабли с CDO.Message (внедрено оба метода, CDO без CallBack-ов) Код: vbnet 1. 2. 3. 4. 5.
И тоже вот не удаляется В VB6 удалялось таким дебильным кодом (сразу после .Send) Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
(причем цикл там был излишеством, сам файл то сразу удалялся - здесь проблема в нем) А в .Net почему-то закусывает. o_Mess =Nothing -не помогает Более того, прав на чтение вкладки Security для файла attach не дает пока приложение не закроешь. Как COM объект грохнуть? После .Send ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2015, 09:23 |
|
При отправке мыла через System.Net.Mail когда я могу физически удалить attachment?
|
|||
---|---|---|---|
#18+
Дмитрий77Уже сделал, помогает. Хотя извращение еще то. Замени Structure на class т.к. вызов SendAsync все равно приведет к упаковке и никакой экономии ты не получаешь. Дмитрий77Как COM объект грохнуть? После .Send Marshal.FinalReleaseComObject ? Дмитрий77o_Mess =Nothing -не помогает И не должен т.к. обнуление ссылочной переменной не имеет никакой магии. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2015, 09:52 |
|
При отправке мыла через System.Net.Mail когда я могу физически удалить attachment?
|
|||
---|---|---|---|
#18+
bazileДмитрий77Уже сделал, помогает. Хотя извращение еще то. Замени Structure на class т.к. вызов SendAsync все равно приведет к упаковке и никакой экономии ты не получаешь. Да я здесь за экономией не гонюсь. Работает -хорошо. Покажи код как сделать, чет я слово класс недолюбливаю в любом контексте. bazileДмитрий77Как COM объект грохнуть? После .Send Marshal.FinalReleaseComObject ? Не помогает. Но самое интересное что IO.Directory.Delete выдает исключение, а сам файл в папке ПРИ ЭТОМ по истечении какого-то времени таки удаляется (через минуту его там нет), фолдер его содержащая остается навсегда. Я если честно не вижу разницы между CDO кодом в VB6 и CDO-кодом в .Net. Зато вижу разницу в том как я это удаляю. В VB6: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
В .Net позарился на рекурсивную типа готовую Код: vbnet 1.
М.б. здесь вернуть прежний код? Сначала файл, потом папка (ну, подолбим самую малость). Единственное, долбить IO.Directory.Delete через Try...Catch я не рискну - это последнее дело, в цикл надо тогда вернуть API RemoveDirectory bazileДмитрий77o_Mess =Nothing -не помогает И не должен т.к. обнуление ссылочной переменной не имеет никакой магии. В VB6 магия есть: Код: vbnet 1.
В .Net согласен, давно уже понял, что бесполезняк. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2015, 10:39 |
|
При отправке мыла через System.Net.Mail когда я могу физически удалить attachment?
|
|||
---|---|---|---|
#18+
Ну вот так удаляет: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Через кучу Net-исключений или через кучу Debug.Print("Delete error"). И скорее всего в VB6 было тоже самое и Do..Loop там был воткнут чтоб заткнуть проблему. Непорядок короче. Оно конечно "быстро", но хотелось бы чтоб сразу. Причем файл то сразу удаляется, без циклов. А по фолдер надо долбить, вот этого я не понимаю, .attach если и держит, то файл а не папку. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2015, 11:39 |
|
При отправке мыла через System.Net.Mail когда я могу физически удалить attachment?
|
|||
---|---|---|---|
#18+
Фу, нашел как сделать грамотно: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9.
После этого он не будет препятствовать удалению папки с файлом: Код: vbnet 1. 2. 3.
Скорее всего COM и сам "сбрасывает", но чуть-чуть не успевает. Принудительная отвязка аттачей (после .Send здесь они уже не нужны) сразу освобождает файлы. Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2015, 12:13 |
|
При отправке мыла через System.Net.Mail когда я могу физически удалить attachment?
|
|||
---|---|---|---|
#18+
Дмитрий77Покажи код как сделать, чет я слово класс недолюбливаю в любом контексте. Код: vbnet 1. 2. 3. 4. 5. 6.
Заодно убрал StructLayout т.к. в нём нет никакой необходимости. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2015, 12:21 |
|
При отправке мыла через System.Net.Mail когда я могу физически удалить attachment?
|
|||
---|---|---|---|
#18+
bazile, Ну будь по твоему, хотя какая разница, больше к Type/Structure привык. Только тогда уж Public а не Dim. Ну и я тут подумал стратегически, нефиг token так субъективно использовать SendMail то я себе на все случаи универсально написал, а уже ковыряю. Вот CallBack -он под частный случай пишется. token это token, лучше запастись param as object и туда писать (в данном случае путь к удаляемой папке с attach, можно целиком) Это просто частный случай, что у меня здесь имена исходных файлов уникальны, а в другом применении будет по-другому. Вот так короче получилось: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
Ну вроде сделал неспеша 18 тестов во всех комбинациях (3 исходных формата, 3 формата attachment, CDO/Net.Mail), получил 54 мыла (To,CC,BCC), все дослалось, мусор в %temp% во всех случаях удалился. Ну плюс частные случаи отработал (это когда вдруг ошибка не доходя до .Send/.SendAsync, в этом случае надо делать Dispose по catch, ну не дослалось, а мусор в темпе то зачем) Разобрался короче. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2015, 15:20 |
|
|
start [/forum/topic.php?fid=20&fpage=88&tid=1401667]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 19ms |
total: | 154ms |
0 / 0 |