Neues Ticket per Mail beantworten und Agent zuteilen

Allgemein Fragen, deutsche News, Ankündigungen & Events zum OTRS
Post Reply
Ikkarus13
Znuny newbie
Posts: 35
Joined: 28 Sep 2016, 16:32
Znuny Version: 6.3.3
Real Name: Sascha Kunimünch
Company: Wetrok AG

Neues Ticket per Mail beantworten und Agent zuteilen

Post by Ikkarus13 »

Hallo Zusammen,

beschäftige mich seit ca. einem Monat mit OTRS, da wir es in unserer Firma verwenden wollen. Nun habe ich die meisten Einstellungen und Anpassungen auch schon erfolgreich vorgenommen.
Was mir noch fehlt ist die Möglichkeit, dass wenn man als Agent auf ein neues Ticket antwortet, dass man dann auch Besitzer dieses Tickets wird. Habe es mal mit PostmasterFilter versucht und auch mit X-OTRS-OWNER(ID) und X-OTRS-FOLLOWUP-OWNER(ID) vier Variablen gefunden, welche wohl dafür zuständig sind. Was mir noch fehlt ist die Möglichkeit anhand der E-Mail Adresse (steht ja im "FROM") den Agenten zuzuweisen. Ich bräuchte eine Übersetzung Mailadresse - Benutzername oder Mailadresse - BenutzerID.

Gibt es sowas schon fertig oder hat mir jemand eine Tipp wie ich das bewerkstelligen kann? Leider habe ich bisher keinerlei PEARL Kenntnisse.

Vielen Dank schon mal für eure Hilfe.

Sascha
patzig
Znuny newbie
Posts: 71
Joined: 08 Mar 2016, 12:45
Znuny Version: 5.0.10
Real Name: Patrick

Re: Neues Ticket per Mail beantworten und Agent zuteilen

Post by patzig »

wieso antwortest du nicht aus dem System heraus ?
Live-System: OTRS 5.0.10, CentOS 7
Testsystem: OTRS 5.0.9, CentOS 6.6
Ikkarus13
Znuny newbie
Posts: 35
Joined: 28 Sep 2016, 16:32
Znuny Version: 6.3.3
Real Name: Sascha Kunimünch
Company: Wetrok AG

Re: Neues Ticket per Mail beantworten und Agent zuteilen

Post by Ikkarus13 »

Unsere Agenten würden gerne per Mail antworten um z.B. auch einfach ein Screenshot anhängen zu können.
wurzel
Znuny guru
Posts: 3230
Joined: 08 Jul 2010, 22:25
Znuny Version: x.x.x
Real Name: Florian

Re: Neues Ticket per Mail beantworten und Agent zuteilen

Post by wurzel »

Hi,

also ich kann im OTRS wenn ich auf antworten gehe Attachements hochladen und auch drag&drop screenshots reinpacken.

Flo
OTRS 8 SILVER (Prod)
OTRS 8 auf Debian 11 (Test)
Znuny 7.x latest version testing auf Debian 11

-- Ich beantworte keine Forums-Fragen PN - No PN please

I won't answer to unfriendly users any more. A greeting and regards are just polite.
Ikkarus13
Znuny newbie
Posts: 35
Joined: 28 Sep 2016, 16:32
Znuny Version: 6.3.3
Real Name: Sascha Kunimünch
Company: Wetrok AG

Re: Neues Ticket per Mail beantworten und Agent zuteilen

Post by Ikkarus13 »

Unsere User wollen aber halt leider weiterhin alles über Outlook machen können. Und da kann man halt schön verschiedene Screenshots an verschiedene Stellen innerhalb der Mail platzieren. Das geht halt nicht über das Portal.
RStraub
Znuny guru
Posts: 2210
Joined: 13 Mar 2014, 09:16
Znuny Version: 6.0.14
Real Name: Rolf Straub

Re: Neues Ticket per Mail beantworten und Agent zuteilen

Post by RStraub »

Und der Nutzen von einfach platzierbaren Screenshots überwiegt den einer kollaborativen Ticketplattform?
Currently using: OTRS 6.0.14 -- MariaDB -- Ubuntu 16 LTS
wurzel
Znuny guru
Posts: 3230
Joined: 08 Jul 2010, 22:25
Znuny Version: x.x.x
Real Name: Florian

