GeekProxy и SendGrid
SendGrid сам отправитель, поэтому исходящего прокси в нём нет и не будет. Есть IP Access Management, входящий белый список, который запирает консоль и API на названные вами адреса. Документация Twilio прямо предупреждает: нестатический IP может оставить вас снаружи. В этом гайде мы вносим статический IP GeekProxy в список, пускаем через него curl, Python и официальный SDK и разводим клиентские аккаунты по отдельным профилям браузера.
Что нужно: активный план GeekProxy со статическим IP и данные прокси из кабинета. Настройка занимает минут пятнадцать.
Получить прокси1 Перед началом
Поля для прокси в SendGrid нет нигде. Мы просмотрели документацию по авторизации, SMTP, IP Access Management и двухфакторке. Почта уходит с инфраструктуры SendGrid, что бы вы ни делали у себя. Место прокси перед вашим собственным трафиком в сторону SendGrid, и отсюда три реальных сценария:
- Бэкенд или cron-скрипт, который ходит в
api.sendgrid.comс фиксированного IP, внесённого в IP Access Management - Ваш браузер в клиентском аккаунте SendGrid, у каждого аккаунта свой белый список и свой выделенный IP
- SMTP-клиент, который сдаёт письма на
smtp.sendgrid.netчерез прокси с почтовыми портами. Об этом в разделе 4
Одну вещь стоит усвоить до того, как трогать белый список. Справочник API SendGrid пишет, что список «doesn't automatically include your own IP address», а документация по интерфейсу: отказ добавить свой IP завершает сессию. Сначала статический IP, потом список.
Что понадобится
- Активный план GeekProxy со статическим IP (ISP или датацентр)
- Данные прокси из кабинета: хост, порт, логин, пароль
- Аккаунт SendGrid, прошедший комплаенс. Twilio пишет, что новые аккаунты могут придержать на проверку, доступ открывают в пределах 72 часов после последнего шага верификации
- API-ключ и curl либо Python 3.8 или новее
- Поле Откуда взять
- Протокол HTTP / SOCKS5
- Хост IP или имя шлюза из кабинета
- Порт из кабинета
- Логин из кабинета
- Пароль из кабинета
2 Где взять данные прокси
- Войдите в кабинет GeekProxy
- Откройте план. У планов с оплатой за IP (ISP, датацентр) список адресов, порт, логин и пароль лежат на карточке, а Export отдаёт весь список текстом
- Запишите IP выхода. На статическом плане это тот же хост, к которому вы подключаетесь, и именно его увидит SendGrid
Резидентские планы собирают строку логина в Options и меняют выход. Для беглого взгляда на лендинг годится, для белого списка нет.
3 Статический IP в белый список
Делайте это из браузера, который уже ходит через прокси. Тогда ваш текущий адрес появится в Recent Access Attempts и добавится одним нажатием, без ручного ввода.
- Откройте Settings, затем IP Access Management
- Нажмите Add IP Addresses. Отметьте два подтверждения и нажмите Confirm and Continue
- В Recent Access Attempts нажмите + напротив IP GeekProxy или Add all to form below. Можно и руками: Manually add IPs, поле IP addresses or ranges to add. CIDR-диапазоны принимаются, разделитель запятая, пробел или перенос строки
- Нажмите Add # IPs, затем Save
В списке помещается до 1 000 адресов. Таблица называется Allow Listed IP Addresses, рядом кнопки Disable Allow List, Remove From Allow List и Remove IP. К последней относитесь с уважением.
Удалите собственный IP, и вы «block your access to your account». Twilio возвращает доступ только после подробного подтверждения личности и владения аккаунтом. Поэтому ротируемому прокси или sticky-сессии с таймером на этой странице делать нечего: в день, когда выход сменится, снаружи окажетесь вы.
4 API и SMTP-релей через прокси
API v3 живёт на https://api.sendgrid.com/v3 и ждёт Authorization: Bearer <YOUR_API_KEY_HERE>. Самый дешёвый тестовый вызов чтение профиля:
curl -x http://LOGIN:PASSWORD@IP:PORT \
-H "Authorization: Bearer $SENDGRID_API_KEY" \
https://api.sendgrid.com/v3/user/profile
После -x curl принимает http://, https://, socks4://, socks4a://, socks5:// и socks5h://. Логин и пароль можно вынести в -U LOGIN:PASSWORD, если в пароле есть символы, которые URL не любит.
Python requests
import os, requests
PROXY = "http://LOGIN:PASSWORD@IP:PORT"
proxies = {"http": PROXY, "https": PROXY}
headers = {"Authorization": f"Bearer {os.environ['SENDGRID_API_KEY']}"}
r = requests.get("https://api.sendgrid.com/v3/user/profile",
headers=headers, proxies=proxies, timeout=(5, 30))
print(r.status_code, r.text[:200])
Официальный sendgrid-python
Здесь транспорт другой, и это важно. sendgrid-python зависит от python-http-client, а тот работает через urllib.request и собирает opener через build_opener(). По документации Python ProxyHandler добавляется, когда обнаружены настройки прокси, а по умолчанию он читает <protocol>_proxy из окружения. Так что SDK хватает экспортированного https_proxy. Обратная сторона: urllib не умеет SOCKS, прокси должен быть HTTP.
export https_proxy="http://LOGIN:PASSWORD@IP:PORT" python3 send_hello.py
# send_hello.py, сценарий Hello Email из самого SDK import os, sendgrid sg = sendgrid.SendGridAPIClient(api_key=os.environ["SENDGRID_API_KEY"]) # mail = объект Mail, собранный ровно как в README SDK response = sg.client.mail.send.post(request_body=mail.get()) print(response.status_code) # 202, если письмо принято
SMTP-релей
Часть программ не умеет REST и сдаёт письма на smtp.sendgrid.net. Логин там буквально строка apikey, пароль сам ключ. Twilio перечисляет порты 25, 2525 и 587 для plain и TLS, 465 для SSL и советует TLS на 587. Чтобы протолкнуть такую отправку через прокси, прокси должен пропускать почтовые порты. Из продуктов GeekProxy почтовые порты доступны на Residential Turbo, подробности уточняйте в поддержке. Residential Flex по документации закрывает 25, 465 и 587, так что релеить в SendGrid через него нельзя.
5 Несколько аккаунтов, отдельные профили
Внутри одного аккаунта SendGrid штатный инструмент Subusers: до 15, больше через тикет в поддержку, на планах Pro или Premier API и Advanced Marketing Campaigns. Twilio подаёт их как способ развести транзакционную и маркетинговую почту. Отдельные IP сабюзерам не нужны.
Отдельные IP нужны для разных аккаунтов с разной оплатой, у каждого свой IP Access Management. Дайте каждому клиенту профиль браузера и собственный статический IP GeekProxy, и внесите этот IP в список именно этого клиента. Сессия станет постоянной, а правило от блокировки будет соблюдено.
- Firefox хранит прокси на уровне профиля, включая SOCKS с удалённым DNS. Профиль на клиента самый короткий путь
- Chrome берёт прокси из системы, пока не запущен с
--proxy-server="http://IP:PORT"и отдельной папкой профиля - SOCKS5 с логином и паролем не работает в Chromium-браузерах и Firefox. Документация Chrome прямо говорит: авторизации для SOCKS5 нет. Берите HTTP с логином и паролем или SOCKS5 с белым списком IP в плане GeekProxy
- Включите двухфакторку в каждом аккаунте: Settings, Two-Factor Authentication, по SMS или через приложение. После включения API принимает только API-ключ, Basic-авторизация перестаёт работать
6 Проверка работы
Начните с curl -x http://LOGIN:PASSWORD@IP:PORT https://ipinfo.io/json. IP в ответе должен совпасть с записью в Allow Listed IP Addresses. Затем вызов профиля из раздела 4 через прокси, ждём 200 и JSON.
Третья проверка доказывает, что список реально работает: тот же вызов профиля без -x. Его должны отбить. Пока тестируете, держите сессию через прокси открытой в соседней вкладке, чтобы одна ошибка не оставила вас без входа.
7 Какой продукт GeekProxy подходит
IP Access Management по предупреждению самого Twilio функция для статического IP, поэтому сценарии с API и консолью живут на статическом ISP или выделенном датацентре IPv4: один фиксированный адрес на аккаунт и никакого счётчика трафика на JSON. Residential Turbo нужен только для SMTP-релея, потому что почтовые порты доступны там (подробности в поддержке). Residential Flex закрывает порты отправки, а у мобильных с SendGrid нет документированных преимуществ.
8 Частые проблемы
Заблокировало сразу после включения списка
Добавленный IP не тот, с которого вы ходите, или выход сменился. Документация Twilio ровно это и обещает для нестатического IP. Восстановление идёт через их проверку личности, так что лучше не доводить: добавляйте статический IP GeekProxy из Recent Access Attempts, сидя через него.
API отбивает ключ, который вчера работал
Та же причина со стороны скрипта. Сравните https://ipinfo.io/json через прокси с записью в списке. Sticky-сессия на резидентском плане истекла и переехала.
sendgrid-python не видит SOCKS-прокси
urllib не говорит по SOCKS. Укажите в https_proxy URL со схемой http://. ISP и датацентр-планы GeekProxy отдают HTTP на том же порту.
Basic-авторизация перестала работать
Включена двухфакторка. SendGrid после этого требует для API именно ключ. Создайте его и используйте заголовок Bearer.
Аккаунт на проверке
Стадии: Warned, Suspended (почта держится до 72 часов), Deactivated и Banned. Триггер то, что Twilio называет apparent abnormal activity. Смены IP входа в этом списке нет. Репутация отправки есть, так что чините качество базы, а не сеть.
Статический IP для SendGrid
ISP и датацентр-адреса без ротации, HTTP и SOCKS5, выдача за секунды.
Заказать