Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package mpg123 for openSUSE:Factory checked 
in at 2022-07-14 16:33:16
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/mpg123 (Old)
 and      /work/SRC/openSUSE:Factory/.mpg123.new.1523 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "mpg123"

Thu Jul 14 16:33:16 2022 rev:29 rq:988902 version:1.30.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/mpg123/mpg123.changes    2022-06-27 
11:25:27.730581823 +0200
+++ /work/SRC/openSUSE:Factory/.mpg123.new.1523/mpg123.changes  2022-07-14 
16:33:20.096575146 +0200
@@ -1,0 +2,15 @@
+Wed Jul 13 06:33:54 UTC 2022 - Luigi Baldoni <aloi...@gmx.com>
+
+- Update to version 1.30.1
+  mpg123:
+  * Show stderr of network helpers in -vvv mode.
+  * Use curl --http0.9, if available, to support shoutcast v1
+    streams without wget (wget not needing such switch, yet).
+  * Support file:// URLs for local access as was intended with
+    the last release.
+  * Give more helpful error message if neither wget nor curl are
+    usable, also allow error messages from curl to appear when
+    not --quiet.
+  * Update the man page.
+
+-------------------------------------------------------------------

Old:
----
  mpg123-1.30.0.tar.bz2
  mpg123-1.30.0.tar.bz2.sig

New:
----
  mpg123-1.30.1.tar.bz2
  mpg123-1.30.1.tar.bz2.sig

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ mpg123.spec ++++++
--- /var/tmp/diff_new_pack.Y1iL5W/_old  2022-07-14 16:33:20.552575573 +0200
+++ /var/tmp/diff_new_pack.Y1iL5W/_new  2022-07-14 16:33:20.556575577 +0200
@@ -18,7 +18,7 @@
 
 %define sover   0
 Name:           mpg123
-Version:        1.30.0
+Version:        1.30.1
 Release:        0
 Summary:        Console MPEG audio player and decoder library
 License:        LGPL-2.1-only

++++++ mpg123-1.30.0.tar.bz2 -> mpg123-1.30.1.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpg123-1.30.0/INSTALL new/mpg123-1.30.1/INSTALL
--- old/mpg123-1.30.0/INSTALL   2022-06-26 15:47:12.000000000 +0200
+++ new/mpg123-1.30.1/INSTALL   2022-07-11 11:00:56.000000000 +0200
@@ -18,8 +18,9 @@
 
 - For other exotic platforms, also see ports/
 
-- If building from direct SCM checkout, you need GNU autotools installed
-  (see developer build below).
+- If building from direct source code repository checkout, as opposed to
+  a release or snapshot tarball, you need GNU autotools installed
+  (see Developer Build below).
 
 You want:
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpg123-1.30.0/NEWS new/mpg123-1.30.1/NEWS
--- old/mpg123-1.30.0/NEWS      2022-06-26 15:47:11.000000000 +0200
+++ new/mpg123-1.30.1/NEWS      2022-07-11 11:00:55.000000000 +0200
@@ -1,3 +1,15 @@
+1.30.1
+------
+- mpg123:
+-- Show stderr of network helpers in -vvv mode.
+-- Use curl --http0.9, if available, to support shoutcast v1 streams
+   without wget (wget not needing such switch, yet).
+-- Support file:// URLs for local access as was intended with the last
+   release.
+-- Give more helpful error message if neither wget nor curl are usable, also
+   allow error messages from curl to appear when not --quiet.
+-- Update the man page.
+
 1.30.0
 ------
 - build:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpg123-1.30.0/configure new/mpg123-1.30.1/configure
--- old/mpg123-1.30.0/configure 2022-06-26 15:51:37.000000000 +0200
+++ new/mpg123-1.30.1/configure 2022-07-11 11:01:21.000000000 +0200
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for mpg123 1.30.0.
+# Generated by GNU Autoconf 2.69 for mpg123 1.30.1.
 #
 # Report bugs to <maintai...@mpg123.org>.
 #
@@ -590,8 +590,8 @@
 # Identity of this package.
 PACKAGE_NAME='mpg123'
 PACKAGE_TARNAME='mpg123'
-PACKAGE_VERSION='1.30.0'
-PACKAGE_STRING='mpg123 1.30.0'
+PACKAGE_VERSION='1.30.1'
+PACKAGE_STRING='mpg123 1.30.1'
 PACKAGE_BUGREPORT='maintai...@mpg123.org'
 PACKAGE_URL=''
 