Re: Neues Ticket per Mail beantworten und Agent zuteilen

Post by wurzel »

Hi,

dann geht das nicht.

Flo
OTRS 8 SILVER (Prod)
OTRS 8 auf Debian 11 (Test)
Znuny 7.x latest version testing auf Debian 11

-- Ich beantworte keine Forums-Fragen PN - No PN please

I won't answer to unfriendly users any more. A greeting and regards are just polite.
Ikkarus13
Znuny newbie
Posts: 35
Joined: 28 Sep 2016, 16:32
Znuny Version: 6.3.3
Real Name: Sascha Kunimünch
Company: Wetrok AG

Re: Neues Ticket per Mail beantworten und Agent zuteilen

Post by Ikkarus13 »

Ich hatte mal etwas gelesen, wie man mit Pearl irgendwie eine Verbindung OWNERID und Mailadresse. Kennt sich vielleicht damit jemand aus?
wurzel
Znuny guru
Posts: 3230
Joined: 08 Jul 2010, 22:25
Znuny Version: x.x.x
Real Name: Florian

Re: Neues Ticket per Mail beantworten und Agent zuteilen

Post by wurzel »

Hi,

ist es Perl und nicht Pearl

Wenn Du die Standardfunktion von OTRS (welche wirklich sehr gut ist!) nicht nutzen willst... Es ist schwer bis unmöglich das von Dir gewünschte zu erreichen.

Dein OTRS muss - um die Informationen zuordnen zu können - irgendwie eine Referenz haben. In der Regel ist das die Ticketnummer.

Wenn Deine Agenten immer neue Mails aus Outlook schreiben fehlt die Referenz.

Du hast zwei Möglichkeiten aus meiner Sicht:
Nutze weiterhin Outlook, lass OTRS ganz weg und lebe mit den Nachteilen.
Oder nutze OTRS so, wie man es nutzen sollte.

Flo
OTRS 8 SILVER (Prod)
OTRS 8 auf Debian 11 (Test)
Znuny 7.x latest version testing auf Debian 11

-- Ich beantworte keine Forums-Fragen PN - No PN please

I won't answer to unfriendly users any more. A greeting and regards are just polite.
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: Neues Ticket per Mail beantworten und Agent zuteilen

Post by reneeb »

Es gibt die Klasse Kernel::System::User (http://otrs.perl-services.de/docs/otrs/ ... _user.html) und dort die Methode "UserSearch". Dort kannst Du auch nach der Mailadresse suchen...

Code: Select all

   my %List = $UserObject->UserSearch(
       PostMasterSearch => 'email@example.com',
       Valid            => 1, # not required
   );
Du müsstest dafür einen eigenen Postmaster-Filter schreiben: Schaue nach, ob der Absender ein Agent ist und weise das Ticket zu.

Wer wissen will, wie man eigene Postmaster-Filter schreibt, kann am 26. Oktober zum OTRS-Stammtisch Rheinland kommen (viewtopic.php?f=34&t=33514). Ich möchte dort einen entsprechenden Vortrag halten. Oder zur OpenRheinRuhr (http://openrheinruhr.de/) - dort ist der Vortrag allerdings noch nicht angenommen...

Wenn Du Geld für die Entwicklung ausgeben möchtest, darfst Du mich natürlich kontaktieren ;-)
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
Ikkarus13
Znuny newbie
Posts: 35
Joined: 28 Sep 2016, 16:32
Znuny Version: 6.3.3
Real Name: Sascha Kunimünch
Company: Wetrok AG

Re: Neues Ticket per Mail beantworten und Agent zuteilen

Post by Ikkarus13 »

Hallo renebb,

vielen Dank für deinen Tipp und dein Angebot. Bin es im Moment selbst am versuchen, mir den PostmasterFilter zu schreiben. Ich habe allerdings bisher keinerlei Ahnung in Perl. Kannst du vielleicht einen kurzen Blick auf meinen Code werfen, da ich es nicht schaffe das UserSearch einzubauen.

Hier das XML

Code: Select all

<ConfigItem Name="PostMaster::PreFilterModule###7-FindAgent" Required="0" Valid="1">
    <Description Translatable="1">Module to find agents using the mailadress</Description>
    <Group>Ticket</Group>
    <SubGroup>Core::PostMaster</SubGroup>
    <Setting>
        <Hash>
            <Item Key="Module">Kernel::System::PostMaster::Filter::FindAgent</Item>
            <Item Key="Match">
                <Hash>
                    <Item Key="From">@dk-it.ch</Item>
                </Hash>
            </Item>
            <Item Key="Set">
                <Hash>
                    <Item Key="X-OTRS-FollowUp-Owner"></Item>
                </Hash>
            </Item>
        </Hash>
    </Setting>
</ConfigItem>
Und hier der Filter Code

Code: Select all

# --
# Copyright (C) 2001-2016 xxx, http://otrs.com/
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
# did not receive this file, see http://www.gnu.org/licenses/agpl.txt.
# --

package Kernel::System::PostMaster::Filter::FindAgent;

use strict;
use warnings;

our @ObjectDependencies = (
    'Kernel::System::Log',
	'Kernel::System::User',
);

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 ) = @_;
    # get config options
    my %Config = ();
    my %Match = ();
    my %Set = ();
    if ($Param{JobConfig} && ref($Param{JobConfig}) eq 'HASH') {
        %Config = %{$Param{JobConfig}};
        if ($Config{Match}) {
            %Match = %{$Config{Match}};
        }
        if ($Config{Set}) {
            %Set = %{$Config{Set}};
        }
        }
        # match 'Match => ???' stuff
        my $Matched = '';
        my $MatchedNot = 0;
        for (sort keys %Match) {
        if ($Param{GetParam}->{$_} && $Param{GetParam}->{$_} =~ /$Match{$_}/i) {
            $Matched = $1 || '1';
            if ($Self->{Debug} > 1) {
                $Kernel::OM->Get('Kernel::System::Log')->Log(
                    Priority => 'debug',
                    Message => "'$Param{GetParam}->{$_}' =~ /$Match{$_}/i matched!",
                );
            }
        }
        else {
            $MatchedNot = 1;
            if ($Self->{Debug} > 1) {
                $Kernel::OM->Get('Kernel::System::Log')->Log(
                    Priority => 'debug',
                    Message => "'$Param{GetParam}->{$_}' =~ /$Match{$_}/i matched NOT!",
                );
            }
        }
        }
        # should I ignore the incoming mail?
        if ($Matched && !$MatchedNot) {
        my $AgentID = $UserObject->UserSearch(PostMasterSearch => %Match,);
		for (keys %Set) {
            if ($Set{$_} =~ /\[\*\*\*\]/i) {
                $Set{$_} = $AgentID;
            }
            $Param{GetParam}->{$_} = $Set{$_};
            $Kernel::OM->Get('Kernel::System::Log')->Log(
                Priority => 'notice',
                Message => "Set param '$_' to '$Set{$_}' (Message-ID: $Param{GetParam}->{'Message-ID'}) ",
            );
        }
    }

    return 1;
}

1;
Habe dies so aus dem Developer Manual und dann etwas angepasst. Wäre echt super, wenn du mir hier nen Hinweis geben könntest.

Gruss Sascha
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: Neues Ticket per Mail beantworten und Agent zuteilen

Post by reneeb »

In der Konfig würde ich das so machen:

Code: Select all

<ConfigItem Name="PostMaster::PreFilterModule###7-FindAgent" Required="0" Valid="1">
    <Description Translatable="1">Module to find agents using the mailadress</Description>
    <Group>Ticket</Group>
    <SubGroup>Core::PostMaster</SubGroup>
    <Setting>
        <Hash>
            <Item Key="Module">Kernel::System::PostMaster::Filter::FindAgent</Item>
        </Hash>
    </Setting>
</ConfigItem>
Die sub Run würde dann ungefähr so aussehen:

Code: Select all

