entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Macro para Outlook 2007 para archivar E-mail como PDF

Vamos a ver, voy a intentar explicar lo más claro posible lo que necesitamos hacer a ver si a alguien se le ocurre alguna forma. Necesitamos crear un nuevo botón en MS Outlook 2007 en la barra de herramientas con en el que, al hacer click, se nos guarde como PDF en una carpeta concreta el e-mail que estamos viendo, este PDF debe tener la forma siguiente:

E-Mail enviado por: <remitente>
E-Mail recepcionado por: <persona que pulsó el botón de convertir a PDF>
Número de expediente: <un número que viene en el subject del e-mail>

<Cuerpo del e-mail>

Esa debería ser la estructura lo que no encuentro es la forma correcta de hacerlo. Alguien por aquí sabe más que yo y me puede echar un cable con esto? He encontrado procedimientos para salvar por ejemplo un excel como PDF asignándole como nombre el valor de una celda pero no encuentro como hacer algo parecido con Outlook y un e-mail.

Gracias por la ayuda!

2 Respuestas

1voto

ankeorum Puntos7210

Estoy usando este código:

Public Sub GetSelectedItem_Click()
    ' This uses an existing instance if available (default Outlook behavior).
    Dim oApp As New Outlook.Application
    Dim oExp As Outlook.Explorer
    Dim oSel As Outlook.Selection   ' You need a selection object for getting the selection.
    Dim oItem As Object             ' You don't know the type yet.

    Set oExp = oApp.ActiveExplorer  ' Get the ActiveExplorer.
    Set oSel = oExp.Selection       ' Get the selection.

    For i = 1 To oSel.Count         ' Loop through all the currently .selected items
        Set oItem = oSel.Item(i)    ' Get a selected item.
        DisplayInfo oItem           ' Display information about it.
    Next i

End Sub

Sub DisplayInfo(oItem As Object)

    Dim strMessageClass As String
    Dim oAppointItem As Outlook.AppointmentItem
    Dim oContactItem As Outlook.ContactItem
    Dim oMailItem As Outlook.MailItem
    Dim oJournalItem As Outlook.JournalItem
    Dim oNoteItem As Outlook.NoteItem
    Dim oTaskItem As Outlook.TaskItem
    Dim oBody As String
    Dim uniqueKeyStart As String
    Dim uniqueKeyEnd As String
    Dim UniqueKey As Integer

    ' You need the message class to determine the type.
    strMessageClass = oItem.MessageClass

    If (strMessageClass = "IPM.Appointment") Then       ' Calendar Entry.
        Set oAppointItem = oItem
        MsgBox oAppointItem.Subject
        MsgBox oAppointItem.Start
    ElseIf (strMessageClass = "IPM.Contact") Then       ' Contact Entry.
        Set oContactItem = oItem
        MsgBox oContactItem.FullName
        MsgBox oContactItem.Email1Address
    ElseIf (strMessageClass = "IPM.Note") Then          ' Mail Entry.
        Set oMailItem = oItem
        MsgBox oMailItem.Subject
        oBody = oMailItem.Body
        uniqueKeyStart = InStr(1, oBody, "::")
        uniqueKeyEnd = InStrRev(oBody, "::")
        Dim MPLCuser As String

        MPLCuser = Environ("UserName")

        UniqueKey = Mid(oBody, uniqueKeyStart + 2, uniqueKeyEnd - uniqueKeyStart - 2)
        Call ConfirmClaim(UniqueKey, MPLCuser)
        MsgBox UniqueKey
    ElseIf (strMessageClass = "IPM.Activity") Then      ' Journal Entry.
        Set oJournalItem = oItem
        MsgBox oJournalItem.Subject
        MsgBox oJournalItem.Actions
    ElseIf (strMessageClass = "IPM.StickyNote") Then    ' Notes Entry.
        Set oNoteItem = oItem
        MsgBox oNoteItem.Subject
        MsgBox oNoteItem.Body
    ElseIf (strMessageClass = "IPM.Task") Then          ' Tasks Entry.
        Set oTaskItem = oItem
        MsgBox oTaskItem.DueDate
        MsgBox oTaskItem.PercentComplete
    End If

End Sub

Function ConfirmClaim(myUniqueKey As Integer, MPLCuser As String)

Dim UserNoSpaces

If VarType(myUniqueKey) = 2 Then ' Must be a Number

 UserNoSpaces = Replace(MPLCuser, " ", "")

 MyApp = "C:\Program Files\Internet Explorer\IEXPLORE.EXE"
 MyURL = url & myUniqueKey & "&claimuser=" & UserNoSpaces
 MsgBox (MyURL)
 Shell (MyApp & " " & MyURL), vbHide

Else

 MsgBox "You have not specified a correct claim"

End If

End Function

Con ese código primero vemos qué se ha seleccionado, luego en base a eso hacemos una cosa u otra. Lo que nos interesa es cuando seleccionamos un mail que lo que hacemos es buscar un valor concreto que trae el mail que está entre "::" y lo rescatamos, ese valor lo mandamos a una página que con el valor y el usuario debe generarnos un sumario que luego vamos a hacer Ctrl+P a una impresora PDF y como nombre tendrá:

$PDFname = $UniqueKey."-".$MPLCuser."-".date(d/m/Y H:i).".pdf"
$PDFfolder = "X:/PDFWeb/" // Esto será una unidad mapeada.

Lo que quiero hacer a continuación es lo que estoy preguntando en mi otra pregunta. Que aunque está relacionada con esta como no son cosas iguales no la he puesto aquí.

0voto

Peter comentado

Si esta es la solución, por favor marcala como correcta.

Saludos.

2votos

carlossevi Puntos63580

Mira, te dejo un ejemplo de macro que coge los mensajes seleccionados, crea tareas y elimina el correo original:

Sub Email2Tarea()
    Dim Correo As MailItem
    If ThisOutlookSession.ActiveExplorer.Selection.Count > 0 Then
        For i = 1 To ThisOutlookSession.ActiveExplorer.Selection.Count
            Set Correo = ThisOutlookSession.ActiveExplorer.Selection.Item(i)
            Call CrearTarea(Correo.Subject, Correo.Body)
            Correo.Delete
        Next
    End If
End Sub

Private Sub CrearTarea(Nombre As String, Contenido As String)
    Dim objOLApp As Outlook.Application
    Dim NewTask As Outlook.TaskItem
    ' Set the Application object
    Set objOLApp = New Outlook.Application
    ' You can only use CreateItem for default items
    Set NewTask = objOLApp.CreateItem(olTaskItem)
    NewTask.Subject = Nombre
    NewTask.Body = Contenido
    NewTask.Categories = "Pendiente revisar"
    NewTask.DueDate = Now
    NewTask.Save
End Sub

Esto lo tengo en un módulo del editor de macros, en un proyecto que he creado nuevo "Funciones adicionales".

En tu caso tendrías que modificarlo un poco para adaptarlo al que dices que tienes de ejemplo que genera un PDF, pero la forma de desencadenarlo puedes tomarlo de aquí.

Una vez te funcione, desde la opciones de Outlook puedes personalizar la cinta de opciones y añadir como botón cualquier macro que hayas definido eligiendo Comandos disponibles en = Macros:

Personalización de cinta de opciones

Así sacas la macro que has creado como botón al ribbon de Outlook.

0voto

ankeorum comentado

Muchas gracias por la ayuda

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta