Skip to main content

Django BulkSMS BD

A comprehensive Django package for integrating with the BulkSMSBD.net API to send SMS messages easily and reliably.

Features

  • Easy Integration: Simple setup with Django settings
  • Multiple SMS Types: Support for single SMS, bulk SMS, and OTP messages
  • Robust Error Handling: Comprehensive exception handling with meaningful error messages
  • Retry Mechanism: Built-in retry logic with exponential backoff
  • Request Logging: Optional logging of all API requests and responses
  • Phone Number Validation: Automatic validation and formatting of Bangladesh phone numbers
  • Cost Estimation: Estimate SMS costs before sending
  • Database Tracking: Optional database models to track SMS history
  • Management Commands: Django management commands for testing
  • Comprehensive Testing: Full test suite with mocking support

Installation

1. Install the Package

pip install django-bulksms-bd

2. Add to Django Settings

Add the app to your INSTALLED_APPS in settings.py:

INSTALLED_APPS = [
    # ... your other apps
    'bulksms',
]

3. Configure API Credentials

Add your BulkSMS BD credentials to your Django settings:

# Method 1: Individual settings
BULKSMS_API_KEY = 'your_api_key_here'
BULKSMS_SENDER_ID = 'your_sender_id'

# Method 2: Dictionary configuration
BULKSMS = {
    'API_KEY': 'your_api_key_here',
    'SENDER_ID': 'your_sender_id',
    'TIMEOUT': 30,
    'MAX_RETRIES': 3,
    'VERIFY_SSL': False,
}

4. Run Migrations (Optional)

If you want to use the database tracking features:

python manage.py migrate

Quick Start

Basic SMS Sending

from bulksms.client import BulkSMSClient

# Initialize client (uses settings from Django configuration)
client = BulkSMSClient()

# Send a single SMS
response = client.send_sms(
    phone_numbers='01712345678',
    message='Hello from Django BulkSMS BD!'
)

print(f"SMS sent successfully: {response}")

Bulk SMS Sending

# Send to multiple recipients with the same message
response = client.send_sms(
    phone_numbers=['01712345678', '01812345678', '01912345678'],
    message='Hello everyone!'
)

# Send different messages to different recipients
messages = [
    {'to': '01712345678', 'message': 'Hello John!'},
    {'to': '01812345678', 'message': 'Hello Jane!'},
    {'to': '01912345678', 'message': 'Hello Bob!'},
]

response = client.send_bulk_sms(messages)

OTP Messages

# Send OTP with proper formatting
response = client.send_otp(
    phone_number='01712345678',
    otp_code='123456',
    brand_name='Your Company'
)
# This sends: "Your Your Company OTP is 123456"

Check Account Balance

balance_info = client.get_balance()
print(f"Account balance: {balance_info}")

Configuration Options

Setting Description Default
BULKSMS_API_KEY Your BulkSMS BD API key Required
BULKSMS_SENDER_ID Your approved sender ID Required
BULKSMS_BASE_URL BulkSMS Base URL https://bulksmsbd.net/api
BULKSMS_TIMEOUT Request timeout in seconds 30
BULKSMS_MAX_RETRIES Maximum retry attempts 3
BULKSMS_BACKOFF_FACTOR Retry backoff factor 0.5
BULKSMS_VERIFY_SSL Verify SSL certificates False
BULKSMS_BASE_COST_PER_SMS Cost per SMS for estimation 0.50
BULKSMS_LOG_REQUESTS Log API requests True
BULKSMS_SAVE_TO_DATABASE Save SMS to database True

Error Handling

The package provides comprehensive error handling with specific exception types:

from bulksms.exceptions import (
    BulkSMSAPIError,
    BulkSMSValidationError,
    BulkSMSNetworkError,
    BulkSMSConfigurationError,
)

try:
    response = client.send_sms('01712345678', 'Test message')
except BulkSMSValidationError as e:
    print(f"Validation error: {e}")
except BulkSMSAPIError as e:
    print(f"API error: {e} (Code: {e.error_code})")
except BulkSMSNetworkError as e:
    print(f"Network error: {e}")
except BulkSMSConfigurationError as e:
    print(f"Configuration error: {e}")

Management Commands

Test SMS Functionality

# Test connection
python manage.py test_sms --test-connection

# Check balance
python manage.py test_sms --balance

# Send test SMS
python manage.py test_sms --phone 01712345678 --message "Test message"

# Send test OTP
python manage.py test_sms --phone 01712345678 --otp 123456

Django Integration Examples

In Django Views

from django.shortcuts import render
from django.contrib import messages
from bulksms.client import BulkSMSClient
from bulksms.exceptions import BulkSMSError