@@ -1683,7 +1683,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures mpg123 1.30.0 to adapt to many kinds of systems.
+\`configure' configures mpg123 1.30.1 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1754,7 +1754,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of mpg123 1.30.0:";;
+     short | recursive ) echo "Configuration of mpg123 1.30.1:";;
    esac
   cat <<\_ACEOF
 
@@ -1988,7 +1988,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-mpg123 configure 1.30.0
+mpg123 configure 1.30.1
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2594,7 +2594,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by mpg123 $as_me 1.30.0, which was
+It was created by mpg123 $as_me 1.30.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3553,7 +3553,7 @@
 
 # Define the identity of the package.
  PACKAGE='mpg123'
- VERSION='1.30.0'
+ VERSION='1.30.1'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -19559,7 +19559,7 @@
   if test "x$have_fork" = "xyes"; then
     network_type=exec
   elif test "x$win32_specific_codes" = "xenabled"; then
-    network_type=winhttp
+    network_type=wininet
   elif test "x$have_network" = "xyes"; then
     network_type="internal"
   else
@@ -20656,7 +20656,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by mpg123 $as_me 1.30.0, which was
+This file was extended by mpg123 $as_me 1.30.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -20722,7 +20722,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; 
s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-mpg123 config.status 1.30.0
+mpg123 config.status 1.30.1
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpg123-1.30.0/configure.ac 
new/mpg123-1.30.1/configure.ac
--- old/mpg123-1.30.0/configure.ac      2022-06-26 15:47:11.000000000 +0200
+++ new/mpg123-1.30.1/configure.ac      2022-07-11 11:00:56.000000000 +0200
@@ -9,7 +9,7 @@
 AC_PREREQ([2.69])
 
 dnl ############# Initialisation
-AC_INIT([mpg123], [1.30.0], [maintai...@mpg123.org])
+AC_INIT([mpg123], [1.30.1], [maintai...@mpg123.org])
 dnl Increment API_VERSION when the API gets changes (new functions).
 
 dnl libmpg123
@@ -2619,7 +2619,7 @@
   if test "x$have_fork" = "xyes"; then
     network_type=exec
   elif test "x$win32_specific_codes" = "xenabled"; then
-    network_type=winhttp
+    network_type=wininet
   elif test "x$have_network" = "xyes"; then
     network_type="internal"
   else
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpg123-1.30.0/man1/mpg123.1 
new/mpg123-1.30.1/man1/mpg123.1
--- old/mpg123-1.30.0/man1/mpg123.1     2022-06-26 15:47:12.000000000 +0200
+++ new/mpg123-1.30.1/man1/mpg123.1     2022-07-11 11:00:55.000000000 +0200
@@ -1,4 +1,4 @@
-.TH mpg123 1 "26 Apr 2020"
+.TH mpg123 1 "11 Jul 2022"
 .SH NAME
 mpg123 \- play audio MPEG 1.0/2.0/2.5 stream (layers 1, 2 and 3)
 .SH SYNOPSIS
@@ -25,9 +25,10 @@
 valid MPEG-1.0/2.0/2.5 audio layer 1, 2 or 3 bit streams.
 If a dash ``\-'' is specified, MPEG data will
 be read from the standard input.  Furthermore, any name
-starting with ``http://'' is recognized as
+starting with ``http://'' or ``https://'' is recognized as
 .I URL
-(see next section).
+(see next section), while a leading ``file://'' is being stripped for
+normal local file access, for consistency (since mpg123 1.30.1).
 .SH OPTIONS
 .B mpg123
 options may be either the traditional POSIX one letter options,
@@ -72,27 +73,20 @@
 of MPEG frames that belong together, but gets rid of the flexibility that can 
be fun at times but
 mostly is hell for the programmer of the parser and decoder ...
 .TP
+\fB\-\^\-network \fI backend
+Select network  backend (helper program), choices are usually auto, wget, and 
curl.
+Auto means to try the first available backend.
+.TP
 \fB\-\^-resync\-limit \fIbytes\fR
 Set number of bytes to search for valid MPEG data once lost in stream; <0 
means search whole stream.
 If you know there are huge chunks of invalid data in your files... here is 
your hammer.
 Note: Only since version 1.14 this also increases the amount of junk skipped 
on beginning.
 .TP
-\fB\-p \fIURL \fR| \fBnone\fR, \fB\-\^\-proxy \fIURL \fR| \fBnone
-The specified
-.I proxy
-will be used for HTTP requests.  It
-should be specified as full URL (``http://host.domain:port/''),
-but the ``http://'' prefix, the port number and the trailing
-slash are optional (the default port is 80).  Specifying
-.B none
-means not to use any proxy, and to retrieve files directly
-from the respective servers.  See also the
-``HTTP SUPPORT'' section.
-.TP
 \fB\-u \fIauth\fR, \fB\-\^\-auth \fIauth
 HTTP authentication to use when receiving files via HTTP.
 The format used is user:password. Mpg123 will clear this quickly, but it may 
still appear
-in sight of other users or even just in your shell history.
+in sight of other users or even just in your shell history. You may seek 
alternative ways
+to specify that to your network backend.
 .TP
 \fB\-\^\-auth-file \fIauthfile
 Provide the authentication info via given file instead of command line 
directly.
@@ -469,28 +463,25 @@
 In addition to reading MPEG audio streams from ordinary
 files and from the standard input,
 .B mpg123
-supports retrieval of MPEG audio files or playlists via the HTTP protocol, 
+supports retrieval of MPEG audio streams or playlists via the HTTP  protocol,
 which is used in the World Wide Web (WWW).  Such files are
-specified using a so-called URL, which starts with ``http://''.  When a file 
with
-that prefix is encountered,
+specified using a so-called URL, which starts with http:// or https://.
+When a file with that prefix is encountered,
 .B mpg123
-attempts to open an HTTP connection to the server in order to
-retrieve that file to decode and play it.
-.P
-It is often useful to retrieve files through a WWW cache or
-so-called proxy.  To accomplish this,
+since 1.30.0 will by default call an external helper program (either
+.BR wget (1)
+or
+.BR curl (1),
+see the
+.B \-\^\-network
+option)
+to retrieve the resource. You can configure access via a proxy
+server using the standard environment variables those programs support. The
+.BR \-\^\-proxy
+option that
 .B mpg123
-examines the environment for variables named
-.BR MP3_HTTP_PROXY ", " http_proxy " and " HTTP_PROXY ,
-in this order.  The value of the first one that is set will
-be used as proxy specification.  To override this, you can
-use the
-.B \-p
-command line option (see the ``OPTIONS'' section).  Specifying
-.B "\-p none"
-will enforce contacting the server directly without using
-any proxy, even if one of the above environment variables
-is set.
+before 1.30.0 used for its internal network code is gone
+in the default build now and will probably disappear for good with 1.31.1.
 .P
 Note that, in order to play MPEG audio files from a WWW
 server, it is necessary that the connection to that server
@@ -506,9 +497,8 @@
 .BR wget (1))
 and then play them from there.
 .P
-If authentication is needed to access the file it can be
-specified with the 
-.BR "\-u user:pass".
+Streams with embedded ICY metadata are supported, the interval being 
communicated via HTTP
+headers or \fB\-\^\-icy-interval\fR.
 .SH INTERRUPT
 When in terminal control mode, you can quit via pressing the q key, 
 while any time you can abort
@@ -622,7 +612,9 @@
 Mostly MPEG-1 layer 2 and 3 are tested in real life.
 Please report any issues and provide test files to help fixing them.
 .P
-No CRC error checking is performed.
+No CRC error checking is performed. But the decoder is built and tested
+to behave nicely with damaged streams. Mostly, damaged frames will just be
+silent.
 .P
 Some platforms lack audio hardware support; you may be able to use the
 .B -s
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpg123-1.30.0/mpg123.spec 
new/mpg123-1.30.1/mpg123.spec
--- old/mpg123-1.30.0/mpg123.spec       2022-06-26 15:51:45.000000000 +0200
+++ new/mpg123-1.30.1/mpg123.spec       2022-07-11 11:04:36.000000000 +0200
@@ -3,7 +3,7 @@
 # - devel packages for alsa, sdl, etc... to build the respective output 
modules.
 Summary:       The fast console mpeg audio decoder/player.
 Name:          mpg123
-Version:       1.30.0
+Version:       1.30.1
 Release:       1
 URL:           http://www.mpg123.org/
 License:       GPL
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpg123-1.30.0/src/net123_exec.c 
new/mpg123-1.30.1/src/net123_exec.c
--- old/mpg123-1.30.0/src/net123_exec.c 2022-06-26 15:47:12.000000000 +0200
+++ new/mpg123-1.30.1/src/net123_exec.c 2022-07-11 11:00:55.000000000 +0200
@@ -65,12 +65,28 @@
 static int got_curl = -1;
 static int got_wget = -1;
 
-static int check_program(char **argv)
+// Check if program executes, also test if given token occurs in its output.
+// Returns 0 if not, 1 if exec works, 2 if also token found.
+// Token has to be < 1024 characters in length.
+static int check_program(char * const *argv, const char *token)
 {
+       int fd[2];
+       int gottoken = 0;
+       if(token)
+       {
+               if(pipe(fd))
+                       return 0;
+               compat_binmode(fd[0], TRUE);
+               compat_binmode(fd[1], TRUE);
+       }
        pid_t pid = fork();
        if(pid == 0)
        {
-               int outfd = open("/dev/null", O_WRONLY);
+               int outfd = fd[1];
+               if(token)
+                       close(fd[0]);
+               else
+                       outfd = open("/dev/null", O_WRONLY);
                dup2(outfd, STDOUT_FILENO);
                int infd  = open("/dev/null", O_RDONLY);
                dup2(infd,  STDIN_FILENO);
@@ -81,10 +97,41 @@
        }
        else if(pid > 0)
        {
+               if(token)
+               {
+                       char buf[1024];
+                       close(fd[1]);
+                       size_t toklen = strlen(token);
+                       if(toklen > 0 && toklen < sizeof(buf))
+                       {
+                               size_t bufoff = 0;
+                               size_t got;
+                               while( (got = unintr_read(fd[0], buf+bufoff, 
sizeof(buf)-1-bufoff)) )
+                               {
+                                       bufoff += got;
+                                       buf[bufoff] = 0; // Now it's a 
terminated string.
+                                       if(!gottoken && strstr(buf, token))
+                                               gottoken = 1;
+                                       if(gottoken)
+                                               bufoff = 0; // just forget 
everything
+                                       else if(bufoff > toklen)
+                                       {
+                                               // Remember the last toklen-1 
bytes to compare later.
+                                               memmove(buf, 
buf+bufoff-toklen+1, toklen-1);
+                                               bufoff = toklen-1;
+                                       }
+                               }
+                       }
+                       close(fd[0]);
+               }
                int stat;
                if( (waitpid(pid, &stat, 0) == pid)
                        && WIFEXITED(stat) && WEXITSTATUS(stat)==0 )
-                       return 1;
+                       return 1+gottoken;
+       } else if(token)
+       {
+               close(fd[0]);
+               close(fd[1]);
        }
        return 0; // false, not there
 }
@@ -147,6 +194,9 @@
                "curl" // begins with program name
 #ifdef DEBUG
        ,       "--verbose"
+#else
+       ,       "--silent"
+       ,       "--show-error"
 #endif
        ,       "--dump-header"
        ,       "-"
@@ -156,6 +206,8 @@
        // Get the count of argument strings right!
        // Fixed args + agent + client headers [+ auth] + URL + NULL
        int argc = sizeof(base_args)/sizeof(char*)+2+2*cheads+1+1;
+       if(got_curl > 1)
+               argc++; // add --http0.9
        char *httpauth = NULL;
        if(param.httpauth && (httpauth = compat_strdup(param.httpauth)))
                argc += 2;
@@ -168,6 +220,8 @@
        int an = 0;
        for(;an<sizeof(base_args)/sizeof(char*); ++an)
                argv[an] = compat_strdup(base_args[an]);
+       if(got_curl > 1)
+               argv[an++] = compat_strdup("--http0.9");
        argv[an++] = compat_strdup("--user-agent");
        argv[an++] = compat_strdup(PACKAGE_NAME "/" PACKAGE_VERSION);
        for(size_t ch=0; ch < cheads; ++ch)
@@ -188,29 +242,38 @@
 net123_handle *net123_open(const char *url, const char * const * client_head)
 {
        int use_curl = 0;
+       char * const curl_check_argv[] = { "curl", "--help", "all", NULL };
+       char * const wget_check_argv[] = { "wget", "--version", NULL };
        // Semi-threadsafe: The check might take place multiple times, but 
writing the integer
        // should be safe enough.
        if(!strcmp("auto",param.network_backend))
        {
-               char *curl_argv[] = { "curl", "--version", NULL };
-               char *wget_argv[] = { "wget", "--version", NULL };
-               if(got_curl < 0)
-                       got_curl = check_program(curl_argv);
                if(got_wget < 0)
-                       got_wget = check_program(wget_argv);
-               if(got_wget < 1 && got_curl == 1)
+                       got_wget = check_program(wget_check_argv, NULL);
+               if(!got_wget && got_curl < 0)
+                       got_curl = check_program(curl_check_argv, "--http0.9");
+               if(got_wget < 1 && got_curl)
                        use_curl = 1;
        } else if(!strcmp("curl", param.network_backend))
        {
+               if(got_curl < 0) // Still need to know if HTTP/0.9 option is 
there.
+                       got_curl = check_program(curl_check_argv, "--http0.9");
                use_curl = 1;
        } else if(!strcmp("wget", param.network_backend))
        {
+               if(got_wget < 0)
+                       got_wget = check_program(wget_check_argv, NULL);
                use_curl = 0;
        } else
        {
                merror("invalid network backend specified: %s", 
param.network_backend);
                return NULL;
        }
+       if((!use_curl && !got_wget) || (use_curl && !got_curl))
+       {
+               error("missing working network helper program (wget or curl)");
+               return NULL;
+       }
 
        int fd[2];
        int hi = -1; // index of header value that might get a continuation line
@@ -252,20 +315,23 @@
                if(!argv)
                        exit(1);
                errno = 0;
-               if(param.verbose > 2)
+               if(!param.quiet)
                {
-                       char **a = argv;
-                       fprintf(stderr, "HTTP helper command:\n");
-                       while(*a)
+                       if(param.verbose > 2)
                        {
-                               fprintf(stderr, " %s\n", *a);
-                               ++a;
+                               char **a = argv;
+                               fprintf(stderr, "HTTP helper command:\n");
+                               while(*a)
+                               {
+                                       fprintf(stderr, " %s\n", *a);
+                                       ++a;
+                               }
                        }
+               } else
+               {
+                       int errfd = open("/dev/null", O_WRONLY);
+                       dup2(errfd, STDERR_FILENO);
                }
-#ifndef DEBUG
-               int errfd = open("/dev/null", O_WRONLY);
-               dup2(errfd, STDERR_FILENO);
-#endif
                execvp(argv[0], argv);
                merror("cannot execute %s: %s", argv[0], strerror(errno));
                exit(1);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mpg123-1.30.0/src/streamdump.c 
new/mpg123-1.30.1/src/streamdump.c
--- old/mpg123-1.30.0/src/streamdump.c  2022-06-26 15:47:12.000000000 +0200
+++ new/mpg123-1.30.1/src/streamdump.c  2022-07-11 11:00:55.000000000 +0200
@@ -159,9 +159,11 @@
        int hn = sizeof(head)/sizeof(char*);
        int hi = -1;
        int got_ok = 0;
+       int got_line = 0;
        debug("parsing headers");
        while(stream_getline(sd, &line) > 0)
        {
+               got_line = 1;
                mdebug("HTTP in: %s", line.p);
                if(line.p[0] == 0)
                {
@@ -239,7 +241,11 @@
                if(param.verbose > 1)
                        fprintf(stderr, "Info: ICY interval %li\n", 
(long)sd->htd.icy_interval);
        }
-       if(!got_ok)
+       if(!got_line)
+       {
+               error("no data at all from network resource");
+               ret = -1;
+       } else if(!got_ok)
        {
                error("missing positive server response");
                ret = -1;
@@ -273,8 +279,6 @@
                sd->fd = STDIN_FILENO;
                compat_binmode(STDIN_FILENO, TRUE);
        }
-       else if(!strncasecmp("file://", url, 7))
-               url+= 7; // use local file access for files, the scheme may be 
useful
 #ifdef NET123
        else if(!strncasecmp("http://";, url, 7) || !strncasecmp("https://";, 
url, 8))
        {
@@ -287,7 +291,7 @@
                append_accept(&accept);
                client_head[1] = accept.p;
                sd->nh = net123_open(url, client_head);
-               if(stream_parse_headers(sd))
+               if(!sd->nh || stream_parse_headers(sd))
                {
                        stream_close(sd);
                        return NULL;
@@ -311,11 +315,13 @@
        else
        {
                // plain file access
+               if(!strncasecmp("file://", url, 7))
+                       url+= 7; // Might be useful to prepend file scheme 
prefix for local stuff.
                errno = 0;
                sd->fd = compat_open(url, O_RDONLY|O_BINARY);
                if(sd->fd < 0)
                {
-                       merror("failed to open file: %s", strerror(errno));
+                       merror("failed to open file: %s: %s", url, 
strerror(errno));
                        stream_close(sd);
                        return NULL;
                }

Reply via email to