Как ограничить длину имени файла максимально допустимой?

Когда я пытаюсь отправить электронное письмо 30 получателям и группе из 60 получателей, возникает ошибка:

Run-time error '-2147286788 (800300fc)

Item.SaveAs sPath & sName, olMSG - вот в чем проблема.

В коде есть комментарий Snameможет потребоваться ограничение длины символа.

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

Полный код ниже. Он находится в модуле ThisOutlookSession.

Option Explicit
Private WithEvents Items As Outlook.Items
Private WithEvents SentItems As Outlook.Items

Private Sub Application_Startup()
Dim Ns As Outlook.NameSpace
Set Ns = Application.GetNamespace("MAPI")
Set Items = Ns.GetDefaultFolder(olFolderInbox).Items
Set SentItems = Ns.GetDefaultFolder(olFolderSentMail).Items
End Sub

Private Sub Items_ItemAdd(ByVal Item As Object)
If TypeOf Item Is Outlook.MailItem Then

Dim sPath As String
Dim dtDate As Date
Dim sName As String
Dim enviro As String

enviro = CStr(Environ("USERPROFILE"))

sName = Item.Subject & "-" & Item.SenderName
ReplaceCharsForFileName sName, "_"

dtDate = Item.ReceivedTime
sName = Format(dtDate, "yyyymmdd", vbUseSystemDayOfWeek, _
vbUseSystem) & Format(dtDate, "-hhnnss", _
vbUseSystemDayOfWeek, vbUseSystem) & "-" & sName & ".msg"

sPath = enviro & "\Email\Inbox\"
Debug.Print sPath & sName
Item.SaveAs sPath & sName, olMSG

End If

End Sub

Private Sub SentItems_ItemAdd(ByVal Item As Object)
If TypeOf Item Is Outlook.MailItem Then

Dim sPath As String
Dim dtDate As Date
Dim sName As String
Dim enviro As String

enviro = CStr(Environ("USERPROFILE"))

'Save name is the email subject plus who the email was sent to
sName = Item.Subject & "-" & Item.To 'might need restricting character length
ReplaceCharsForFileName sName, "_"

dtDate = Item.ReceivedTime
sName = Format(dtDate, "yyyymmdd", vbUseSystemDayOfWeek, _
vbUseSystem) & Format(dtDate, "-hhnnss", _
vbUseSystemDayOfWeek, vbUseSystem) & "-" & sName & ".msg"

sPath = enviro & "\Email\Sent Items\"
Debug.Print sPath & sName
Item.SaveAs sPath & sName, olMSG

End If

End Sub


Private Sub ReplaceCharsForFileName(sName As String, _
sChr As String _
)
sName = Replace(sName, "/", sChr)
sName = Replace(sName, "\", sChr)
sName = Replace(sName, ":", sChr)
sName = Replace(sName, "?", sChr)
sName = Replace(sName, Chr(34), sChr)
sName = Replace(sName, "<", sChr)
sName = Replace(sName, ">", sChr)
sName = Replace(sName, "|", sChr)
End Sub

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

Ali 29.11.2018 10:25

Никогда не используйте «Продолжить следующий» таким образом. Код молча выходит из строя. Здесь можно было подумать, что почта была сохранена, но это не так.

niton 19.12.2018 21:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
185
1

Ответы 1

Предположим для простоты ограничение в 250 символов.

Уменьшить по длине даты:

Len(Format(dtDate, "yyyymmdd", vbUseSystemDayOfWeek, _
  vbUseSystem) & Format(dtDate, "-hhnnss", _
  vbUseSystemDayOfWeek, vbUseSystem))

Уменьшить по длине пути:

Len(enviro & "\Email\Sent Items\")

Скажите, что два числа выше добавляют к 100. Осталось 150 символов.

Простое исправление:

'Save name is the email subject plus who the email was sent to
'sName = Item.Subject & "-" & Item.To
sName = left(Item.Subject, 50)  & "-" & left(Item.To, 99)

Более общее исправление будет включать динамическое вычисление 50 и 99 на основе разной длины enviro для других людей.

Другие вопросы по теме