def send_notification(request):
    if request.method == 'POST':
        phone = request.POST.get('phone')
        message = request.POST.get('message')
        
        try:
            client = BulkSMSClient()
            response = client.send_sms(phone, message)
            messages.success(request, 'SMS sent successfully!')
        except BulkSMSError as e:
            messages.error(request, f'Failed to send SMS: {e}')
    
    return render(request, 'send_sms.html')

In Django Signals

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User
from bulksms.client import BulkSMSClient

@receiver(post_save, sender=User)
def send_welcome_sms(sender, instance, created, **kwargs):
    if created and instance.profile.phone_number:
        try:
            client = BulkSMSClient()
            client.send_sms(
                instance.profile.phone_number,
                f'Welcome to our platform, {instance.first_name}!'
            )
        except Exception as e:
            # Log error but don't fail user creation
            import logging
            logger = logging.getLogger(__name__)
            logger.error(f"Failed to send welcome SMS: {e}")

With Celery (Async)

from celery import shared_task
from bulksms.client import BulkSMSClient

@shared_task
def send_sms_async(phone_numbers, message):
    """Send SMS asynchronously using Celery."""
    try:
        client = BulkSMSClient()
        response = client.send_sms(phone_numbers, message)
        return {'success': True, 'response': response}
    except Exception as e:
        return {'success': False, 'error': str(e)}

# Usage
send_sms_async.delay(['01712345678'], 'Your order has been confirmed!')

Database Models

The package includes optional Django models for tracking SMS history:

  • SMSMessage: Track individual SMS messages
  • BulkSMSBatch: Track bulk SMS batches
  • SMSTemplate: Store reusable SMS templates
  • APIUsageLog: Log API usage for monitoring
  • SMSBlacklist: Manage blacklisted phone numbers

Using SMS Templates

from bulksms.models import SMSTemplate

# Create a template
template = SMSTemplate.objects.create(
    name='welcome_message',
    template_type='welcome',
    content='Welcome {name}! Your account has been created successfully.'
)

# Use the template
message = template.render(name='John Doe')
client.send_sms('01712345678', message)

Testing

The package includes comprehensive tests. Run them with:

# Install development dependencies
pip install -e ".[dev]"

# Run tests
python -m pytest

# Run tests with coverage
python -m pytest --cov=bulksms

API Reference

BulkSMSClient

Methods

  • send_sms(phone_numbers, message, sender_id=None): Send SMS to one or more recipients
  • send_bulk_sms(messages, sender_id=None): Send different messages to different recipients
  • send_otp(phone_number, otp_code, brand_name, sender_id=None): Send OTP message
  • get_balance(): Check account balance
  • test_connection(): Test API connectivity

Error Codes

The API returns various error codes. The package handles these automatically:

Code Meaning
202 SMS Submitted Successfully
1001 Invalid Number
1002 Sender ID not correct/disabled
1007 Balance Insufficient
1011 User ID not found
1032 IP Not whitelisted

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests for new functionality
  5. Run the test suite
  6. Submit a pull request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Support

For support and questions:

  • Create an issue on GitHub
  • Check the documentation
  • Review the examples in the examples/ directory

Changelog

Version 1.0.0

  • Initial release
  • Basic SMS sending functionality
  • Bulk SMS support
  • OTP message support
  • Error handling and retry logic
  • Django integration
  • Database models for tracking
  • Management commands
  • Comprehensive test suite

Metadata

Release files for Django-BulkSMS-BD 0.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for Django-BulkSMS-BD 0.1.1
File Size Uploaded
django_bulksms_bd-0.1.1.tar.gz 26.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for Django-BulkSMS-BD 0.1.1
File Interpreter ABI Platform
django_bulksms_bd-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 45.6 kB

Release files / django_bulksms_bd-0.1.1.tar.gz

Download URL django_bulksms_bd-0.1.1.tar.gz
Size 26.7 kB
Tags Source
SHA-256 checksum
How to use checksums
5a9f1694b1a2bb8972a197eade23cdec36d9854ad2c10c6793ee324efe391586
BLAKE2b-256 checksum
How to use checksums
9a8e16d6711a44a6f25fe56d3a1f5986f658fc67406e75d510ff57688fe10506
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.11.12

Release files / django_bulksms_bd-0.1.1-py3-none-any.whl

Download URL django_bulksms_bd-0.1.1-py3-none-any.whl
Size 18.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
43e622018717331ca935638350e4170b16ad64d07484725e938dfd2fa27899b5
BLAKE2b-256 checksum
How to use checksums
c7e09d15037b66d4b79c61bbb93df50c8b271f34c1fdf8ee914bb7116e4bccdd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.11.12

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page