문제

나는 수십 개의 이메일을 만들고 자동으로 채우는 액세스 스크립트를 작성하고 있습니다.그것은 지금까지 부드러운 코딩되었습니다,하지만 난 전망에 새로운 해요.메일 항목 개체를 만든 후, 이메일에 기본 서명을 추가하려면 어떻게 해야 합니까?

  1. 새 이메일을 만들 때 자동으로 추가되는 기본 서명입니다.

  2. 이상적으로,나는 단지 사용하고 싶습니다 ObjMail.GetDefaultSignature,하지만 나는 그와 같은 것을 찾을 수 없습니다.

  3. 현재 아래 기능을 사용하고 있습니다(발견됨 다른 곳 파일 이름 및 경로를 참조하십시오.그러나 이것은 여러 사람에 의해 사용될 것이며 그들은 기본 서명 파일에 대해 다른 이름을 가질 수 있습니다.그래서 이것은 효과가 있지만 이상적이지는 않습니다:

    Function GetBoiler(ByVal sFile As String) As String
    'Dick Kusleika
    Dim fso As Object
    Dim ts As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.GetFile(sFile).OpenAsTextStream(1, -2)
    GetBoiler = ts.readall
    ts.Close
    End Function
    

    (전화 getboiler(SigString = "C:\Users\" & Environ("username") & "\AppData\Roaming\Microsoft\Signatures\Mysig.txt"))

편집

이 응용 프로그램은 당신이 당신의 이메일에 메모를 추가 할 수 있습니다.그래서 내 질문은 지금:기본 서명을 표시하려면 어떻게 해야 합니까?

Sub X()
    Dim OlApp As Outlook.Application
    Dim ObjMail As Outlook.MailItem

    Set OlApp = Outlook.Application
    Set ObjMail = OlApp.CreateItem(olMailItem)

    ObjMail.BodyFormat = olFormatHTML
    ObjMail.Subject = "Subject goes here"
    ObjMail.Recipients.Add "Email goes here"

    ObjMail.HTMLBody = ObjMail.Body & "HTML Table goes here"
    ObjMail.Display

End Sub
도움이 되었습니까?

해결책

아래 코드는 Outlook 메시지를 생성하고 자동 서명을 유지합니다

Dim OApp As Object, OMail As Object, signature As String
Set OApp = CreateObject("Outlook.Application")
Set OMail = OApp.CreateItem(0)
    With OMail
    .Display
    End With
        signature = OMail.body
    With OMail
    '.To = "someone@somedomain.com"
    '.Subject = "Type your email subject here"
    '.Attachments.Add
    .body = "Add body text here" & vbNewLine & signature
    '.Send
    End With
Set OMail = Nothing
Set OApp = Nothing
.

다른 팁

내 솔루션은 비어 있는 메시지를 먼저(기본 서명 포함!) 삽입하고 원하는 내용을 삽입하세요. strHTMLBody 기존에 HTMLBody.

PowerUser 상태와 같이 HTMLBody를 편집하는 동안 서명이 지워지면 다음의 내용을 저장하는 것을 고려할 수 있습니다. ObjMail.HTMLBody 변수로 strTemp 직후 ObjMail.Display 그리고 추가하세요 strTemp 나중에는 그럴 필요가 없습니다.

Sub X(strTo as string, strSubject as string, strHTMLBody as string)

   Dim OlApp As Outlook.Application   
   Dim ObjMail As Outlook.MailItem 

   Set OlApp = Outlook.Application
   Set ObjMail = OlApp.CreateItem(olMailItem)

   ObjMail.To = strTo
   ObjMail.Subject = strSubject   
   ObjMail.Display
   'You now have the default signature within ObjMail.HTMLBody.
   'Add this after adding strHTMLBody
   ObjMail.HTMLBody = strHTMLBody & ObjMail.HTMLBody

   'ObjMail.Send 'send immediately or 
   'ObjMail.close olSave 'save as draft
   'Set OlApp = Nothing

End sub
Dim OutApp As Object, OutMail As Object, LogFile As String
Dim cell As Range, S As String, WMBody As String, lFile As Long

S = Environ("appdata") & "\Microsoft\Signatures\"
If Dir(S, vbDirectory) <> vbNullString Then S = S & Dir$(S & "*.htm") Else S = ""
S = CreateObject("Scripting.FileSystemObject").GetFile(S).OpenAsTextStream(1,  -2).ReadAll

WMBody = "<br>Hi All,<br><br>" & _
         "Last line,<br><br>" & S 'Add the Signature to end of HTML Body
.

그냥 내가 어떻게 이것을 달성 하는지를 공유 할 것으로 생각했습니다.정의 변수 감지에서 정확한지 여부가 너무 확실하지만 작고 읽고 쉽게 읽을 수 있습니다.

iApplication OLE 내에서 .htmlbody에 WMBODY를 첨부합니다.

누군가를 돕기를 바랍니다.

고마워, wes.

Outlook은 MailItem.Display (화면에 메시지가 표시되도록) 또는 MailItem.GetInspector 속성에 액세스 할 때 새로 만들지 않은 메시지 (해당 본문을 수정해서는 안됩니다)를 새 수정되지 않은 메시지에 추가합니다. 반환 된 검사관 객체로 아무 것도해야하지만 Outlook은 메시지 본문을 서명과 함께 채울 것입니다.

서명이 추가되면 HTMLBody 속성을 읽고 설정하려는 HTML 문자열과 병합하십시오. 단순히 2 개의 HTML 문자열을 연결할 수는 없습니다. 문자열을 병합해야합니다. 예를 들어, HTML 본문의 상단에 문자열을 삽입하려면 "<body" 하위 문자열을 찾은 다음 ">"의 다음 어커런스를 찾으십시오 (속성이있는 <body> 요소를 처리하십시오). 그런 다음 HTML 문자열을 삽입하십시오. > ".

Outlook Object 모델은 서명을 전혀 노출하지 않습니다.

일반 주에서는 서명의 이름이 iolkaccountmanager 확장 MAPI 인터페이스. 해당 인터페이스는 확장 MAPI이므로 C ++ 또는 Delphi를 사용하여 액세스 할 수 있습니다. OutlookSpy 에서 인터페이스 및 해당 데이터를 볼 수 있습니다.
서명 이름이 있으면 파일 시스템에서 HTML 파일을 읽을 수 있습니다 (폴더 이름 (영어의 서명)이 현지화되어 있음을 명심하십시오.
또한 서명에 이미지가 포함되어 있으면 첨부 파일과 첨부 파일과 IOlkAccountManager 속성을 가리키는 서명 폴더의 하위 폴더가 아닌 첨부 파일로 조정 된 서명 / 메시지 본문의 PeneraCodiceTag 코드 태그를 첨부 파일로 추가해야합니다. 이미지가 저장됩니다.

또한 메시지 자체의 스타일로 서명 HTML 파일에서 HTML 스타일을 병합하는 데는 책임이 있습니다.

보너스 옵션은 rdoaccount 객체 (VBA를 포함한 모든 언어로 액세스 가능). 새 메시지 서명 이름은 <img> 속성에 저장됩니다. 응답 서명이 src에 있습니다. rdoaccount .0x0016001F0x0017001F 속성을 사용할 수도 있습니다.
또한 보너스는 rdosignature . rcomail 객체 및 지정된 위치에 서명을 삽입하여 이미지와 스타일을 올바르게 병합합니다.

set Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT
set Drafts = Session.GetDefaultFolder(olFolderDrafts)
set   Msg = Drafts.Items.Add
Msg.To =   "user@domain.demo"
Msg.Subject =   "testing signatures"
Msg.HTMLBody =   "<html><body>some <b>bold</b> message text</body></html>"
set Account = Session.Accounts.GetOrder(2).Item(1)   'first mail account
if  Not (Account  Is  Nothing)  Then
   set Signature = Account.NewMessageSignature
   if  Not (Signature  Is  Nothing)  Then
    Signature.ApplyTo Msg,  false   'apply at the bottom
   End If
End If
Msg.Send
.

편집 : 2017 년 7 월 현재 Outlook 2016의 NewSignature는 더 이상 서명을 삽입하지 않습니다. ApplyTo 만 수행합니다.

REMURRING Schedule에서 메시지를 보내는 방법을 찾는 동안이 방법을 작성했습니다. 작성된 메시지의 Inspector 속성을 참조하는 방식이 내가 원하는 서명을 추가하지 않았습니다 (나는 별도의 서명을 사용하여 Outlook에서는 Outlook에서 하나 이상의 계정이 있음)

아래의 접근법은 상당히 유연하고 여전히 간단합니다.

    Private Sub Add_Signature(ByVal addy as String, ByVal subj as String, ByVal body as String)
       Dim oMsg As MailItem
       Set oMsg = Application.CreateItem(olMailItem)
       oMsg.To = addy
       oMsg.Subject = subj
       oMsg.Body = body
       Dim sig As String
       ' Mysig is the name you gave your signature in the OL Options dialog 
       sig = ReadSignature("Mysig.htm")
       oMsg.HTMLBody = Item.Body & "<p><BR/><BR/></p>" & sig ' oMsg.HTMLBody
       oMsg.Send
       Set oMsg = Nothing
    End Sub

    Private Function ReadSignature(sigName As String) As String
       Dim oFSO, oTextStream, oSig As Object
       Dim appDataDir, sig, sigPath, fileName As String
       appDataDir = Environ("APPDATA") & "\Microsoft\Signatures"
       sigPath = appDataDir & "\" & sigName

       Set oFSO = CreateObject("Scripting.FileSystemObject")
       Set oTextStream = oFSO.OpenTextFile(sigPath)
       sig = oTextStream.ReadAll
       ' fix relative references to images, etc. in sig
       ' by making them absolute paths, OL will find the image
       fileName = Replace(sigName, ".htm", "") & "_files/"
       sig = Replace(sig, fileName, appDataDir & "\" & fileName)
       ReadSignature = sig
    End Function
.

나는 파워 유저의 연구와 이전 의견의 도움 없이는 그것을 만들 수 없었기 때문에 나는 이것을 커뮤니티 위키 답변으로 만들었습니다.

나는 파워 유저의 Sub X 그리고 추가

Debug.Print "n------"    'with different values for n
Debug.Print ObjMail.HTMLBody

모든 진술 후에.이로부터 나는 서명이 내에없는 발견 .HTMLBody 그 후 까지 ObjMail.Display 그리고 나는 몸에 아무것도 추가하지 않은 경우에만.

나는 사용 된 파워 유저의 이전 솔루션으로 돌아갔다 C:\Users\" & Environ("username") & "\AppData\Roaming\Microsoft\Signatures\Mysig.txt").파워유저는 이 문제에 불만을 품었습니다.왜냐하면 그는 그의 해결책이 다른 서명을 가진 다른 사람들을 위해 일하기를 원했기 때문입니다.

내 서명이 같은 폴더에 있으며이 폴더를 변경할 수있는 옵션을 찾을 수 없습니다.이 폴더에있는 유일한 파일을 읽음으로써 하나의 서명 만 있으므로 내 유일한/기본 서명을 얻었습니다.

나는 테이블을 만들고 그것을 바로 다음 서명에 삽입했다. <body> 이 작업을 수행하려면 다음 단계를 따르세요나는 나 자신에게 이메일을 보내 그 결과는 내가 할 수 있는지 확인하기 위해 포함 내 서식처럼 당신을 제공 완벽하게 허용했다.

내 수정 된 서브루틴은:

Sub X()

  Dim OlApp As Outlook.Application
  Dim ObjMail As Outlook.MailItem

  Dim BodyHtml As String
  Dim DirSig As String
  Dim FileNameHTMSig As String
  Dim Pos1 As Long
  Dim Pos2 As Long
  Dim SigHtm As String

  DirSig = "C:\Users\" & Environ("username") & _
                               "\AppData\Roaming\Microsoft\Signatures"

  FileNameHTMSig = Dir$(DirSig & "\*.htm")

  ' Code to handle there being no htm signature or there being more than one

  SigHtm = GetBoiler(DirSig & "\" & FileNameHTMSig)
  Pos1 = InStr(1, LCase(SigHtm), "<body")

  ' Code to handle there being no body

  Pos2 = InStr(Pos1, LCase(SigHtm), ">")

  ' Code to handle there being no closing > for the body element

   BodyHtml = "<table border=0 width=""100%"" style=""Color: #0000FF""" & _
         " bgColor=#F0F0F0><tr><td align= ""center"">HTML table</td>" & _
         "</tr></table><br>"
  BodyHtml = Mid(SigHtm, 1, Pos2 + 1) & BodyHtml & Mid(SigHtm, Pos2 + 2)

  Set OlApp = Outlook.Application
  Set ObjMail = OlApp.CreateItem(olMailItem)
  ObjMail.BodyFormat = olFormatHTML
  ObjMail.Subject = "Subject goes here"
  ObjMail.Recipients.Add "my email address"
  ObjMail.Display

End Sub

파워 유저와 나는 모두 우리의 서명을 발견했기 때문에 C:\Users\" & Environ("username") & "\AppData\Roaming\Microsoft\Signatures 나는이 모든 아웃룩 설치에 대한 표준 위치 좋습니다.이 기본값을 변경할 수 있습니까?나는 그것을 제안 할 수있는 것을 찾을 수 없다.위의 코드는 분명히 약간의 개발이 필요하지만 서명 위에 테이블을 포함하는 이메일 본문을 만드는 파워 유저의 목표를 달성합니다.

나는 길을 알아 냈지만, 그것은 대부분이 너무 조잡 할 수도 있습니다.나는 간단한 DB를 가지고 있고 나는 그것을 위해 이메일을 생성 할 수있게하기를 원하며, 여기에 사용 된 다운 및 더러운 솔루션은 다음과 같습니다.

Body Text의 시작 부분은 새로운 이메일의 HTMLBody의 "<div class=WordSection1>"를 보는 유일한 곳이라는 것을 알았으므로 단순한 바꾸기를 사용 했으므로 를 교체했습니다.

"<div class=WordSection1><p class=MsoNormal><o:p>"

"<div class=WordSection1><p class=MsoNormal><o:p>" & sBody

sboy가 삽입을 원하는 바디 콘텐츠입니다.지금까지 일하는 것 같습니다.

.HTMLBody = Replace(oEmail.HTMLBody, "<div class=WordSection1><p class=MsoNormal><o:p>", "<div class=WordSection1><p class=MsoNormal><o:p>" & sBody)
.

가장 유용하다고 생각되는 서명 옵션에 대해 댓글을 게시하려면 담당자 50명이 필요하지만 이미지가 올바르게 표시되지 않는 문제가 있어서 해결 방법을 찾아야 했습니다.이것이 내 해결책입니다.

@Morris Maynard의 답변을 기반으로 사용 https://stackoverflow.com/a/18455148/2337102 그런 다음 다음을 거쳐야했습니다.

노트:
시작하기 전에 .htm 파일을 백업하고 보조 폴더에 복사하여 붙여넣으세요.

  1. 당신은 두 가지 모두와 함께 일하게 될 것입니다 SignatureName.htm 그리고 SignatureName_files Folder

  2. 당신은 필요하지 않습니다 HTML 경험상 파일은 Notepad, Notepad++ 또는 지정된 HTML 프로그램과 같은 편집 프로그램에서 열립니다.

  3. 서명 파일 위치로 이동합니다(표준은 C:\Users\"username"\AppData\Roaming\Microsoft\Signatures)

  4. 열기 SignatureName.htm 텍스트/htm 편집기의 파일("프로그램으로 편집" 파일을 마우스 오른쪽 버튼으로 클릭)

  5. 사용 Ctrl+F 그리고 입력 .png; .jpg 또는 이미지 유형을 모르는 경우 image001다음과 같은 내용이 표시됩니다. src="signaturename_files/image001.png"

  6. 이미지 위치의 전체 주소로 변경해야 합니다. C:\Users\YourName\AppData\Roaming\Microsoft\Signatures\SignatureNameFolder_files\image001
    또는
    src="E:\location\Signatures\SignatureNameFolder_files\image001.png"

  7. 파일을 저장하세요(덮어쓰기, 원본은 당연히 백업해 두었습니다)

  8. Outlook으로 돌아가서 새 메일 항목을 열고 서명을 추가하세요.파일이 변경되었다는 경고를 받았고 확인을 클릭했습니다. 이 작업을 두 번 수행한 다음 "서명 편집 메뉴"에서 한 번 수행해야 했습니다.

    Some of the files in this webpage aren't in the expected location. Do you want to download them anyway? If you're sure the Web page is from a trusted source, click Yes."

  9. 매크로 이벤트를 실행하면 이제 이미지가 표시됩니다.

신용 거래
MrExcel - VBA 코드 서명 코드 오류: http://bit.ly/1gap9jY

다른 답변 대부분은 HTML 서명과 함께 HTML 본문을 단순히 연결합니다.그러나 이미지에서는 작동하지 않으며이 작업을 수행하는 더 많은 "표준"방식이 밝혀졌습니다. 1

Microsoft Outlook Pre-2007, WordEditor를 Edit Editor 및 Microsoft Outlook 2007 및 그 이상으로 구성한 Word 편집기의 약간 절단 버전을 사용하여 전자 메일을 편집합니다.즉, 전자 메일을 변경하려면 Microsoft Word 문서 개체 모델을 사용할 수 있습니다.

Set objMsg = Application.CreateItem(olMailItem)
objMsg.GetInspector.Display 'Displaying an empty email will populate the default signature
Set objSigDoc = objMsg.GetInspector.WordEditor
Set objSel = objSigDoc.Windows(1).Selection
With objSel
   .Collapse wdCollapseStart
   .MoveEnd WdUnits.wdStory, 1
   .Copy 'This will copy the signature
End With
objMsg.HTMLBody = "<p>OUR HTML STUFF HERE</p>"
With objSel
   .Move WdUnits.wdStory, 1 'Move to the end of our new message
   .PasteAndFormat wdFormatOriginalFormatting 'Paste the copied signature
End With 
'I am not a VB programmer, wrote this originally in another language so if it does not
'compile it is because this is my first VB method :P
.

Microsoft Outlook 2007 프로그래밍 (S. Mosher)> 17 장, 아이템 본문 작업 : Outlook 서명 작업

나는 mozzi 의 답변을 좋아하지만 사용자가 특정한 기본 글꼴을 유지하지 않았 음을 발견했습니다. 텍스트는 모두 시스템 글꼴에 일반 텍스트로 표시됩니다. 아래 코드는 사용자가 좋아하는 글꼴을 유지하면서 조금 더 오래 걸립니다. Mozzi 의 접근 방식을 기반으로합니다. 정규 표현식을 사용하여 기본 본문 텍스트를 바꾸고 사용자의 선택한 본문 텍스트를 배치합니다. GetInspector.WordEditor를 사용하여 속한 곳에 속한 곳. GetInspector에 대한 호출이 not htmlbody를 Dimitry Streblechenko 로 채우는 것을 발견했습니다. 이 스레드에서는 적어도 Office 2010에서 아닌이 스레드에서 개체가 여전히 내 코드에 표시됩니다. 지나가는 경우 객체로 만들어지는 것이 중요합니다. 객체로 만들어지는 것이 중요합니다. 여기를 보냅니다. (오, 그리고 다른 취향의 죄송합니다. 그러나 나는 루틴을 찾을 수 있도록 서술적인 변수 이름을 길게 더 좋아합니다!)

Public Function GetSignedMailItemAsObject(ByVal ToAddress As String, _
                      ByVal Subject As String, _
                      ByVal Body As String, _
                      SignatureName As String) As Object
'================================================================================================================='Creates a new MailItem in HTML format as an Object.
'Body, if provided, replaces all text in the default message.
'A Signature is appended at the end of the message.
'If SignatureName is invalid any existing default signature is left in place.
'=================================================================================================================
' REQUIRED REFERENCES
' VBScript regular expressions (5.5)
' Microsoft Scripting Runtime
'=================================================================================================================
Dim OlM As Object               'Do not define this as Outlook.MailItem.  If you do, some things will work and some won't (i.e. SendUsingAccount)
Dim Signature As String
Dim Doc As Word.Document
Dim Regex As New VBScript_RegExp_55.RegExp       '(can also use use Object if VBScript is not Referenced)

Set OlM = Application.CreateItem(olMailItem)
With OlM
    .To = ToAddress
    .Subject = Subject
    'SignatureName is the exactname that you gave your signature in the Message>Insert>Signature Dialog
    Signature = GetSignature(SignatureName)
    If Signature <> vbNullString Then
'        Should really strip the terminal </body tag out of signature by removing all characters from the start of the tag
'        but Outlook seems to handle this OK if you don't bother.
        .Display                                'Needed.  Without it, there is no existing HTMLbody available to work with.
        Set Doc = OlM.GetInspector.WordEditor   'Get any existing body with the WordEditor and delete all of it
        Doc.Range(Doc.Content.Start, Doc.Content.End) = vbNullString 'Delete all existing content - we don't want any default signature
        'Preserve all local email formatting by placing any new body text, followed by the Signature, into the empty HTMLbody.
        With Regex
            .IgnoreCase = True                  'Case insensitive
            .Global = False                     'Regex finds only the first match
            .MultiLine = True                   'In case there are stray EndOfLines (there shouldn't be in HTML but Word exports of HTML can be dire)
            .Pattern = "(<body.*)(?=<\/body)"   'Look for the whole HTMLbody but do NOT include the terminal </body tag in the value returned
            OlM.HTMLbody = .Replace(OlM.HTMLbody, "$1" & Signature)
        End With ' Regex
        Doc.Range(Doc.Content.Start, Doc.Content.Start) = Body 'Place the required Body before the signature (it will get the default style)
        .Close olSave                           'Close the Displayed MailItem (actually Object) and Save it.  If it is left open some later updates may fail.
    End If ' Signature <> vbNullString
End With ' OlM
Set GetSignedMailItemAsObject = OlM
End Function

Private Function GetSignature(sigName As String) As String
Dim oTextStream As Scripting.TextStream
Dim oSig As Object
Dim appDataDir, Signature, sigPath, fileName As String
Dim FileSys As Scripting.FileSystemObject        'Requires Microsoft Scripting Runtime to be available
    appDataDir = Environ("APPDATA") & "\Microsoft\Signatures"
    sigPath = appDataDir & "\" & sigName & ".htm"
    Set FileSys = CreateObject("Scripting.FileSystemObject")
    Set oTextStream = FileSys.OpenTextFile(sigPath)
    Signature = oTextStream.ReadAll
    ' fix relative references to images, etc. in Signature
    ' by making them absolute paths, OL will find the image
    fileName = Replace(sigName, ".htm", "") & "_files/"
    Signature = Replace(Signature, fileName, appDataDir & "\" & fileName)
    GetSignature = Signature
End Function
.

종종 이 질문은 Ron de Bruin의 맥락에서 제기됩니다. RangeToHTML HTML을 생성하는 함수 PublishObject 에서 Excel.Range, FSO를 통해 이를 추출하고 결과 스트림 HTML을 이메일의 HTMLBody.이렇게 하면 기본 서명( RangeToHTML 함수에는 도우미 함수가 있습니다. GetBoiler 기본 서명을 삽입하려고 시도합니다).

불행하게도 문서화가 잘 되어 있지 않습니다. Application.CommandBars Outlook에서는 방법을 사용할 수 없습니다.

wdDoc.Application.CommandBars.ExecuteMso "PasteExcelTableSourceFormatting"

런타임 6158이 발생합니다.

enter image description here

하지만 우리는 여전히 Word.Document 다음을 통해 액세스할 수 있습니다. MailItem.GetInspector 방법을 사용하면 기본 서명(있는 경우)을 유지하면서 Excel에서 선택한 항목을 Outlook 이메일 본문에 복사하여 붙여넣는 것과 같은 작업을 수행할 수 있습니다.

Dim rng as Range
Set rng = Range("A1:F10") 'Modify as needed

With OutMail
    .To = "xxxxx@xxxxx.com"
    .BCC = ""
    .Subject = "Subject"
    .Display
    Dim wdDoc As Object     '## Word.Document
    Dim wdRange As Object   '## Word.Range
    Set wdDoc = OutMail.GetInspector.WordEditor
    Set wdRange = wdDoc.Range(0, 0)
    wdRange.InsertAfter vbCrLf & vbCrLf
    'Copy the range in-place
    rng.Copy
    wdRange.Paste
End With

어떤 경우에는 열 너비 또는 어떤 경우에는 행 높이가 완벽하게 유지되지 않을 수 있으며 Excel 범위의 모양 및 기타 개체도 복사되지만 이로 인해 약간의 정렬 문제가 발생할 수도 있지만 간단한 테이블 및 Excel 범위는 매우 좋습니다.

enter image description here

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top