Eingehende Emails nicht vom Customer automatisch internal

Hilfe zu Znuny Problemen aller Art
Locked
Jev
Znuny newbie
Posts: 31
Joined: 08 Aug 2011, 18:01
Znuny Version: 3.1.8
Contact:

Eingehende Emails nicht vom Customer automatisch internal

Post by Jev »

Hallo,

wir haben eine Anforderung bei uns bekommen, die ich noch nicht geschafft habe umzusetzen.

Bei uns soll es möglich sein, wenn jemand eine Email mit dem Titel eines Tickets (mit Ticketnummer) an das System schickt, dass diese Email automatisch als "email-internal" zum Ticket angehangen wird.
Dies soll nur passieren, wenn der Absender der Email nicht der Customer ist.

Mit dem PostMaster Filter kann man das meine ich nicht machen, da ich mit einem RegExp nicht an die Customer Daten herankomme.

Hat jemand hierfür vielleicht eine Lösung?
reneeb
Znuny guru
Posts: 5018
Joined: 13 Mar 2011, 09:54
Znuny Version: 6.0.x
Real Name: Renée Bäcker
Company: Perl-Services.de
Contact:

Re: Eingehende Emails nicht vom Customer automatisch interna

Post by reneeb »

Ein Filter-Modul ist hier die Lösung. Als Grundlage kann Dir viewtopic.php?f=35&t=10824&p=42169&hili ... dul#p42169 dienen. In dem Modul musst Du halt eine Kundensuche auf Basis der Senderadresse machen und dann darauf reagieren.
Perl / Znuny development: http://perl-services.de
Free Znuny add ons from the community: http://opar.perl-services.de
Commercial add ons: http://feature-addons.de
Jev
Znuny newbie
Posts: 31
Joined: 08 Aug 2011, 18:01
Znuny Version: 3.1.8
Contact:

Re: Eingehende Emails nicht vom Customer automatisch interna

Post by Jev »

Hallo reneeb,

außer den paar Änderungen im OTRS habe ich mit PERL bisher noch nichts gemacht. Verstehe da noch vieles nicht.
Ich bin mir nicht sicher, ob meine Lösung zum Erfolg führt.

Vielleicht kannst du mir bisschen unter die Arme greifen.

Code: Select all

package Kernel::System::PostMaster::Filter::SetEmailInternalIfNotCustomer;

use strict;
use warnings;

use vars qw($VERSION);
$VERSION = qw($Revision: 1.7 $) [1];

sub new {
    my ( $Type, %Param ) = @_;

    # allocate new hash for object
    my $Self = {};
    bless( $Self, $Type );

    $Self->{Debug} = $Param{Debug} || 0;

    # get needed objects
    for (qw(ConfigObject LogObject DBObject MainObject TicketObject ParserObject CustomerUserObject)) {
        $Self->{$_} = $Param{$_} || die "Got no $_!";
    }

    return $Self;
}

sub Run {
    my ( $Self, %Param ) = @_;

    # check needed stuff
    for (qw(TicketID JobConfig GetParam)) {
        if ( !$Param{$_} ) {
            $Self->{LogObject}->Log( Priority => 'error', Message => "Need $_!" );
            return;
        }
    }
	my %GetParam = %{ $Param{GetParam} };
	
	# get sender email
    my @EmailAddresses = $Self->{ParserObject}->SplitAddressLine( Line => $GetParam{From}, );
    for (@EmailAddresses) {
        my $SenderMailAdress = $Self->{ParserObject}->GetEmailAddress( Email => $_, );
    }

    # get all article
    my @ArticleIndex = $Self->{TicketObject}->ArticleGet(
        TicketID      => $Param{TicketID},
        DynamicFields => 0,
    );
    return if !@ArticleIndex;
	
    # get latest customer article (current arrival)
    my $CurrentArrivalArticle;
    for my $Article ( reverse @ArticleIndex ) {
        next if $Article->{SenderType} ne 'customer';
        $CurrentArrivalArticle = $Article;
        $ArticleID = $Article->{ArticleID};
        last;
    }
    return 1 if !$CurrentArrivalArticle;
	
    my %CustomerUser = $Self->{CustomerUserObject}->CustomerUserDataGet(
        User => $CurrentArrivalArticle{CustomerUserID},
    );

    # if sender email not equal customer email 
    if ( $CustomerUser{UserEmail} ne $SenderMailAdress) {
     
        # set article type to email-internal
        $Self->{TicketObject}->ArticleUpdate(
            ArticleID => $ArticleID,
            Key       => 'ArticleType',
            Value     => 'email-internal',
            UserID    => 1,
            TicketID  => $Param{TicketID},
        );
		
        return 1;
     }
     return 1;
}

1;
reneeb
Znuny guru
Posts: 5018
Joined: 13 Mar 2011, 09:54
Znuny Version: 6.0.x
Real Name: Renée Bäcker
Company: Perl-Services.de
Contact:

