Jump to content

API:Emailuser: Difference between revisions

From mediawiki.org
Content deleted Content added
Tags: Reverted Visual edit
editing
 
(17 intermediate revisions by 6 users not shown)
Line 1: Line 1:
{{languages}}
<languages/>
{{API}}
{{API}}
{{API-head
{{API-head
Line 9: Line 9:
}}
}}


<translate>
== Token ==
== Token == <!--T:1-->

</translate>
To send an email, an email token is required. This token is equal to the edit token and the same for all recipients, but changes at every login. Email tokens can be obtained via {{ll|API:Tokens|action{{=}}query&meta{{=}}tokens}}, or by using the following method:
<translate><!--T:2--> To send an email, an email token is required.</translate>
<translate><!--T:24--> This token is equal to the edit token and the same for all recipients, but changes at every login.</translate>
<translate><!--T:25--> Email tokens can be obtained via <tvar name=1>{{ll|API:Tokens|action{{=}}query&meta{{=}}tokens}}</tvar>, or by using the following method:</translate>


{{ApiEx
{{ApiEx
|desc=Obtaining an email token
|desc=<translate><!--T:3--> Obtaining an email token</translate>
|p1=action=query
|p1=action=query
|p2=meta=tokens
|p2=meta=tokens
Line 28: Line 31:


{{anchor|Sending e-mail to users}}
{{anchor|Sending e-mail to users}}
<translate>
== Sending email to users:n.ramokgwathedi85@gmail.com ==
== Sending email to users == <!--T:4-->
</translate>
<translate><!--T:5--> You can send email to users who have a confirmed email address with <tvar name=1>action=emailuser</tvar>.</translate>
<translate><!--T:27--> Sending email is subject to [[<tvar name=1>Special:MyLanguage/Manual:$wgRateLimits</tvar>|rate limits]].</translate>


<translate>
=== Parameters === <!--T:6-->
</translate>
*{{ApiParam|target|2=<translate><!--T:7--> User to send email to</translate>|required=1}}
*{{ApiParam|subject|2=<translate><!--T:8--> The subject of the message</translate>}}
*{{ApiParam|text|2=<translate><!--T:9--> The message</translate>|required=1}}
*{{ApiParam|token|2=<translate><!--T:10--> The token obtained in the previous request.</translate> <translate><!--T:28--> Take care to encode the <tvar name=1><code>+</code></tvar> as <tvar name=2><code>%2B</code></tvar></translate>|required=1}}
*{{ApiParam|ccme|2=<translate><!--T:11--> If set, a copy of the email will be sent to you</translate>}}


<translate>

=== Examples === <!--T:12-->
You can send email to users who have a confirmed email address with action=emailuser. Sending email is subject to {{ll|Manual:$wgRateLimits|rate limits}}.
</translate>

{{note|1=<translate><!--T:13--> In this example, all parameters are passed in a GET request just for the sake of simplicity. However, <tvar name=1>action=emailuser</tvar> requires POST requests; GET requests will cause an error.</translate>}}
=== Parameters ===
*{{ApiParam|target|User to send email to|required=1}}
*{{ApiParam|subject|The subject of the message}}
*{{ApiParam|text|The message|required=1}}
*{{ApiParam|token|The token obtained in the previous request. Take care to encode the <code>+</code> as <code>%2B</code>|required=1}}
*{{ApiParam|ccme|If set, a copy of the email will be sent to you}}

=== Examples ===

{{note|1=In this example, all parameters are passed in a GET request just for the sake of simplicity. However, action=emailuser requires POST requests; GET requests will cause an error.}}


{{ApiEx
{{ApiEx
|desc=Sending an email to [[User:Catrope]]
|desc=<translate><!--T:14--> Sending an email to <tvar name=1>[[User:Catrope]]</tvar></translate>
|p1=action=emailuser
|p1=action=emailuser
|p2=target=Catrope
|p2=target=Catrope
Line 57: Line 63:
</api></syntaxhighlight>}}
</api></syntaxhighlight>}}


<translate>
=== Sample code ===
=== Sample code === <!--T:15-->
</translate>


<!-- Transclude Sample code -->
<!-- Transclude Sample code -->
<div style="overflow-y:hidden">
{{:{{translatable}}/Sample code 1}}
{{:{{translatable}}/Sample code 1}}
</div>


<translate>
=== Possible errors ===
=== Possible errors === <!--T:16-->


<!--T:17-->
In addition to the {{ll|API:Errors#Standard error messages|usual stuff}}:
In addition to the {{<tvar name=1>ll|API:Errors#Standard error messages</tvar>|usual stuff}}:</translate>


{| class="wikitable sortable"
{| class="wikitable sortable"
! <translate><!--T:18--> Code</translate> !! <translate><!--T:19--> Info</translate>
! Code !! Info
|-
|-
| cantsend || {{int|apierror-cantsend}}
| cantsend || {{int|apierror-cantsend}}
Line 73: Line 85:
| blockedfrommail || {{int|apierror-blockedfrommail}}
| blockedfrommail || {{int|apierror-blockedfrommail}}
|-
|-
| usermaildisabled || User email has been disabled
| usermaildisabled || <translate><!--T:20--> User email has been disabled</translate>
|-
|-
| notarget || {{int|apierror-notarget}}
| notarget || {{int|apierror-notarget}}
|-
|-
| noemail || {{int|noemailtext}}<br />{{int|nowikiemailtext}}
| noemail|| {{int|noemailtext}}
|-
| nowikiemail|| {{int|nowikiemailtext}}
|}
|}


<translate>
== Checking emailable status ==
== Checking emailable status == <!--T:21-->
Before trying to send an email, it is recommended to check if the user is emailable first. To do this, you can execute a list query on the user (or several users at once). Here is an example using Ajax:
</translate>
<translate><!--T:22--> Before trying to send an email, it is recommended to check if the user is emailable first.</translate>
<translate><!--T:26--> To do this, you can execute a list query on the user (or several users at once). Here is an example using Ajax:</translate>

<syntaxhighlight lang="JavaScript">
<syntaxhighlight lang="JavaScript">
new mw.Api().get( {
new mw.Api().get( {
Line 94: Line 112:
</syntaxhighlight>
</syntaxhighlight>


If you are testing from a client-side script, it is also possible to simply check for the existence of the t-emailuser list item:
<translate><!--T:23--> If you are testing from a client-side script, it is also possible to simply check for the existence of the t-emailuser list item:</translate>

<syntaxhighlight lang="JavaScript">
<syntaxhighlight lang="JavaScript">
emailable = $( '#t-emailuser' ).length ? true : false;
emailable = $( '#t-emailuser' ).length ? true : false;

Latest revision as of 14:45, 26 April 2024


Token

[edit]

To send an email, an email token is required. This token is equal to the edit token and the same for all recipients, but changes at every login. Email tokens can be obtained via action=query&meta=tokens , or by using the following method:

Obtaining an email token
Result
{
    "batchcomplete": "",
    "query": {
        "tokens": {
            "csrftoken": "7773cbfff263682c97ffc74b8672cbf25a5e0045+\\"
        }
    }
}

Sending email to users

[edit]

You can send email to users who have a confirmed email address with action=emailuser. Sending email is subject to rate limits.

Parameters

[edit]
  • target: User to send email to
  • subject: The subject of the message
  • text: The message
  • token: The token obtained in the previous request. Take care to encode the + as %2B
  • ccme: If set, a copy of the email will be sent to you

Examples

[edit]
In this example, all parameters are passed in a GET request just for the sake of simplicity. However, action=emailuser requires POST requests; GET requests will cause an error.
Sending an email to User:Catrope
Result
<?xml version="1.0" encoding="utf-8"?>
<api>
  <emailuser result="Success" />
</api>

Sample code

[edit]

Python

[edit]
#!/usr/bin/python3

"""
    send_email.py

    MediaWiki API Demos
    Demo of `Emailuser` module: sending POST request to send email to wiki user

    Author: Jayprakash12345
    MIT license
"""

import requests

S = requests.Session()

URL = "https://test.wikipedia.org/w/api.php"

# Step 1: GET request to fetch login token
PARAMS_0 = {
    "action": "query",
    "meta": "tokens",
    "type": "login",
    "format": "json"
}

R = S.get(url=URL, params=PARAMS_0)
DATA = R.json()

LOGIN_TOKEN = DATA['query']['tokens']['logintoken']

# Step 2: POST request to log in. Use of main account for login is not
# supported. Obtain credentials via Special:BotPasswords
# (https://www.mediawiki.org/wiki/Special:BotPasswords) for lgname & lgpassword
PARAMS_1 = {
    "action": "login",
    "lgname": "your_bot_username",
    "lgpassword": "your_bot_password",
    "lgtoken": LOGIN_TOKEN,
    "format": "json"
}

R = S.post(URL, data=PARAMS_1)

# Step 3: GET request to fetch Email token
PARAMS_2 = {
    "action": "query",
    "meta": "tokens",
    "format": "json"
}

R = S.get(url=URL, params=PARAMS_2)
DATA = R.json()

EMAIL_TOKEN = DATA['query']['tokens']['csrftoken']

# Step 4: POST request to send an email
PARAMS_3 = {
    "action": "emailuser",
    "target": "Test",
    "subject": "Hi",
    "text": "Just wanted to say hi",
    "token": EMAIL_TOKEN,
    "format": "json"
}

R = S.post(URL, data=PARAMS_3)
DATA = R.text

print(DATA)

PHP

[edit]
<?php

/*
    send_email.php

    MediaWiki API Demos
	Demo of `Emailuser` module: sending POST request to send email to wiki user

    MIT license
*/

$endPoint = "https://en.wikipedia.org/w/api.php";

$login_Token = getLoginToken(); // Step 1
loginRequest( $login_Token ); // Step 2
$csrf_Token = getCSRFToken(); // Step 3
sendemail( $csrf_Token ); // Step 4

// Step 1: GET request to fetch login token
function getLoginToken() {
	global $endPoint;

	$params1 = [
		"action" => "query",
		"meta" => "tokens",
		"type" => "login",
		"format" => "json"
	];

	$url = $endPoint . "?" . http_build_query( $params1 );

	$ch = curl_init( $url );
	curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
	curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
	curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );

	$output = curl_exec( $ch );
	curl_close( $ch );

	$result = json_decode( $output, true );
	return $result["query"]["tokens"]["logintoken"];
}

// Step 2: POST request to log in. Use of main account for login is not
// supported. Obtain credentials via Special:BotPasswords
// (https://www.mediawiki.org/wiki/Special:BotPasswords) for lgname & lgpassword
function loginRequest( $logintoken ) {
	global $endPoint;

	$params2 = [
		"action" => "login",
		"lgname" => "your_bot_username",
		"lgpassword" => "your_bot_password",
		"lgtoken" => $logintoken,
		"format" => "json"
	];

	$ch = curl_init();

	curl_setopt( $ch, CURLOPT_URL, $endPoint );
	curl_setopt( $ch, CURLOPT_POST, true );
	curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $params2 ) );
	curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
	curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
	curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );

	$output = curl_exec( $ch );
	curl_close( $ch );

}

// Step 3: GET request to fetch CSRF token
function getCSRFToken() {
	global $endPoint;

	$params3 = [
		"action" => "query",
		"meta" => "tokens",
		"format" => "json"
	];

	$url = $endPoint . "?" . http_build_query( $params3 );

	$ch = curl_init( $url );

	curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
	curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
	curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );

	$output = curl_exec( $ch );
	curl_close( $ch );

	$result = json_decode( $output, true );
	return $result["query"]["tokens"]["csrftoken"];
}

// Step 4: POST request to send an email
function sendemail( $csrftoken ) {
	global $endPoint;

	$params4 = [
		"action" => "emailuser",
		"target" => "ABCD",
		"subject" => "API test",
		"text" => "Good to see you",
		"token" => $csrftoken,
		"format" => "json"
	];

	$ch = curl_init();

	curl_setopt( $ch, CURLOPT_URL, $endPoint );
	curl_setopt( $ch, CURLOPT_POST, true );
	curl_setopt( $ch, CURLOPT_POSTFIELDS, http_build_query( $params4 ) );
	curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
	curl_setopt( $ch, CURLOPT_COOKIEJAR, "cookie.txt" );
	curl_setopt( $ch, CURLOPT_COOKIEFILE, "cookie.txt" );

	$output = curl_exec( $ch );
	curl_close( $ch );

	echo ( $output );
}

JavaScript

[edit]
/*  
    send_email.js
 
    MediaWiki API Demos
    Demo of `Emailuser` module: sending POST request to send email to wiki user

    MIT license
*/

var request = require('request').defaults({jar: true}),
    url = "https://en.wikipedia.org/w/api.php";

// Step 1: GET request to fetch login token
function getLoginToken() {
    var params_0 = {
        action: "query",
        meta: "tokens",
        type: "login",
        format: "json"
    };

    request.get({ url: url, qs: params_0 }, function (error, res, body) {
        if (error) {
            return;
        }
        var data = JSON.parse(body);
        loginRequest(data.query.tokens.logintoken);
    });
}

// Step 2: POST request to log in. 
// Use of main account for login is not
// supported. Obtain credentials via Special:BotPasswords
// (https://www.mediawiki.org/wiki/Special:BotPasswords) for lgname & lgpassword
function loginRequest(login_token) {
    var params_1 = {
        action: "login",
        lgname: "bot_username",
        lgpassword: "bot_password",
        lgtoken: login_token,
        format: "json"
    };

    request.post({ url: url, form: params_1 }, function (error, res, body) {
        if (error) {
            return;
        }
        getCsrfToken();
    });
}

// Step 3: GET request to fetch CSRF token
function getCsrfToken() {
    var params_2 = {
        action: "query",
        meta: "tokens",
        format: "json"
    };

    request.get({ url: url, qs: params_2 }, function(error, res, body) {
        if (error) {
            return;
        }
        var data = JSON.parse(body);
        send_email(data.query.tokens.csrftoken);
    });
}

// Step 4: POST request to send an email
function send_email(csrf_token) {
    var params_3 = {
        action: "emailuser",
        target: "ABCD",
        subject: "API Test",
        text: "Hello",
        token: csrf_token,
        format: "json"
    };

    request.post({ url: url, form: params_3 }, function (error, res, body) {
        if (error) {
            return;
        }
        console.log(body);
    });
}

// Start From Step 1
getLoginToken();

MediaWiki JS

[edit]
/*
	send_email.js

	MediaWiki API Demos
	Demo of `Emailuser` module: sending POST request to send email to wiki user

	MIT License
*/

var params = {
		action: 'emailuser',
		target: 'ABC',
		subject: 'Hi',
		text: 'Just wanted to say hi',
		format: 'json'
	},
	api = new mw.Api();

api.postWithToken( 'csrf', params ).done( function ( data ) {
	console.log( data );
} );

Possible errors

[edit]

In addition to the usual stuff :

Code Info
cantsend You are not logged in, you do not have a confirmed email address, or you are not allowed to send email to other users, so you cannot send email.
blockedfrommail You have been blocked from sending email.
usermaildisabled User email has been disabled
notarget ⧼apierror-notarget⧽
noemail This user has not specified a valid email address.
nowikiemail This user has chosen not to receive email from other users.

Checking emailable status

[edit]

Before trying to send an email, it is recommended to check if the user is emailable first. To do this, you can execute a list query on the user (or several users at once). Here is an example using Ajax:

new mw.Api().get( {
  action: 'query',
  list: 'users',
  ususers: mw.config.get( 'wgTitle' ),
  usprop: 'emailable',
  rawcontinue: ''
} ).done( function( getEmailable ) {
  alert( ( getEmailable.query.users[ 0 ][ 'emailable' ] !== undefined ) ? 'emailable' : 'not emailable' );
} );

If you are testing from a client-side script, it is also possible to simply check for the existence of the t-emailuser list item:

emailable = $( '#t-emailuser' ).length ? true : false;


action=emailuser

(main | emailuser)
  • This module requires read rights.
  • This module requires write rights.
  • This module only accepts POST requests.
  • Source: MediaWiki
  • License: GPL-2.0-or-later

Email a user.

Specific parameters:
Other general parameters are available.
target

User to send the email to.

This parameter is required.
subject

Subject header.

This parameter is required.
text

Email body.

This parameter is required.
ccme

Send a copy of this mail to me.

Type: boolean (details)
token

A "csrf" token retrieved from action=query&meta=tokens

This parameter is required.
Example:
Send an email to the user WikiSysop with the text Content.
api.php?action=emailuser&target=WikiSysop&text=Content&token=123ABC [open in sandbox]