sub Run {
    my ($Self, %Param) = @_;
    
    my $LogObject   = $Kernel::OM->Get('Kernel::System::Log');
    my $UserObject = $Kernel::OM->Get('Kernel::System::User');

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

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

    return 1 if $Mail{From} !~ m{@dk-it.ch};

    my $ParserObject = Kernel::System::EmailParser->new(
        Mode  => 'Standalone',
        Debug => 0,
    );

    my @EmailAddresses = $ParserObject->SplitAddressLine(
        Line => $Mail->{From},
    );

    my $PlainFrom;
    for my $Address (@EmailAddresses) {
        $PlainFrom = $ParserObject->GetEmailAddress(
            Email => $Address,
        );
    }

    return 1 if !$PlainFrom;

    my %List = $UserObject->UserSearch(
        PostMasterSearch =>$PlainFrom,
        Valid               => 1,
    );

    return 1 if !%List;

    my ($User) = keys %List;
    my %User = $UserObject->GetUserData(
        UserID => $User,
    );

    return 1 if !%User;

    $Param{GetParam}->{'X-OTRS-OwnerID'} = $User;
    $Param{GetParam}->{'X-OTRS-FollowUp-OwnerID'} = $User;

    return 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
Ikkarus13
Znuny newbie
Posts: 35
Joined: 28 Sep 2016, 16:32
Znuny Version: 6.3.3
Real Name: Sascha Kunimünch
Company: Wetrok AG

Re: Neues Ticket per Mail beantworten und Agent zuteilen

Post by Ikkarus13 »

Hallo reneeb,

vielen lieben Dank, das ist ja wesentlich mehr als nur ein Hinweis. Habe den Code nun mal so übernommen, musste allerdings zwei Zeilen Anpassen wegen Fehlermeldungen

Code: Select all

	return 1 if $Mail{From} !~ m{@dk-it.ch};
geändert in

Code: Select all

	return 1 if $Mail{From} !~ m{\@dk-it.ch};
und

Code: Select all

	Line => $Mail->{From},
geändert in

Code: Select all

	Line => $Mail{From},
Damit habe ich jetzt keine Fehler mehr, aber jetzt passiert einfach nichts. Der Owner wird nicht geändert. Wie kann ich im Logfile ein paar Schritte mir anzeigen lassen, damit ich vielleicht darüber auf die Lösung komme?
Habe es mal mit

Code: Select all

			$LogObject->Log(
				Priority => 'info',
				Message => "X-OTRS-OwnerID geändert zu $User",
			);
Gruss und nochmal vielen Dank

Sascha
Ikkarus13
Znuny newbie
Posts: 35
Joined: 28 Sep 2016, 16:32
Znuny Version: 6.3.3
Real Name: Sascha Kunimünch
Company: Wetrok AG

Re: Neues Ticket per Mail beantworten und Agent zuteilen

Post by Ikkarus13 »

O.K., das mit dem Log habe ich gesehen, hat er doch gemacht. Super, dann schaue ich jetzt mal weiter.
Ikkarus13
Znuny newbie
Posts: 35
Joined: 28 Sep 2016, 16:32
Znuny Version: 6.3.3
Real Name: Sascha Kunimünch
Company: Wetrok AG

Re: Neues Ticket per Mail beantworten und Agent zuteilen

Post by Ikkarus13 »

Hallo,

habe nun alles soweit mit reneebs Hilfe geschrieben. Bei einkommenden Mails wird überprüft ob es direkt von unserer IT kommt (also Agent) und wenn ja, werden die Header X-OTRS-OWNER und X-OTRS-OWNERID mit den entsprechenden Werten gefüllt (das gleiche auch für FollowUp).

Allerdings ändert sich dadurch nicht der TicketOwner. Dann habe ich versucht die gesetzten Variablen mit einem PostMaster Filter auszulesen und erneut zu setzen. Auch das funktioniert, aber ohne Änderung des TicketOwner.

Hat noch jemand eine Idee oder Info, wie ich den TicketOwner setzen kann? Die benötigten Werte habe ich ja schon.

Vielen Dank und Gruss Sascha
Ikkarus13
Znuny newbie
Posts: 35
Joined: 28 Sep 2016, 16:32
Znuny Version: 6.3.3
Real Name: Sascha Kunimünch
Company: Wetrok AG

Re: Neues Ticket per Mail beantworten und Agent zuteilen

Post by Ikkarus13 »

Hallo,

habe nun den PostMaster FIlter fertig bekommen. Da es nicht gereicht hat, die X-OTRS-Header zu ändern, musste ich den User direkt auf dem Ticket ändern.

Für alle die das vielleicht auch noch brauchen, hier mein XML

Code: Select all

	<ConfigItem Name="PostMaster::PreFilterModule###000-FindAgent" Required="0" Valid="1">
		<Description Translatable="1">Module to find agents using the mailadress</Description>
		<Group>Ticket</Group>
		<SubGroup>Core::PostMaster</SubGroup>
		<Setting>
			<Hash>
				<Item Key="Module">Kernel::System::PostMaster::Filter::FindAgent</Item>
				<Item Key="Match">
					<Hash>
						<Item Key="From">@domain.de</Item>
					</Hash>
				</Item>				
			</Hash>
		</Setting>
	</ConfigItem>
Und hier der Filter dazu

Code: Select all

# --
# Copyright (C) 2001-2016 xxx, http://otrs.com/
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (AGPL). If you
# did not receive this file, see http://www.gnu.org/licenses/agpl.txt.
# --

package Kernel::System::PostMaster::Filter::FindAgent;

use strict;
use warnings;

our @ObjectDependencies = (
    'Kernel::System::Log',
	'Kernel::System::User',
	'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 $UserObject = $Kernel::OM->Get('Kernel::System::User');
	my $TicketObject = $Kernel::OM->Get('Kernel::System::Ticket');
	
	# check needed stuff
	for my $Needed (qw(JobConfig GetParam)) {
		if ( !$Param{$Needed} ) {
			$LogObject->Log(
				Priority => 'error',
				Message => "Need $Needed!",
			);
			return;
		}
	}
	# Read maildomain from jobconfig
	my %Config = %{$Param{JobConfig}};
	my %Match = %{$Config{Match}};
	
	# Check Mail-From if match with our Domain
	my %Mail = %{ $Param{GetParam} || {} };
	return 1 if $Mail{From} !~ m{$Match{'From'}};

	my $ParserObject = Kernel::System::EmailParser->new(
		Mode => 'Standalone',
		Debug => 0,
	);

	my @EmailAddresses = $ParserObject->SplitAddressLine(
		Line => $Mail{From},
	);
	# Get Mail Subject for reading TicketNumber
	my $MailSubject = $Mail{'Subject'};
	# Read Ticketnumber based on Mail Subject, Attention - only 16 Digits
	my $TicketNr = substr($MailSubject,index($MailSubject,"#")+1,16);
	# Find TicketID based on TicketNumber
	my $TicketID = $TicketObject->TicketCheckNumber(
		Tn => $TicketNr,
	);
	# Find OwnerID based on TicketID
	my ($OwnerID, $Owner) = $TicketObject->OwnerCheck(
		TicketID => $TicketID,
	);
	# Get Clean Mailadress
	my $PlainFrom;
	for my $Address (@EmailAddresses) {
		$PlainFrom = $ParserObject->GetEmailAddress(
			Email => $Address,
		);
	}

	return 1 if !$PlainFrom;
	# Find Agent based on Mailadress
	my %List = $UserObject->UserSearch(
		PostMasterSearch =>$PlainFrom,
		Valid       => 1,
	);

	return 1 if !%List;
	# Read UserID from Agent
	my ($User) = keys %List;
	my %User = $UserObject->GetUserData(
		UserID => $User,
	);

	return 1 if !%User;
	# Change Ticket UserID from UserID (old User) to NewUserID
	my $Success = $TicketObject->TicketOwnerSet(
		TicketID  => $TicketID,
		NewUserID => $User{'UserID'},
		UserID    => $OwnerID,
		);
	# write Log File
	if ($Success == 1) {
		$LogObject->Log(
			Priority => 'info',
			Message => "OwnerID changed succesfully from $OwnerID to $User{'UserID'}",
		);
	}
	elsif ($Success == 2) {
		$LogObject->Log(
			Priority => 'info',
			Message => "OwnerID must not changed because old and new User equal",
		);
	
	}
	elsif ($Success == 0) {
		$LogObject->Log(
			Priority => 'error',
			Message => "OwnerID cna't change from $OwnerID to $User{'UserID'}",
		);
	}

return 1;
}
Ist sicherlich nicht ganz sauber programmiert, da ich das erste Mal etwas mit Perl gemacht habe, aber es geht.

Gruss Sascha
Post Reply