Re: Eingehende Emails nicht vom Customer automatisch interna

Post by reneeb »

Ok, grundsätzlich sieht das gar nicht so schlecht aus. Aber erstmal muss klar sein was überhaupt passieren soll (der Threadtitel ist mehrdeutig). Ich schreibe hier nur Möglichkeiten auf. Wenn etwas davon abweichend zu Deinem Vorhaben ist, dann bitte anmerken.

Annahme: Mail von person.a@company.example (A) trifft ein

Szenario 1: Mail erzeugt neues Ticket. Article ist external

Szenario 2: Mail ist Followup. Ticket wurde von person.b@company.example (B) erstellt (B != A)
-> a) A ist ein existierender Kunde ist, daher ist Artikel external.
-> b) A ist kein Kunde, daher ist Artikel internal
-> c) weil B != A (also nicht der initiale Ticketkunde ist), ist Artikel auf jeden Fall internal

Szenario 3: Mail ist Followup. person.a@company.example hat Ticket erstellt (A == A).
-> a) A ist kein Kunde, also ist Artikel internal
-> b) A ist Kunde, also ist Artikel external
Perl / Znuny development: http://perl-services.de
Free Znuny add ons from the community: http://opar.perl-services.de
Commercial add ons: http://feature-addons.de
Jev
Znuny newbie
Posts: 31
Joined: 08 Aug 2011, 18:01
Znuny Version: 3.1.8
Contact:

Re: Eingehende Emails nicht vom Customer automatisch interna

Post by Jev »

Szenario 1: Mail erzeugt neues Ticket. Article ist external
Der Artikel des initialien Ticketkunden soll natürlich external.

Szenario 2: Mail ist Followup. Ticket wurde von person.b@company.example (B) erstellt (B != A)
-> a) A ist ein existierender Kunde ist, daher ist Artikel external.
-> b) A ist kein Kunde, daher ist Artikel internal
-> c) weil B != A (also nicht der initiale Ticketkunde ist), ist Artikel auf jeden Fall internal
c wäre korrekt. also nur die Mails des initialien Ticketkunden sollen external sein. Es ist egal, ob der Kunde existiert oder nicht sobald A!=B dann internal!

Szenario 3: Mail ist Followup. person.a@company.example hat Ticket erstellt (A == A).
-> a) A ist kein Kunde, also ist Artikel internal
-> b) A ist Kunde, also ist Artikel external
Hier trifft nichts zu. Es ist egal, ob der Kunde existiert oder nicht. Ssobald A != B dann internal. A==A dann external.



Hintergrund ist, dass wir Personen im Unternehmen haben, die sich den Betreff eines Tickets rauskopieren und dann an das Ticketsystem eine Antwort senden, da sie in der Annahme sind, dass ihre Email als eine Art interne Notiz an das Ticket gehängt wird. Das wird man den Leuten wohl auch nicht mehr ausreden können (kurzfristig ja.. in Zukunft wird dies aber immer wieder vorkommen). Und dann haben wir wieder den Salat, dass Informationen an den Kunden gelangen, die dieser nicht sehen darf.
Zusätzlich werden wir auch zukünftig keinen solchen Fall haben, dass wir einen externen Supporter per Weiterleitung des Tickets mit in ein Gespräch im Ticket holen.
reneeb
Znuny guru
Posts: 5018
Joined: 13 Mar 2011, 09:54
Znuny Version: 6.0.x
Real Name: Renée Bäcker
Company: Perl-Services.de
Contact:

Re: Eingehende Emails nicht vom Customer automatisch interna

Post by reneeb »

ungetestet: https://gist.github.com/reneeb/10115413

Edit: Das ist als Pre-Filter umgesetzt, so dass der Filter so in der Config eingeschaltet werden muss:

Code: Select all

$Self->{'PostMaster::PreFilterModule'}->{'010-EmailAsInternal'} =  {
  'Module' => 'Kernel::System::PostMaster::Filter::Invoices'
};
Perl / Znuny development: http://perl-services.de
Free Znuny add ons from the community: http://opar.perl-services.de
Commercial add ons: http://feature-addons.de
Jev
Znuny newbie
Posts: 31
Joined: 08 Aug 2011, 18:01
Znuny Version: 3.1.8
Contact:

Re: Eingehende Emails nicht vom Customer automatisch interna

Post by Jev »

Vielen Dank reneeb!

Zwei kleine Fehlerchen waren noch drinnen.

Hier der funktionierende Code:

Code: Select all

package Kernel::System::PostMaster::Filter::SetEmailInternalIfNotCustomer;

use strict;
use warnings;

use vars qw($VERSION);
$VERSION = qw($Revision: 1.7 $) [1];

sub new {
    my ( $Type, %Param ) = @_;

    # allocate new hash for object
    my $Self = {};
    bless( $Self, $Type );

    $Self->{Debug} = $Param{Debug} || 0;

    # get needed objects
    for (qw(ConfigObject LogObject DBObject MainObject TicketObject ParserObject)) {
        $Self->{$_} = $Param{$_} || die "Got no $_!";
    }

    return $Self;
}

sub Run {
    my ( $Self, %Param ) = @_;

    # check needed stuff
    for (qw(JobConfig GetParam)) {
        if ( !$Param{$_} ) {
            $Self->{LogObject}->Log( Priority => 'error', Message => "Need $_!" );
            return;
        }
    }

    # do not change anything when a new ticket is going to be created
    return 1 if !$Param{TicketID};

    # get first article of the existing ticket
    my %FirstArticle = $Self->{TicketObject}->ArticleFirstArticle(
        TicketID => $Param{TicketID},
        UserID   => 1,
    );

    my @CustomerAddresses     = $Self->{ParserObject}->SplitAddressLine( Line => $FirstArticle{From} );
    my %CustomerMailAddresses = map{
        $Self->{ParserObject}->GetEmailAddress( Email => $_ ) => 1;
    }@CustomerAddresses;

    my %GetParam = %{ $Param{GetParam} };

    # get sender email
    my @EmailAddresses = $Self->{ParserObject}->SplitAddressLine( Line => $GetParam{From}, );
    for (@EmailAddresses) {
        my $SenderMailAddress = $Self->{ParserObject}->GetEmailAddress( Email => $_, );

        if ( $CustomerMailAddresses{$SenderMailAddress} ) {
            $Param{GetParam}->{'X-OTRS-FollowUp-ArticleType'} = 'email-internal';
            last;
        }
    }

    return 1;
}

1;


In der Config:

Code: Select all

    $Self->{'PostMaster::PreFilterModule'}->{'010-SetEmailInternalIfNotCustomer'} =  {
        'Module' => 'Kernel::System::PostMaster::Filter::SetEmailInternalIfNotCustomer'
    };
nd0
Znuny expert
Posts: 232
Joined: 24 Mar 2015, 16:53
Znuny Version: 5.0.14
Location: Colonia

Re: Eingehende Emails nicht vom Customer automatisch internal

Post by nd0 »

Ist das in der 4er Version so noch aktuell?
LIVE: OTRS 5.0.14 || Debian || MySQL/LDAP
TEST: OTRS 5.0.14 || Debian || MySQL/LDAP
reneeb
Znuny guru
Posts: 5018
Joined: 13 Mar 2011, 09:54
Znuny Version: 6.0.x
Real Name: Renée Bäcker
Company: Perl-Services.de
Contact:

Re: Eingehende Emails nicht vom Customer automatisch internal

Post by reneeb »

Für OTRS >= 4 (ungetestet):

Code: Select all

package Kernel::System::PostMaster::Filter::SetEmailInternalIfNotCustomer;

use strict;
use warnings;

use Kernel::System::EmailParser;

our @ObjectDependencies = qw(
    Kernel::System::Log
    Kernel::System::Ticket
);

sub new {
    my ( $Type, %Param ) = @_;

    # allocate new hash for object
    my $Self = {};
    bless( $Self, $Type );

    $Self->{Debug} = $Param{Debug} || 0;

    return $Self;
}

sub Run {
    my ( $Self, %Param ) = @_;

    my $LogObject    = $Kernel::OM->Get('Kernel::System::Log');
    my $TicketObject = $Kernel::OM->Get('Kernel::System::Ticket');
    my $ParserObject = Kernel::System::EmailParser->new(
        Mode => 'Standalone',
    );

    # check needed stuff
    for (qw(JobConfig GetParam)) {
        if ( !$Param{$_} ) {
            $LogObject->Log( Priority => 'error', Message => "Need $_!" );
            return;
        }
    }

    # do not change anything when a new ticket is going to be created
    return 1 if !$Param{TicketID};

    # get first article of the existing ticket
    my %FirstArticle = $TicketObject->ArticleFirstArticle(
        TicketID => $Param{TicketID},
        UserID   => 1,
    );

    my @CustomerAddresses     = $ParserObject->SplitAddressLine( Line => $FirstArticle{From} );
    my %CustomerMailAddresses = map{
        $ParserObject->GetEmailAddress( Email => $_ ) => 1;
    }@CustomerAddresses;

    my %GetParam = %{ $Param{GetParam} };

    # get sender email
    my @EmailAddresses = $ParserObject->SplitAddressLine( Line => $GetParam{From}, );
    for (@EmailAddresses) {
        my $SenderMailAddress = $ParserObject->GetEmailAddress( Email => $_, );

        if ( $CustomerMailAddresses{$SenderMailAddress} ) {
            $Param{GetParam}->{'X-OTRS-FollowUp-ArticleType'} = 'email-internal';
            last;
        }
    }

    return 1;
}

1;
Perl / Znuny development: http://perl-services.de
Free Znuny add ons from the community: http://opar.perl-services.de
Commercial add ons: http://feature-addons.de
Locked